Skip to content

Instantly share code, notes, and snippets.

@aertmann
Last active January 13, 2021 13:42
Show Gist options
  • Save aertmann/a300ac4b9abfafd5e026 to your computer and use it in GitHub Desktop.
Save aertmann/a300ac4b9abfafd5e026 to your computer and use it in GitHub Desktop.
Slide support in content collection
<?php
namespace TYPO3\NeosDemoTypo3Org\TypoScript;
use TYPO3\Flow\Annotations as Flow;
use TYPO3\TYPO3CR\Domain\Model\NodeInterface;
/**
* Extended TypoScript implementation to render ContentCollections. Will render needed
* metadata for removed nodes and has support for slide.
*/
class ContentCollectionImplementation extends \TYPO3\Neos\TypoScript\ContentCollectionImplementation {
/**
* Internal cache for the nodePath property.
*
* @var string
*/
protected $nodePath;
/**
* Internal cache for the contentCollectionNode property.
*
* @var NodeInterface
*/
protected $contentCollectionNode;
/**
* Internal cache for the slide property.
*
* @var boolean
*/
protected $slide;
/**
* Returns the identifier of the content collection node which shall be rendered
*
* @return string
*/
public function getNodePath() {
if ($this->nodePath === NULL) {
$this->nodePath = (string)$this->tsValue('nodePath');
}
return $this->nodePath;
}
/**
* @return boolean
*/
public function getSlide() {
if ($this->slide === NULL) {
$this->slide = (boolean)$this->tsValue('slide');
}
return $this->slide;
}
/**
* @return NodeInterface
*/
public function getContentCollectionNode() {
if ($this->contentCollectionNode === NULL) {
$currentContext = $this->tsRuntime->getCurrentContext();
$this->contentCollectionNode = $currentContext['contentCollectionNode'];
}
return $this->contentCollectionNode;
}
/**
* @return array
*/
public function getCollection() {
$contentCollectionNode = $this->getContentCollectionNode();
if ($contentCollectionNode === NULL) {
return array();
}
$collection = $contentCollectionNode->getChildNodes();
if ($contentCollectionNode->getContext()->getWorkspaceName() !== 'live') {
$collection = array_merge($contentCollectionNode->getChildNodes(), $this->getRemovedChildNodes());
}
if (count($collection) === 0 && $this->getSlide() === TRUE) {
$parentsQuery = new \TYPO3\Eel\FlowQuery\FlowQuery(array($contentCollectionNode));
$this->contentCollectionNode = $parentsQuery->parents('[instanceof TYPO3.Neos:Document]')->first()->parent()->children($this->getNodePath())->get(0);
if ($this->contentCollectionNode !== NULL) {
$collection = $this->getCollection();
}
}
return $collection;
}
}
prototype(TYPO3.Neos:ContentCollection).@class = 'TYPO3\\NeosDemoTypo3Org\\TypoScript\\ContentCollectionImplementation'
page.body.content.aside = ContentCollection {
nodePath = 'aside'
slide = ${node.context.workspaceName == 'live' ? true : false}
}
@htuscher
Copy link

I figured out how to do it with the latest refactorings: https://gist.github.com/hhoechtl/c5e5b84261f75a8feac5

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment