/** * Get a node by identifier and this context * * @param string $identifier The identifier of a node * @return \TYPO3\TYPO3CR\Domain\Model\NodeInterface The node with the given identifier or NULL if no such node exists */ public function getNodeByIdentifier($identifier) { $node = $this->firstLevelNodeCache->getByIdentifier($identifier); if ($node !== FALSE) { return $node; } $nodeData = $this->nodeDataRepository->findOneByIdentifier($identifier, $this->getWorkspace(FALSE), $this->dimensions); if ($nodeData !== NULL) { $node = $this->nodeFactory->createFromNodeData($nodeData, $this); } else { $node = NULL; } $this->firstLevelNodeCache->setByIdentifier($identifier, $node); return $node; }
/** * Adopts a node from a (possibly) different context to this context * * Checks if a node variant matching the exact dimensions already exists for this context and * return it if found. Otherwise a new node variant for this context is created. * * In case the node already exists in the context but does not match the target dimensions a * new, more specific node is created and returned. * * @param NodeInterface $node The node with a different context. If the context of the given node is the same as this context the operation will have no effect. * @param boolean $recursive If TRUE also adopt all descendant nodes which are non-aggregate * @return NodeInterface A new or existing node that matches this context */ public function adoptNode(NodeInterface $node, $recursive = false) { if ($node->getContext() === $this && $node->dimensionsAreMatchingTargetDimensionValues()) { return $node; } $this->emitBeforeAdoptNode($node, $this, $recursive); $existingNode = $this->getNodeByIdentifier($node->getIdentifier()); if ($existingNode !== null) { if ($existingNode->dimensionsAreMatchingTargetDimensionValues()) { $adoptedNode = $existingNode; } else { $adoptedNode = $existingNode->createVariantForContext($this); } } else { $adoptedNode = $node->createVariantForContext($this); } $this->firstLevelNodeCache->setByIdentifier($adoptedNode->getIdentifier(), $adoptedNode); if ($recursive) { $childNodes = $node->getChildNodes(); /** @var NodeInterface $childNode */ foreach ($childNodes as $childNode) { if (!$childNode->getNodeType()->isAggregate()) { $this->adoptNode($childNode, true); } } } $this->emitAfterAdoptNode($node, $this, $recursive); return $adoptedNode; }