Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TASK: adjust to overhauled node uri building #3802

Merged
merged 8 commits into from
Jun 23, 2024
21 changes: 15 additions & 6 deletions Classes/Controller/BackendController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -118,6 +120,12 @@ class BackendController extends ActionController
*/
protected $initialStateProvider;

/**
* @Flow\Inject
* @var NodeUriBuilderFactory
*/
protected $nodeUriBuilderFactory;

/**
* Displays the backend interface
*
Expand Down Expand Up @@ -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)
);
}
}
5 changes: 4 additions & 1 deletion Classes/Domain/Model/Changes/AbstractCreate.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 13 additions & 5 deletions Classes/Domain/Model/Feedback/Operations/Redirect.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -35,9 +37,9 @@ class Redirect extends AbstractFeedback

/**
* @Flow\Inject
* @var LinkingService
* @var NodeUriBuilderFactory
*/
protected $linkingService;
protected $nodeUriBuilderFactory;

/**
* Set the node
Expand Down Expand Up @@ -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(),
];
}
Expand Down
49 changes: 22 additions & 27 deletions Classes/Fusion/Helper/NodeInfoHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,17 +15,18 @@
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;
use Neos\Flow\Mvc\ActionRequest;
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;
Expand All @@ -42,6 +43,9 @@ class NodeInfoHelper implements ProtectedContextAwareInterface
#[Flow\Inject]
protected ContentRepositoryRegistry $contentRepositoryRegistry;

#[Flow\Inject]
protected NodeUriBuilderFactory $nodeUriBuilderFactory;

#[Flow\Inject]
protected NodeLabelGeneratorInterface $nodeLabelGenerator;

Expand Down Expand Up @@ -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');
}

/**
Expand Down Expand Up @@ -441,7 +436,7 @@ public function allowsCallOfMethod($methodName)
'createRedirectToNode',
'renderNodeWithPropertiesAndChildrenInformation',
'defaultNodesForBackend',
'uri'
'previewUri'
], true);
}
}
2 changes: 1 addition & 1 deletion Configuration/Settings.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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'')}'
Expand Down
Loading