/**
* {@inheritdoc}
*/
public function createRedirectsForPublishedNode(NodeInterface $node, Workspace $targetWorkspace)
{
$nodeType = $node->getNodeType();
if ($targetWorkspace->getName() !== 'live' || !$nodeType->isOfType('Neos.Neos:Document')) {
return;
}
$context = $this->contextFactory->create(['workspaceName' => 'live', 'invisibleContentShown' => true, 'dimensions' => $node->getContext()->getDimensions()]);
$targetNode = $context->getNodeByIdentifier($node->getIdentifier());
if ($targetNode === null) {
// The page has been added
return;
}
$targetNodeUriPath = $this->buildUriPathForNodeContextPath($targetNode->getContextPath());
if ($targetNodeUriPath === null) {
throw new Exception('The target URI path of the node could not be resolved', 1451945358);
}
$hosts = $this->getHostnames($node->getContext());
// The page has been removed
if ($node->isRemoved()) {
$this->flushRoutingCacheForNode($targetNode);
$statusCode = (int) $this->defaultStatusCode['gone'];
$this->redirectStorage->addRedirect($targetNodeUriPath, '', $statusCode, $hosts);
return;
}
// compare the "old" node URI to the new one
$nodeUriPath = $this->buildUriPathForNodeContextPath($node->getContextPath());
// use the same regexp than the ContentContextBar Ember View
$nodeUriPath = preg_replace('/@[A-Za-z0-9;&,\\-_=]+/', '', $nodeUriPath);
if ($nodeUriPath === null || $nodeUriPath === $targetNodeUriPath) {
// The page node path has not been changed
return;
}
$this->flushRoutingCacheForNode($targetNode);
$statusCode = (int) $this->defaultStatusCode['redirect'];
$this->redirectStorage->addRedirect($targetNodeUriPath, $nodeUriPath, $statusCode, $hosts);
$q = new FlowQuery([$node]);
foreach ($q->children('[instanceof Neos.Neos:Document]') as $childrenNode) {
$this->createRedirectsForPublishedNode($childrenNode, $targetWorkspace);
}
}