Tech-Wissen

Neos FlowQuery in PHP verwenden

Für die automatisierte Erstellung oder Bearbeitung von Neos Nodes, benötigt man diese zunächst einmal in PHP. Auch hier lässt sich Neos FlowQuery einsetzen, um Nodes zu selektieren.

Der Context

Um Nodes in Neos zu finden, brauchen wir zunächst einen Context. Dieser enthält alle Grundinformationen wie zum Beispiel den Workspace, Dimensions und Sichtbarkeit der Nodes. Um einen solchen Context zu bekommen, kann die Factory(\Neos\ContentRepository\Domain\Service\ContextFactoryInterface) verwendet werden:

$context = $this->contextFactory->create(
	[
             'workspaceName' => 'live',
             'currentDateTime' => new \Neos\Flow\Utility\Now(),
             'dimensions' => array(),
             'invisibleContentShown' => FALSE,
             'removedContentShown' => FALSE,
             'inaccessibleContentShown' => FALSE
	]
);

Das hier in der create() Methode angegebene Array mit Context Parametern ist nicht zwingend erforderlich und zeigt die Standardwerte auf. So können auch einzelne Parameter (wie zum Beispiel nur der workspaceName) überschrieben werden.

Nodes mit FlowQuery finden

Wie in Fusion brauchen wir in PHP auch eine Basis-Node, von der ausgehend wir dann weitere Nodes finden können. Entweder wir bekommen diese schon an die Methode übergeben, oder wir holen sie halt aus dem Context:

class MyPHPClass {

	/**
	* @Flow\Inject
	* @var Neos\ContentRepository\Domain\Service\ContextFactoryInterface
	*/
	protected $contextFactory;

	public function doSomething()
	{
		$context = $this->contextFactory->create(); //Erstellt einen Context mit den Standard parametern

		//Equivalent zu  `nodes = ${q(site).find('[instanceof Vendor.Package:NodeType]').sort('date', 'DESC').get()}` in fusion
		$q = new FlowQuery([$context->getCurrentSiteNode()]);
		$nodes = $q->find('[instanceof Vendor.Package:NodeType]')->sort('date', 'DESC')->get()
	}
}

Wie im Beispiel zu sehen, können wir alle FlowQuery-Operationen wie in Fusion benutzen. Der einzige Unterschied liegt in der Schreibweise bei der Verkettung der Operationen. Hier wird der PHP-übliche arrow operator (->) anstelle der Punktnotation verwendet.

Anstelle von $context->getCurrentSiteNode() kann natürlich auch jegliche andere Instanz von \Neos\ContentRepository\Domain\Model\NodeInterface verwendet werden.

Impulsgespräch

Kostenloses Impulsgespräch

Mirko Kaufmann

Ihr Ansprechpartner:
Mirko Kaufmann

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

Nach oben