/** * If the node is not found, we *first* want to figure out whether the node exists in other dimensions or is really non-existent * * @param $identifier * @param ContentContext $context * @return void */ protected function addExistingNodeVariantInformationToResponse($identifier, ContentContext $context) { $nodeVariants = $context->getNodeVariantsByIdentifier($identifier); if (count($nodeVariants) > 0) { $this->response->setHeader('X-Neos-Node-Exists-In-Other-Dimensions', true); // If the node exists in another dimension, we want to know how many nodes in the rootline are also missing for the target // dimension. This is needed in the UI to tell the user if nodes will be materialized recursively upwards in the rootline. // To find the node path for the given identifier, we just use the first result. This is a safe assumption at least for // "Document" nodes (aggregate=TRUE), because they are always moved in-sync. $node = reset($nodeVariants); /** @var NodeInterface $node */ if ($node->getNodeType()->isAggregate()) { $pathSegmentsToSites = NodePaths::getPathDepth(SiteService::SITES_ROOT_PATH); $pathSegmentsToNodeVariant = NodePaths::getPathDepth($node->getPath()); // Segments between the sites root "/sites" and the node variant (minimum 1) $pathSegments = $pathSegmentsToNodeVariant - $pathSegmentsToSites; // Nodes between (and including) the site root node and the node variant (minimum 1) $siteNodePath = NodePaths::addNodePathSegment(SiteService::SITES_ROOT_PATH, $context->getCurrentSite()->getNodeName()); $nodes = $context->getNodesOnPath($siteNodePath, $node->getPath()); $missingNodesOnRootline = $pathSegments - count($nodes); if ($missingNodesOnRootline > 0) { $this->response->setHeader('X-Neos-Nodes-Missing-On-Rootline', $missingNodesOnRootline); } } } }