From e9648c679a045014ab4d2a4ebe47a376a50c62f0 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 18:48:58 +0100 Subject: [PATCH 1/8] TASK: Remove unused `Neos.Ui.NodeInfo.renderDocumentNodeAndChildContent` --- Classes/Fusion/Helper/NodeInfoHelper.php | 34 ------------------------ 1 file changed, 34 deletions(-) diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index 980364e2ec..c5e1c00408 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -348,40 +348,6 @@ public function renderNodesWithParents(array $nodes, ControllerContext $controll return array_values($renderedNodes); } - /** - * @param Node $documentNode - * @param ControllerContext $controllerContext - * @return array> - */ - public function renderDocumentNodeAndChildContent( - Node $documentNode, - ControllerContext $controllerContext - ): array { - return $this->renderNodeAndChildContent($documentNode, $controllerContext); - } - - /** - * @return array> - */ - protected function renderNodeAndChildContent(Node $node, ControllerContext $controllerContext): array - { - $reducer = function ($nodes, $node) use ($controllerContext) { - return array_merge($nodes, $this->renderNodeAndChildContent($node, $controllerContext)); - }; - - $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); - $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - - return array_reduce( - iterator_to_array($this->getChildNodes($node, $this->buildContentChildNodeFilterString())), - $reducer, - [ - $nodeAddressFactory->createFromNode($node)->serializeForUri() - => $this->renderNodeWithPropertiesAndChildrenInformation($node, $controllerContext) - ] - ); - } - /** * @return array|null> */ From c7aa67be50628c784da13d65e2d3a8b3dd7bbe17 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:03:56 +0100 Subject: [PATCH 2/8] TASK: Avoid use of `ControllerContext` in NodeInfoHelper --- .../Controller/BackendServiceController.php | 6 +- .../Feedback/Operations/ReloadDocument.php | 2 +- .../Feedback/Operations/UpdateNodeInfo.php | 9 ++- .../Operations/UpdateNodePreviewUrl.php | 2 +- Classes/Fusion/Helper/NodeInfoHelper.php | 74 ++++++++----------- Configuration/Settings.yaml | 8 +- 6 files changed, 45 insertions(+), 56 deletions(-) diff --git a/Classes/Controller/BackendServiceController.php b/Classes/Controller/BackendServiceController.php index 5e056a933a..816eab2273 100644 --- a/Classes/Controller/BackendServiceController.php +++ b/Classes/Controller/BackendServiceController.php @@ -590,15 +590,15 @@ public function flowQueryAction(array $chain): string $nodeInfoHelper = new NodeInfoHelper(); $type = $finisher['type'] ?? null; $result = match ($type) { - 'get' => $nodeInfoHelper->renderNodes(array_filter($flowQuery->get()), $this->getControllerContext()), + 'get' => $nodeInfoHelper->renderNodes(array_filter($flowQuery->get()), $this->request), 'getForTree' => $nodeInfoHelper->renderNodes( array_filter($flowQuery->get()), - $this->getControllerContext(), + $this->request, true ), 'getForTreeWithParents' => $nodeInfoHelper->renderNodesWithParents( array_filter($flowQuery->get()), - $this->getControllerContext() + $this->request ), default => [] }; diff --git a/Classes/Domain/Model/Feedback/Operations/ReloadDocument.php b/Classes/Domain/Model/Feedback/Operations/ReloadDocument.php index 232f562cdc..d8baa8a431 100644 --- a/Classes/Domain/Model/Feedback/Operations/ReloadDocument.php +++ b/Classes/Domain/Model/Feedback/Operations/ReloadDocument.php @@ -80,7 +80,7 @@ public function serializePayload(ControllerContext $controllerContext): array if ($documentNode) { return [ - 'uri' => $nodeInfoHelper->previewUri($documentNode, $controllerContext) + 'uri' => $nodeInfoHelper->previewUri($documentNode, $controllerContext->getRequest()) ]; } diff --git a/Classes/Domain/Model/Feedback/Operations/UpdateNodeInfo.php b/Classes/Domain/Model/Feedback/Operations/UpdateNodeInfo.php index 3fa70b4a91..a2cccf9b29 100644 --- a/Classes/Domain/Model/Feedback/Operations/UpdateNodeInfo.php +++ b/Classes/Domain/Model/Feedback/Operations/UpdateNodeInfo.php @@ -13,6 +13,7 @@ use Neos\ContentRepository\Core\Projection\ContentGraph\Filter\FindChildNodesFilter; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; +use Neos\Flow\Mvc\ActionRequest; use Neos\Neos\FrontendRouting\NodeAddressFactory; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Flow\Annotations as Flow; @@ -106,7 +107,7 @@ public function serializePayload(ControllerContext $controllerContext): array { return $this->node ? [ - 'byContextPath' => $this->serializeNodeRecursively($this->node, $controllerContext) + 'byContextPath' => $this->serializeNodeRecursively($this->node, $controllerContext->getRequest()) ] : []; } @@ -116,7 +117,7 @@ public function serializePayload(ControllerContext $controllerContext): array * * @return array> */ - private function serializeNodeRecursively(Node $node, ControllerContext $controllerContext): array + private function serializeNodeRecursively(Node $node, ActionRequest $actionRequest): array { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); @@ -125,14 +126,14 @@ private function serializeNodeRecursively(Node $node, ControllerContext $control $nodeAddressFactory->createFromNode($node)->serializeForUri() => $this->nodeInfoHelper->renderNodeWithPropertiesAndChildrenInformation( $node, - $controllerContext + $actionRequest ) ]; if ($this->isRecursive === true) { $subgraph = $this->contentRepositoryRegistry->subgraphForNode($node); foreach ($subgraph->findChildNodes($node->nodeAggregateId, FindChildNodesFilter::create()) as $childNode) { - $result = array_merge($result, $this->serializeNodeRecursively($childNode, $controllerContext)); + $result = array_merge($result, $this->serializeNodeRecursively($childNode, $actionRequest)); } } diff --git a/Classes/Domain/Model/Feedback/Operations/UpdateNodePreviewUrl.php b/Classes/Domain/Model/Feedback/Operations/UpdateNodePreviewUrl.php index 9c5110a0be..618f1739ca 100644 --- a/Classes/Domain/Model/Feedback/Operations/UpdateNodePreviewUrl.php +++ b/Classes/Domain/Model/Feedback/Operations/UpdateNodePreviewUrl.php @@ -106,7 +106,7 @@ public function serializePayload(ControllerContext $controllerContext): array $nodeInfoHelper = new NodeInfoHelper(); $contentRepository = $this->contentRepositoryRegistry->get($this->node->subgraphIdentity->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - $newPreviewUrl = $nodeInfoHelper->createRedirectToNode($this->node, $controllerContext); + $newPreviewUrl = $nodeInfoHelper->createRedirectToNode($this->node, $controllerContext->getRequest()); $contextPath = $nodeAddressFactory->createFromNode($this->node)->serializeForUri(); } return [ diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index c5e1c00408..bfa99ba0bb 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -14,13 +14,14 @@ 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\Projection\ContentGraph\Nodes; use Neos\ContentRepository\Core\Projection\NodeHiddenState\NodeHiddenStateFinder; use Neos\ContentRepository\Core\SharedModel\Node\NodeAggregateClassification; use Neos\ContentRepositoryRegistry\ContentRepositoryRegistry; use Neos\Eel\ProtectedContextAwareInterface; use Neos\Flow\Annotations as Flow; +use Neos\Flow\Mvc\ActionRequest; use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\Routing\UriBuilder; use Neos\Flow\Persistence\PersistenceManagerInterface; use Neos\Neos\FrontendRouting\NodeAddress; use Neos\Neos\FrontendRouting\NodeAddressFactory; @@ -89,12 +90,12 @@ public function renderNode( return ($omitMostPropertiesForTreeState ? $this->renderNodeWithMinimalPropertiesAndChildrenInformation( $node, - $controllerContext, + $controllerContext?->getRequest(), $nodeTypeFilterOverride ) : $this->renderNodeWithPropertiesAndChildrenInformation( $node, - $controllerContext, + $controllerContext?->getRequest(), $nodeTypeFilterOverride ) ); @@ -105,7 +106,7 @@ public function renderNode( */ public function renderNodeWithMinimalPropertiesAndChildrenInformation( Node $node, - ControllerContext $controllerContext = null, + ActionRequest $actionRequest = null, string $nodeTypeFilterOverride = null ): ?array { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); @@ -131,8 +132,8 @@ public function renderNodeWithMinimalPropertiesAndChildrenInformation( //'_hiddenAfterDateTime' => $node->getHiddenAfterDateTime() instanceof \DateTimeInterface, ]; - if ($controllerContext !== null) { - $nodeInfo = array_merge($nodeInfo, $this->getUriInformation($node, $controllerContext)); + if ($actionRequest !== null) { + $nodeInfo = array_merge($nodeInfo, $this->getUriInformation($node, $actionRequest)); } $baseNodeType = $nodeTypeFilterOverride ?: $this->baseNodeType; @@ -153,7 +154,7 @@ public function renderNodeWithMinimalPropertiesAndChildrenInformation( */ public function renderNodeWithPropertiesAndChildrenInformation( Node $node, - ControllerContext $controllerContext = null, + ActionRequest $actionRequest = null, string $nodeTypeFilterOverride = null ): ?array { /** @todo implement custom node policy service @@ -167,8 +168,8 @@ public function renderNodeWithPropertiesAndChildrenInformation( $nodeInfo['properties'] = $this->nodePropertyConverterService->getPropertiesArray($node); $nodeInfo['isFullyLoaded'] = true; - if ($controllerContext !== null) { - $nodeInfo = array_merge($nodeInfo, $this->getUriInformation($node, $controllerContext)); + if ($actionRequest !== null) { + $nodeInfo = array_merge($nodeInfo, $this->getUriInformation($node, $actionRequest)); } $baseNodeType = $nodeTypeFilterOverride ? $nodeTypeFilterOverride : $this->baseNodeType; @@ -183,16 +184,15 @@ public function renderNodeWithPropertiesAndChildrenInformation( * Get the "uri" and "previewUri" for the given node * * @param Node $node - * @param ControllerContext $controllerContext * @return array */ - protected function getUriInformation(Node $node, ControllerContext $controllerContext): array + protected function getUriInformation(Node $node, ActionRequest $actionRequest): array { $nodeInfo = []; if (!$this->getNodeType($node)->isOfType($this->documentNodeTypeRole)) { return $nodeInfo; } - $nodeInfo['uri'] = $this->previewUri($node, $controllerContext); + $nodeInfo['uri'] = $this->previewUri($node, $actionRequest); return $nodeInfo; } @@ -275,16 +275,14 @@ protected function renderChildrenInformation(Node $node, string $nodeTypeFilterS */ public function renderNodes( array $nodes, - ControllerContext $controllerContext, + ActionRequest $actionRequest, bool $omitMostPropertiesForTreeState = false ): array { - $methodName = $omitMostPropertiesForTreeState - ? 'renderNodeWithMinimalPropertiesAndChildrenInformation' - : 'renderNodeWithPropertiesAndChildrenInformation'; - $mapper = function (Node $node) use ($controllerContext, $methodName) { - return $this->$methodName($node, $controllerContext); + $mapper = function (Node $node) use ($actionRequest, $omitMostPropertiesForTreeState) { + return $omitMostPropertiesForTreeState + ? $this->renderNodeWithMinimalPropertiesAndChildrenInformation($node, $actionRequest) + : $this->renderNodeWithPropertiesAndChildrenInformation($node, $actionRequest); }; - return array_values(array_filter(array_map($mapper, $nodes))); } @@ -292,7 +290,7 @@ public function renderNodes( * @param array> $nodes * @return array> */ - public function renderNodesWithParents(array $nodes, ControllerContext $controllerContext): array + public function renderNodesWithParents(array $nodes, ActionRequest $actionRequest): array { // For search operation we want to include all nodes, not respecting the "baseNodeType" setting $baseNodeTypeOverride = $this->documentNodeTypeRole; @@ -306,7 +304,7 @@ public function renderNodesWithParents(array $nodes, ControllerContext $controll $renderedNodes[$node->nodeAggregateId->value]['matched'] = true; } elseif ($renderedNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation( $node, - $controllerContext, + $actionRequest, $baseNodeTypeOverride )) { $renderedNode['matched'] = true; @@ -328,7 +326,7 @@ public function renderNodesWithParents(array $nodes, ControllerContext $controll } else { $renderedParentNode = $this->renderNodeWithMinimalPropertiesAndChildrenInformation( $parentNode, - $controllerContext, + $actionRequest, $baseNodeTypeOverride ); if ($renderedParentNode) { @@ -354,7 +352,7 @@ public function renderNodesWithParents(array $nodes, ControllerContext $controll public function defaultNodesForBackend( Node $site, Node $documentNode, - ControllerContext $controllerContext + ActionRequest $actionRequest ): array { // does not support multiple CRs here yet $contentRepository = $this->contentRepositoryRegistry->get($site->subgraphIdentity->contentRepositoryId); @@ -362,37 +360,38 @@ public function defaultNodesForBackend( return [ ($nodeAddressFactory->createFromNode($site)->serializeForUri()) - => $this->renderNodeWithPropertiesAndChildrenInformation($site, $controllerContext), + => $this->renderNodeWithPropertiesAndChildrenInformation($site, $actionRequest), ($nodeAddressFactory->createFromNode($documentNode)->serializeForUri()) - => $this->renderNodeWithPropertiesAndChildrenInformation($documentNode, $controllerContext) + => $this->renderNodeWithPropertiesAndChildrenInformation($documentNode, $actionRequest) ]; } - public function uri(Node|NodeAddress $nodeAddress, ControllerContext $controllerContext): string + public function uri(Node|NodeAddress $nodeAddress, ActionRequest $actionRequest): string { if ($nodeAddress instanceof Node) { $contentRepository = $this->contentRepositoryRegistry->get($nodeAddress->subgraphIdentity->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); $nodeAddress = $nodeAddressFactory->createFromNode($nodeAddress); } - return (string)NodeUriBuilder::fromRequest($controllerContext->getRequest())->uriFor($nodeAddress); + return (string)NodeUriBuilder::fromRequest($actionRequest)->uriFor($nodeAddress); } - public function previewUri(Node $node, ControllerContext $controllerContext): string + public function previewUri(Node $node, ActionRequest $actionRequest): string { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); $nodeAddress = $nodeAddressFactory->createFromNode($node); - return (string)NodeUriBuilder::fromRequest($controllerContext->getRequest())->previewUriFor($nodeAddress); + return (string)NodeUriBuilder::fromRequest($actionRequest)->previewUriFor($nodeAddress); } - public function createRedirectToNode(Node $node, ControllerContext $controllerContext): string + public function createRedirectToNode(Node $node, ActionRequest $actionRequest): string { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); $nodeAddressFactory = NodeAddressFactory::create($contentRepository); $nodeAddress = $nodeAddressFactory->createFromNode($node); - return $controllerContext->getUriBuilder() - ->reset() + $uriBuilder = new UriBuilder(); + $uriBuilder->setRequest($actionRequest); + return $uriBuilder ->setCreateAbsoluteUri(true) ->setFormat('html') ->uriFor('redirectTo', ['node' => $nodeAddress->serializeForUri()], 'Backend', 'Neos.Neos.Ui'); @@ -440,17 +439,6 @@ protected function buildContentChildNodeFilterString(): string ); } - private function getChildNodes(Node $node, string $nodeTypeFilterString): Nodes - { - $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); - - return $this->contentRepositoryRegistry->subgraphForNode($node) - ->findChildNodes( - $node->nodeAggregateId, - FindChildNodesFilter::create(nodeTypes: $nodeTypeFilterString) - ); - } - public function nodeAddress(Node $node): NodeAddress { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml index d545779a1d..5172edb45e 100644 --- a/Configuration/Settings.yaml +++ b/Configuration/Settings.yaml @@ -109,11 +109,11 @@ Neos: metaData: documentNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(documentNode)}' siteNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(site)}' - previewUrl: '${Neos.Ui.NodeInfo.createRedirectToNode(documentNode, controllerContext)}' + previewUrl: '${Neos.Ui.NodeInfo.createRedirectToNode(documentNode, controllerContext.request)}' contentDimensions: active: '${Neos.Ui.ContentDimensions.dimensionSpacePointArray(documentNode.subgraphIdentity.dimensionSpacePoint)}' allowedPresets: '${Neos.Ui.Api.emptyArrayToObject(Neos.Ui.ContentDimensions.allowedPresetsByName(documentNode.subgraphIdentity.dimensionSpacePoint, documentNode.subgraphIdentity.contentRepositoryId))}' - documentNodeSerialization: '${Neos.Ui.NodeInfo.renderNodeWithPropertiesAndChildrenInformation(documentNode, controllerContext)}' + documentNodeSerialization: '${Neos.Ui.NodeInfo.renderNodeWithPropertiesAndChildrenInformation(documentNode, controllerContext.request)}' initialState: changes: pending: { } @@ -121,7 +121,7 @@ Neos: failed: { } cr: nodes: - byContextPath: '${Neos.Ui.NodeInfo.defaultNodesForBackend(site, documentNode, controllerContext)}' + byContextPath: '${Neos.Ui.NodeInfo.defaultNodesForBackend(site, documentNode, controllerContext.request)}' siteNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(site)}' documentNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(documentNode)}' clipboard: '${clipboardNodes || []}' @@ -134,7 +134,7 @@ Neos: personalWorkspace: '${Neos.Ui.Workspace.getPersonalWorkspace(contentRepositoryId)}' ui: contentCanvas: - src: '${Neos.Ui.NodeInfo.uri(documentNode, controllerContext)}' + src: '${Neos.Ui.NodeInfo.uri(documentNode, controllerContext.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'')}' From 57966efaea0aa9bca39ab2f6e336aa57f6a50db3 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:19:34 +0100 Subject: [PATCH 3/8] TASK: Unregister `Neos.Ui.NodeInfo` for use in fusion And declare the `NodeInfoHelper` as internal. --- Classes/Fusion/Helper/NodeInfoHelper.php | 1 + Configuration/Settings.yaml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index bfa99ba0bb..da09a513bc 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -31,6 +31,7 @@ use Neos\Neos\Utility\NodeTypeWithFallbackProvider; /** + * @internal * @Flow\Scope("singleton") * @todo EEL helpers are still to be declared as internal */ diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml index 5172edb45e..6ce606ec67 100644 --- a/Configuration/Settings.yaml +++ b/Configuration/Settings.yaml @@ -208,4 +208,3 @@ Neos: Neos.Ui.Workspace: Neos\Neos\Ui\Fusion\Helper\WorkspaceHelper Neos.Ui.StaticResources: Neos\Neos\Ui\Fusion\Helper\StaticResourcesHelper Neos.Ui.PositionalArraySorter: Neos\Neos\Ui\Fusion\Helper\PositionalArraySorterHelper - Neos.Ui.NodeInfo: Neos\Neos\Ui\Fusion\Helper\NodeInfoHelper From 88691b57eb69a45496e8e4d3030e40a136743ee6 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:32:22 +0100 Subject: [PATCH 4/8] TASK: `initialState` yaml use `request` instead of `controllerContext` --- Classes/Controller/BackendController.php | 4 ++-- .../FrontendConfigurationProviderInterface.php | 4 ++-- .../Domain/InitialData/InitialStateProviderInterface.php | 4 ++-- Classes/Fusion/RenderConfigurationImplementation.php | 7 ++++++- .../Configuration/FrontendConfigurationProvider.php | 6 +++--- .../Infrastructure/Configuration/InitialStateProvider.php | 6 +++--- Configuration/Settings.yaml | 8 ++++---- 7 files changed, 22 insertions(+), 17 deletions(-) diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index a5f3eeea89..0268660336 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -198,7 +198,7 @@ public function indexAction(string $node = null) ), 'frontendConfiguration' => $this->frontendConfigurationProvider->getFrontendConfiguration( - controllerContext: $this->controllerContext, + actionRequest: $this->request, ), 'nodeTypes' => $this->nodeTypeGroupsAndRolesProvider->getNodeTypes(), @@ -208,7 +208,7 @@ public function indexAction(string $node = null) ), 'initialState' => $this->initialStateProvider->getInitialState( - controllerContext: $this->controllerContext, + actionRequest: $this->request, contentRepositoryId: $siteDetectionResult->contentRepositoryId, documentNode: $node, site: $siteNode, diff --git a/Classes/Domain/InitialData/FrontendConfigurationProviderInterface.php b/Classes/Domain/InitialData/FrontendConfigurationProviderInterface.php index abeadd30fc..9da1cec3f2 100644 --- a/Classes/Domain/InitialData/FrontendConfigurationProviderInterface.php +++ b/Classes/Domain/InitialData/FrontendConfigurationProviderInterface.php @@ -14,7 +14,7 @@ namespace Neos\Neos\Ui\Domain\InitialData; -use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\ActionRequest; /** * Reads and preprocesses the `Neos.Neos.Ui.frontendConfiguration` settings @@ -27,6 +27,6 @@ interface FrontendConfigurationProviderInterface { /** @return array */ public function getFrontendConfiguration( - ControllerContext $controllerContext + ActionRequest $actionRequest ): array; } diff --git a/Classes/Domain/InitialData/InitialStateProviderInterface.php b/Classes/Domain/InitialData/InitialStateProviderInterface.php index 37eeba456c..98db8abede 100644 --- a/Classes/Domain/InitialData/InitialStateProviderInterface.php +++ b/Classes/Domain/InitialData/InitialStateProviderInterface.php @@ -16,7 +16,7 @@ use Neos\ContentRepository\Core\Factory\ContentRepositoryId; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; -use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\ActionRequest; use Neos\Neos\Domain\Model\User; /** @@ -29,7 +29,7 @@ interface InitialStateProviderInterface { /** @return array */ public function getInitialState( - ControllerContext $controllerContext, + ActionRequest $actionRequest, ContentRepositoryId $contentRepositoryId, ?Node $documentNode, ?Node $site, diff --git a/Classes/Fusion/RenderConfigurationImplementation.php b/Classes/Fusion/RenderConfigurationImplementation.php index 22fb3ab602..4dd34d281b 100644 --- a/Classes/Fusion/RenderConfigurationImplementation.php +++ b/Classes/Fusion/RenderConfigurationImplementation.php @@ -13,6 +13,7 @@ use Neos\Flow\Annotations as Flow; use Neos\Flow\Exception; +use Neos\Flow\Mvc\ActionRequest; use Neos\Fusion\FusionObjects\AbstractFusionObject; use Neos\Neos\Ui\Domain\Service\ConfigurationRenderingService; @@ -59,7 +60,11 @@ public function evaluate() { $context = $this->getContext(); $pathToRender = $this->getPath(); - $context['controllerContext'] = $this->getruntime()->getControllerContext(); + $actionRequest = $this->getRuntime()->fusionGlobals->get('request'); + if (!$actionRequest instanceof ActionRequest) { + throw new Exception('The request is expected to be an ActionRequest.', 1706639436); + } + $context['request'] = $actionRequest; if (!isset($this->settings[$pathToRender])) { throw new Exception('The path "Neos.Neos.Ui.' . $pathToRender . '" was not found in the settings.', 1458814468); diff --git a/Classes/Infrastructure/Configuration/FrontendConfigurationProvider.php b/Classes/Infrastructure/Configuration/FrontendConfigurationProvider.php index 7d5565fd37..e951811f3c 100644 --- a/Classes/Infrastructure/Configuration/FrontendConfigurationProvider.php +++ b/Classes/Infrastructure/Configuration/FrontendConfigurationProvider.php @@ -15,7 +15,7 @@ namespace Neos\Neos\Ui\Infrastructure\Configuration; use Neos\Flow\Annotations as Flow; -use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\ActionRequest; use Neos\Neos\Ui\Domain\InitialData\FrontendConfigurationProviderInterface; use Neos\Neos\Ui\Domain\Service\ConfigurationRenderingService; @@ -33,11 +33,11 @@ final class FrontendConfigurationProvider implements FrontendConfigurationProvid protected array $frontendConfigurationBeforeProcessing; public function getFrontendConfiguration( - ControllerContext $controllerContext + ActionRequest $actionRequest ): array { return $this->configurationRenderingService->computeConfiguration( $this->frontendConfigurationBeforeProcessing, - ['controllerContext' => $controllerContext] + ['request' => $actionRequest] ); } } diff --git a/Classes/Infrastructure/Configuration/InitialStateProvider.php b/Classes/Infrastructure/Configuration/InitialStateProvider.php index 20f69ee667..00a8cf3ccd 100644 --- a/Classes/Infrastructure/Configuration/InitialStateProvider.php +++ b/Classes/Infrastructure/Configuration/InitialStateProvider.php @@ -17,7 +17,7 @@ use Neos\ContentRepository\Core\Factory\ContentRepositoryId; use Neos\ContentRepository\Core\Projection\ContentGraph\Node; use Neos\Flow\Annotations as Flow; -use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\ActionRequest; use Neos\Neos\Domain\Model\User; use Neos\Neos\Ui\Domain\InitialData\InitialStateProviderInterface; use Neos\Neos\Ui\Domain\Service\ConfigurationRenderingService; @@ -40,7 +40,7 @@ final class InitialStateProvider implements InitialStateProviderInterface protected array $initialStateBeforeProcessing; public function getInitialState( - ControllerContext $controllerContext, + ActionRequest $actionRequest, ContentRepositoryId $contentRepositoryId, ?Node $documentNode, ?Node $site, @@ -49,7 +49,7 @@ public function getInitialState( return $this->configurationRenderingService->computeConfiguration( $this->initialStateBeforeProcessing, [ - 'controllerContext' => $controllerContext, + 'request' => $actionRequest, 'contentRepositoryId' => $contentRepositoryId, 'documentNode' => $documentNode, 'site' => $site, diff --git a/Configuration/Settings.yaml b/Configuration/Settings.yaml index 6ce606ec67..ba49aef7b5 100644 --- a/Configuration/Settings.yaml +++ b/Configuration/Settings.yaml @@ -109,11 +109,11 @@ Neos: metaData: documentNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(documentNode)}' siteNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(site)}' - previewUrl: '${Neos.Ui.NodeInfo.createRedirectToNode(documentNode, controllerContext.request)}' + previewUrl: '${Neos.Ui.NodeInfo.createRedirectToNode(documentNode, request)}' contentDimensions: active: '${Neos.Ui.ContentDimensions.dimensionSpacePointArray(documentNode.subgraphIdentity.dimensionSpacePoint)}' allowedPresets: '${Neos.Ui.Api.emptyArrayToObject(Neos.Ui.ContentDimensions.allowedPresetsByName(documentNode.subgraphIdentity.dimensionSpacePoint, documentNode.subgraphIdentity.contentRepositoryId))}' - documentNodeSerialization: '${Neos.Ui.NodeInfo.renderNodeWithPropertiesAndChildrenInformation(documentNode, controllerContext.request)}' + documentNodeSerialization: '${Neos.Ui.NodeInfo.renderNodeWithPropertiesAndChildrenInformation(documentNode, request)}' initialState: changes: pending: { } @@ -121,7 +121,7 @@ Neos: failed: { } cr: nodes: - byContextPath: '${Neos.Ui.NodeInfo.defaultNodesForBackend(site, documentNode, controllerContext.request)}' + byContextPath: '${Neos.Ui.NodeInfo.defaultNodesForBackend(site, documentNode, request)}' siteNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(site)}' documentNode: '${Neos.Ui.NodeInfo.serializedNodeAddress(documentNode)}' clipboard: '${clipboardNodes || []}' @@ -134,7 +134,7 @@ Neos: personalWorkspace: '${Neos.Ui.Workspace.getPersonalWorkspace(contentRepositoryId)}' ui: contentCanvas: - src: '${Neos.Ui.NodeInfo.uri(documentNode, controllerContext.request)}' + src: '${Neos.Ui.NodeInfo.uri(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'')}' From 26687fa2891d165924987784d98799a1d99006c0 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:38:28 +0100 Subject: [PATCH 5/8] TASK: Prefer `ActionRequest` over `ControllerContext` in `MenuProvider` --- Classes/Controller/BackendController.php | 2 +- .../Domain/InitialData/MenuProviderInterface.php | 4 ++-- Classes/Infrastructure/Neos/MenuProvider.php | 15 ++++++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index 0268660336..8275c08bda 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -204,7 +204,7 @@ public function indexAction(string $node = null) $this->nodeTypeGroupsAndRolesProvider->getNodeTypes(), 'menu' => $this->menuProvider->getMenu( - controllerContext: $this->controllerContext, + actionRequest: $this->request, ), 'initialState' => $this->initialStateProvider->getInitialState( diff --git a/Classes/Domain/InitialData/MenuProviderInterface.php b/Classes/Domain/InitialData/MenuProviderInterface.php index d91f4434f8..34f4b8355a 100644 --- a/Classes/Domain/InitialData/MenuProviderInterface.php +++ b/Classes/Domain/InitialData/MenuProviderInterface.php @@ -14,7 +14,7 @@ namespace Neos\Neos\Ui\Domain\InitialData; -use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\ActionRequest; /** * Retrieves all data needed to render the main burger menu located in the @@ -27,5 +27,5 @@ interface MenuProviderInterface /** * @return array}> */ - public function getMenu(ControllerContext $controllerContext): array; + public function getMenu(ActionRequest $actionRequest): array; } diff --git a/Classes/Infrastructure/Neos/MenuProvider.php b/Classes/Infrastructure/Neos/MenuProvider.php index 560bf5c69f..ae8273cfcb 100644 --- a/Classes/Infrastructure/Neos/MenuProvider.php +++ b/Classes/Infrastructure/Neos/MenuProvider.php @@ -15,7 +15,11 @@ namespace Neos\Neos\Ui\Infrastructure\Neos; use Neos\Flow\Annotations as Flow; +use Neos\Flow\Mvc\ActionRequest; +use Neos\Flow\Mvc\ActionResponse; +use Neos\Flow\Mvc\Controller\Arguments; use Neos\Flow\Mvc\Controller\ControllerContext; +use Neos\Flow\Mvc\Routing\UriBuilder; use Neos\Neos\Controller\Backend\MenuHelper; use Neos\Neos\Ui\Domain\InitialData\MenuProviderInterface; use Neos\Utility\PositionalArraySorter; @@ -29,8 +33,17 @@ final class MenuProvider implements MenuProviderInterface #[Flow\Inject] protected MenuHelper $menuHelper; - public function getMenu(ControllerContext $controllerContext): array + public function getMenu(ActionRequest $actionRequest): array { + $uriBuilder = new UriBuilder(); + $uriBuilder->setRequest($actionRequest); + $controllerContext = new ControllerContext( + $actionRequest, + new ActionResponse(), + new Arguments(), + $uriBuilder + ); + $modulesForMenu = $this->menuHelper->buildModuleList($controllerContext); $result = []; From 2d508f5b310795c2c2ed718e3ba4be2bf39e498c Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:42:02 +0100 Subject: [PATCH 6/8] TASK: Remove `NodeInfoHelper::renderNode` --- Classes/Fusion/Helper/NodeInfoHelper.php | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index da09a513bc..bcf06e153b 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -78,30 +78,6 @@ class NodeInfoHelper implements ProtectedContextAwareInterface */ protected $ignoredNodeTypeRole; - /** - * @return ?array - * @deprecated See methods with specific names for different behaviors - */ - public function renderNode( - Node $node, - ControllerContext $controllerContext = null, - bool $omitMostPropertiesForTreeState = false, - string $nodeTypeFilterOverride = null - ):?array { - return ($omitMostPropertiesForTreeState - ? $this->renderNodeWithMinimalPropertiesAndChildrenInformation( - $node, - $controllerContext?->getRequest(), - $nodeTypeFilterOverride - ) - : $this->renderNodeWithPropertiesAndChildrenInformation( - $node, - $controllerContext?->getRequest(), - $nodeTypeFilterOverride - ) - ); - } - /** * @return ?array */ From e362817e2d455c6c8e1cbce7fdd54809adea40b6 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:42:48 +0100 Subject: [PATCH 7/8] TASK: Allow only methods which are actually used in eel to maintain order --- Classes/Fusion/Helper/NodeInfoHelper.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index bcf06e153b..fe735be71c 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -436,6 +436,13 @@ public function serializedNodeAddress(Node $node): string */ public function allowsCallOfMethod($methodName) { - return true; + // to control what is used in eel we maintain this list. + return in_array($methodName, [ + 'serializedNodeAddress', + 'createRedirectToNode', + 'renderNodeWithPropertiesAndChildrenInformation', + 'defaultNodesForBackend', + 'uri' + ], true); } } From ce7cd45e5ed54f6789461400412fcd59d563d7b9 Mon Sep 17 00:00:00 2001 From: mhsdesign <85400359+mhsdesign@users.noreply.github.com> Date: Tue, 30 Jan 2024 19:48:40 +0100 Subject: [PATCH 8/8] TASK: Remove `NodeInfoHelper::nodeAddress` --- Classes/Fusion/Helper/NodeInfoHelper.php | 8 -------- 1 file changed, 8 deletions(-) diff --git a/Classes/Fusion/Helper/NodeInfoHelper.php b/Classes/Fusion/Helper/NodeInfoHelper.php index fe735be71c..e4704288a1 100644 --- a/Classes/Fusion/Helper/NodeInfoHelper.php +++ b/Classes/Fusion/Helper/NodeInfoHelper.php @@ -20,7 +20,6 @@ use Neos\Eel\ProtectedContextAwareInterface; use Neos\Flow\Annotations as Flow; use Neos\Flow\Mvc\ActionRequest; -use Neos\Flow\Mvc\Controller\ControllerContext; use Neos\Flow\Mvc\Routing\UriBuilder; use Neos\Flow\Persistence\PersistenceManagerInterface; use Neos\Neos\FrontendRouting\NodeAddress; @@ -416,13 +415,6 @@ protected function buildContentChildNodeFilterString(): string ); } - public function nodeAddress(Node $node): NodeAddress - { - $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId); - $nodeAddressFactory = NodeAddressFactory::create($contentRepository); - return $nodeAddressFactory->createFromNode($node); - } - public function serializedNodeAddress(Node $node): string { $contentRepository = $this->contentRepositoryRegistry->get($node->subgraphIdentity->contentRepositoryId);