diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index b3007f567a..b70111a398 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -14,6 +14,7 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\VisibilityConstraints; use Neos\ContentRepository\Core\SharedModel\Exception\WorkspaceDoesNotExist; +use Neos\ContentRepository\Core\SharedModel\Node\NodeAddress; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Flow\Annotations as Flow; use Neos\Flow\Mvc\Controller\ActionController; @@ -24,6 +25,7 @@ use Neos\Neos\Domain\Service\NodeTypeNameFactory; use Neos\Neos\Domain\Service\WorkspaceNameBuilder; use Neos\Neos\FrontendRouting\NodeAddressFactory; +use Neos\Neos\FrontendRouting\NodeUriBuilderFactory; use Neos\Neos\FrontendRouting\SiteDetection\SiteDetectionResult; use Neos\Neos\Service\UserService; use Neos\Neos\Ui\Domain\InitialData\ConfigurationProviderInterface; @@ -118,6 +120,12 @@ class BackendController extends ActionController */ protected $initialStateProvider; + /** + * @Flow\Inject + * @var NodeUriBuilderFactory + */ + protected $nodeUriBuilderFactory; + /** * Displays the backend interface * @@ -212,15 +220,16 @@ public function indexAction(string $node = null) */ public function redirectToAction(string $node): void { - $siteDetectionResult = SiteDetectionResult::fromRequest($this->request->getHttpRequest()); - - $contentRepository = $this->contentRepositoryRegistry->get($siteDetectionResult->contentRepositoryId); - - $nodeAddress = NodeAddressFactory::create($contentRepository)->createFromUriString($node); $this->response->setHttpHeader('Cache-Control', [ 'no-cache', 'no-store' ]); - $this->redirect('show', 'Frontend\Node', 'Neos.Neos', ['node' => $nodeAddress]); + + $nodeAddress = NodeAddress::fromJsonString($node); + + $this->redirectToUri( + $this->nodeUriBuilderFactory->forActionRequest($this->request) + ->uriFor($nodeAddress) + ); } } diff --git a/Classes/Domain/Model/Changes/AbstractCreate.php b/Classes/Domain/Model/Changes/AbstractCreate.php index 4850a883c0..9e53d245e9 100644 --- a/Classes/Domain/Model/Changes/AbstractCreate.php +++ b/Classes/Domain/Model/Changes/AbstractCreate.php @@ -169,10 +169,13 @@ protected function createNode( $contentRepository->handle($command); } - /** @var Node $newlyCreatedNode */ $newlyCreatedNode = $this->contentRepositoryRegistry->subgraphForNode($parentNode) ->findNodeById($nodeAggregateId); + if (!$newlyCreatedNode) { + throw new \RuntimeException(sprintf('Node %s was not created successfully or the graph was not up to date.', $nodeAggregateId->value)); + } + $this->finish($newlyCreatedNode); // NOTE: we need to run "finish" before "addNodeCreatedFeedback" // to ensure the new node already exists when the last feedback is processed diff --git a/Classes/Domain/Model/Feedback/Operations/Redirect.php b/Classes/Domain/Model/Feedback/Operations/Redirect.php index bb4812cb93..43e25d3f3c 100644 --- a/Classes/Domain/Model/Feedback/Operations/Redirect.php +++ b/Classes/Domain/Model/Feedback/Operations/Redirect.php @@ -2,12 +2,14 @@ namespace Neos\Neos\Ui\Domain\Model\Feedback\Operations; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; +use Neos\ContentRepository\Core\SharedModel\Node\NodeAddress; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Flow\Annotations as Flow; use Neos\Flow\Mvc\Controller\ControllerContext; use Neos\Neos\Domain\NodeLabel\NodeLabelGeneratorInterface; use Neos\Neos\FrontendRouting\NodeAddressFactory; -use Neos\Neos\Service\LinkingService; +use Neos\Neos\FrontendRouting\NodeUriBuilderFactory; +use Neos\Neos\FrontendRouting\Options; use Neos\Neos\Ui\Domain\Model\AbstractFeedback; use Neos\Neos\Ui\Domain\Model\FeedbackInterface; @@ -35,9 +37,9 @@ class Redirect extends AbstractFeedback /** * @Flow\Inject - * @var LinkingService + * @var NodeUriBuilderFactory */ - protected $linkingService; + protected $nodeUriBuilderFactory; /** * Set the node @@ -104,12 +106,18 @@ public function isSimilarTo(FeedbackInterface $feedback) public function serializePayload(ControllerContext $controllerContext): array { $node = $this->getNode(); - $redirectUri = $this->linkingService->createNodeUri($controllerContext, $node, null, null, true); + + $redirectUri = $this->nodeUriBuilderFactory->forActionRequest($controllerContext->getRequest()) + ->uriFor( + NodeAddress::fromNode($node), + Options::createForceAbsolute() + ); + $contentRepository = $this->contentRepositoryRegistry->get($node->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); return [ - 'redirectUri' => $redirectUri, + 'redirectUri' => (string)$redirectUri, 'redirectContextPath' => $nodeAddressFactory->createFromNode($node)->serializeForUri(), ]; } diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index a4c12ba0c9..58ea929938 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -15,7 +15,9 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\CountAncestorNodesFilter; use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\FindChildNodesFilter; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; +use Neos\ContentRepository\Core\SharedModel\Node\NodeAddress; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateClassification; +use Neos\ContentRepository\Core\SharedModel\Workspace\WorkspaceName; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Eel\ProtectedContextAwareInterface; use Neos\Flow\Annotations as Flow; @@ -23,9 +25,8 @@ use Neos\Flow\Mvc\Routing\UriBuilder; use Neos\Flow\Persistence\PersistenceManagerInterface; use Neos\Neos\Domain\NodeLabel\NodeLabelGeneratorInterface; -use Neos\Neos\FrontendRouting\NodeAddress; use Neos\Neos\FrontendRouting\NodeAddressFactory; -use Neos\Neos\FrontendRouting\NodeUriBuilder; +use Neos\Neos\FrontendRouting\NodeUriBuilderFactory; use Neos\Neos\Ui\Domain\Service\NodePropertyConverterService; use Neos\Neos\Ui\Domain\Service\UserLocaleService; use Neos\Neos\Utility\NodeTypeWithFallbackProvider; @@ -42,6 +43,9 @@ class NodeInfoHelper implements ProtectedContextAwareInterface #[Flow\Inject] protected ContentRepositoryRegistry $contentRepositoryRegistry; + #[Flow\Inject] + protected NodeUriBuilderFactory $nodeUriBuilderFactory; + #[Flow\Inject] protected NodeLabelGeneratorInterface $nodeLabelGenerator; @@ -342,42 +346,33 @@ public function defaultNodesForBackend( ]; } - public function uri(Node|NodeAddress $nodeAddress, ActionRequest $actionRequest): string - { - if ($nodeAddress instanceof Node) { - $contentRepository = $this->contentRepositoryRegistry->get($nodeAddress->contentRepositoryId); - $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - $nodeAddress = $nodeAddressFactory->createFromNode($nodeAddress); - } - $uriBuilder = new UriBuilder(); - $uriBuilder->setRequest($actionRequest); - $uriBuilder->setCreateAbsoluteUri(true); - return (string)NodeUriBuilder::fromUriBuilder($uriBuilder)->uriFor($nodeAddress); - } - public function previewUri(Node $node, ActionRequest $actionRequest): string { - $contentRepository = $this->contentRepositoryRegistry->get($node->contentRepositoryId); - $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - $nodeAddress = $nodeAddressFactory->createFromNode($node); - - $uriBuilder = new UriBuilder(); - $uriBuilder->setRequest($actionRequest); - $uriBuilder->setCreateAbsoluteUri(true); - return (string)NodeUriBuilder::fromUriBuilder($uriBuilder)->previewUriFor($nodeAddress); + $nodeAddress = NodeAddress::fromNode($node); + return (string)$this->nodeUriBuilderFactory + ->forActionRequest($actionRequest) + ->previewUriFor($nodeAddress); } 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); - $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - $nodeAddress = $nodeAddressFactory->createFromNode($node); + $workspace = $contentRepository->getWorkspaceFinder()->findOneByName($node->workspaceName); + + $nodeAddress = NodeAddress::create( + $node->contentRepositoryId, + $workspace->baseWorkspaceName ?? WorkspaceName::forLive(), + $node->dimensionSpacePoint, + $node->aggregateId + ); + $uriBuilder = new UriBuilder(); $uriBuilder->setRequest($actionRequest); return $uriBuilder ->setCreateAbsoluteUri(true) ->setFormat('html') - ->uriFor('redirectTo', ['node' => $nodeAddress->serializeForUri()], 'Backend', 'Neos.Neos.Ui'); + ->uriFor('redirectTo', ['node' => $nodeAddress->toJson()], 'Backend', 'Neos.Neos.Ui'); } /** @@ -441,7 +436,7 @@ public function allowsCallOfMethod($methodName) 'createRedirectToNode', 'renderNodeWithPropertiesAndChildrenInformation', 'defaultNodesForBackend', - 'uri' + 'previewUri' ], true); } } diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml index 52e238d220..cd0906c98a 100644 --- a/Configuration/Settings.yaml +++ b/Configuration/Settings.yaml @@ -136,7 +136,7 @@ Neos: personalWorkspace: '${Neos.Ui.Workspace.getPersonalWorkspace(documentNode.contentRepositoryId)}' ui: contentCanvas: - src: '${Neos.Ui.NodeInfo.uri(documentNode, request)}' + src: '${Neos.Ui.NodeInfo.previewUri(documentNode, request)}' backgroundColor: '${Configuration.setting(''Neos.Neos.Ui.contentCanvas.backgroundColor'')}' debugMode: false editPreviewMode: '${q(user).property("preferences.preferences")["contentEditing.editPreviewMode"] || Configuration.setting(''Neos.Neos.userInterface.defaultEditPreviewMode'')}'