From 7987d414681fe843dc2d6aa0fb2bf4f5d2afd7da Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Mon, 14 Oct 2024 10:55:58 +0200 Subject: [PATCH] TASK: Fix hidden state evaluation The Neos 8.3 LinkingService contained this logic ``` $action = $node->getContext()->getWorkspace()->isPublicWorkspace() && !$node->isHidden() ? 'show' : 'preview'; ``` ensuring that disabled nodes can still be previewed. In Neos 9 a no route matched error will be thrown. To restore the old behaviour we evaluate the hidden state --- Classes/Controller/BackendController.php | 26 ++++++++++++++++++++++-- Classes/Fusion/Helper/NodeInfoHelper.php | 11 +--------- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index 60dfb5b8dc..dde36a1242 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -12,9 +12,11 @@ * source code. */ +use Neos\ContentRepository\Core\Feature\SubtreeTagging\Dto\SubtreeTag; use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; use Neos\ContentRepository\Core\SharedModel\Node\NodeAddress; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Flow\Annotations as Flow; use Neos\Flow\Mvc\Controller\ActionController; @@ -226,9 +228,29 @@ public function redirectToAction(string $node): void $nodeAddress = NodeAddress::fromJsonString($node); + $contentRepository = $this->contentRepositoryRegistry->get($nodeAddress->contentRepositoryId); + + $nodeInstance = $contentRepository->getContentGraph($nodeAddress->workspaceName)->getSubgraph( + $nodeAddress->dimensionSpacePoint, + VisibilityConstraints::withoutRestrictions() + )->findNodeById($nodeAddress->aggregateId); + + // we always want to redirect to the node in the base workspace. + $workspace = $contentRepository->getWorkspaceFinder()->findOneByName($nodeAddress->workspaceName); + + $nodeAddressInBaseWorkspace = NodeAddress::create( + $nodeAddress->contentRepositoryId, + $workspace->baseWorkspaceName ?? WorkspaceName::forLive(), + $nodeAddress->dimensionSpacePoint, + $nodeAddress->aggregateId + ); + + $nodeUriBuilder = $this->nodeUriBuilderFactory->forActionRequest($this->request); + $this->redirectToUri( - $this->nodeUriBuilderFactory->forActionRequest($this->request) - ->uriFor($nodeAddress) + $nodeInstance->tags->contain(SubtreeTag::disabled()) + ? $nodeUriBuilder->previewUriFor($nodeAddressInBaseWorkspace) + : $nodeUriBuilder->uriFor($nodeAddressInBaseWorkspace) ); } } diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index 225a968604..44ac7f22ad 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -356,16 +356,7 @@ public function previewUri(Node $node, ActionRequest $actionRequest): string public function createRedirectToNode(Node $node, ActionRequest $actionRequest): string { - // we always want to redirect to the node in the base workspace. - $contentRepository = $this->contentRepositoryRegistry->get($node->contentRepositoryId); - $workspace = $contentRepository->getWorkspaceFinder()->findOneByName($node->workspaceName); - - $nodeAddress = NodeAddress::create( - $node->contentRepositoryId, - $workspace->baseWorkspaceName ?? WorkspaceName::forLive(), - $node->dimensionSpacePoint, - $node->aggregateId - ); + $nodeAddress = NodeAddress::fromNode($node); $uriBuilder = new UriBuilder(); $uriBuilder->setRequest($actionRequest);