Tech-Wissen

Neos Nodes in PHP erstellen

Vor allem beim Import oder der Migration von Inhalten zu Neos, ist es oft notwendig neue Nodes via PHP zu erstellen. So lassen sich auf einfachstem Weg neue Seiten oder Inhaltselemente in Neos erstellen.

Das Eltern-Element via FlowQuery ermitteln

Unabhänig vom Typ der zu erstellenden Node, müssen wir erstmal wissen wohin unsere neue Node überhaupt kommt. Am einfachsten finden wir unsere "Eltern-Node" mit FlowQuery. Wie das in PHP funktioniert, haben wir ebenfalls schon beschrieben.

Kennen wir den Identifier des Elternelements schon, können wir das ganze aber auch noch ein wenig einfacher machen:

/** @var Neos\ContentRepository\Domain\Service\ContextFactoryInterface $contextFactory **/

$context = $contextFactory->create();
$parentNode = $context->getNodeByIdentifier('9da83e66-0746-4a6d-b1e1-84325a7733b7');

Wenn $parentNode nun eine Seite ist, wir aber die ContentCollection brauchen (um Inhaltselemente hinzuzufügen), kommen wir auch da ganze einfach dran:

$contentCollection = $parentNode->getPrimaryChildNode();

Node-Template erstellen

Als nächstes erstellen wir uns eine Art Bauplan für die neue Node. Der "Bauplan" heißt NodeTemplate und existiert als Klasse im Neos.ContentRepository Package. Das NodeTemplate verhält sich fast genauso wie eine bereits erstellte Node:

$nodeTemplate = new \Neos\ContentRepository\Domain\Model\NodeTemplate();

/** @var \Neos\ContentRepository\Domain\Service\NodeTypeManager $nodeTypeManger **/
$nodeTemplate->setNodeType($nodeTypeManager->getNodeType('Vendor.Package:NodeType'));
$nodeTemplate->setProperty('propertyName','Value');
$nodeTemplate->setProperty('date', new \DateTime());

Ist das Template dann fertig, können wir damit einfach unterhalb des ElternElements eine neue Node erstellen. Das wars dann auch schon.

//$contentCollection anstelle von $parentNode, wenn es ein Content-Element ist
$newNode = $parentNode->createNodeFromTemplate($nodeTemplate);

URL-Pfad Segment für Seiten

Handelt es sich bei der erstellten Node um eine Seite, bekommt diese zunächst einen etwas kryptischen Pfad in der URL. (z.B. node-hsio9dgk334yh)

Natürlich können wir den Pfad schon im NodeTemplate schon setzen. Dafür muss die property uriPathSegment einfach mit einem belibigen URL-String gefüllt werden.

Einfacher ist es jedoch, Neos diese Aufgabe übernehmen zu lassen. Das CMS generiert dann anhand des Seiten-Titels eine passende URI. Allerdings funktioniert dies erst, wenn die Node schon erstellt ist:

/** @var \Neos\Neos\Utility\NodeUriPathSegmentGenerator $uriPathGenerator **/
$uriPathSegment = $uriPathGenerator->generateUriPathSegment($newNode);
$newNode->setProperty('uriPathSegment', $uriPathSegment);
Impulsgespräch

Kostenloses Impulsgespräch

Mirko Kaufmann

Ihr Ansprechpartner:
Mirko Kaufmann

info@kaufmann.digital
T: +49-5771-8438930

Nach oben