From b146826f295b63a77d473984c62f58f899e2fbb7 Mon Sep 17 00:00:00 2001 From: Daniel Lienert Date: Mon, 5 Jul 2021 17:30:50 +0200 Subject: [PATCH] TASK: Refactor controller to not use static fusion path The fusion path is now dynamically determined by controller / action This enables additional actions with separate templates for that controller. --- Classes/Controller/BackendController.php | 13 - .../Controller/BackendController/index.fusion | 260 +++++++++++++++++ .../Prototypes/RenderConfiguration.fusion | 0 Resources/Private/Fusion/Backend/Root.fusion | 263 +----------------- 4 files changed, 261 insertions(+), 275 deletions(-) create mode 100644 Resources/Private/Fusion/Backend/Controller/BackendController/index.fusion rename Resources/Private/Fusion/{ => Backend}/Prototypes/RenderConfiguration.fusion (100%) diff --git a/Classes/Controller/BackendController.php b/Classes/Controller/BackendController.php index 3dec8809c0..56dc60367f 100644 --- a/Classes/Controller/BackendController.php +++ b/Classes/Controller/BackendController.php @@ -16,7 +16,6 @@ use Neos\ContentRepository\Domain\Model\NodeInterface; use Neos\ContentRepository\Domain\Service\ContextFactoryInterface; use Neos\Flow\Annotations as Flow; -use Neos\Flow\Http\Component\SetHeaderComponent; use Neos\Flow\Mvc\Controller\ActionController; use Neos\Flow\Mvc\Exception\NoSuchArgumentException; use Neos\Flow\Mvc\Exception\StopActionException; @@ -26,7 +25,6 @@ use Neos\Flow\Persistence\PersistenceManagerInterface; use Neos\Flow\ResourceManagement\ResourceManager; use Neos\Flow\Session\SessionInterface; -use Neos\Fusion\View\FusionView; use Neos\Neos\Controller\Backend\MenuHelper; use Neos\Neos\Domain\Repository\DomainRepository; use Neos\Neos\Domain\Repository\SiteRepository; @@ -112,17 +110,6 @@ class BackendController extends ActionController */ protected $linkingService; - /** - * Initializes the view before invoking an action method. - * - * @param ViewInterface $view The view to be initialized - * @return void - */ - public function initializeView(ViewInterface $view) - { - $view->setFusionPath('backend'); - } - /** * Displays the backend interface * diff --git a/Resources/Private/Fusion/Backend/Controller/BackendController/index.fusion b/Resources/Private/Fusion/Backend/Controller/BackendController/index.fusion new file mode 100644 index 0000000000..9f9b031b0d --- /dev/null +++ b/Resources/Private/Fusion/Backend/Controller/BackendController/index.fusion @@ -0,0 +1,260 @@ +Neos.Neos.Ui.BackendController.index = Neos.Fusion:Template { + templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/Index.html' + + headScripts = ${headScripts} + headStylesheets = ${headStylesheets} + splashScreenPartial = ${splashScreenPartial} + + headIcons = Neos.Fusion:Join { + appleTouchIcon = Neos.Fusion:Tag { + tagName = 'link' + attributes { + href = Neos.Fusion:ResourceUri { + path = 'resource://Neos.Neos.Ui/Public/Images/apple-touch-icon.png' + } + sizes = '180x180' + rel = 'apple-touch-icon' + } + } + favicon16 = Neos.Fusion:Tag { + tagName = 'link' + attributes { + href = Neos.Fusion:ResourceUri { + path = 'resource://Neos.Neos.Ui/Public/Images/favicon-16x16.png' + } + sizes = '16x16' + rel = 'icon' + type = 'image/png' + } + } + favicon32 = Neos.Fusion:Tag { + tagName = 'link' + attributes { + href = Neos.Fusion:ResourceUri { + path = 'resource://Neos.Neos.Ui/Public/Images/favicon-32x32.png' + } + sizes = '32x32' + rel = 'icon' + type = 'image/png' + } + } + safariPinnedTab = Neos.Fusion:Tag { + tagName = 'link' + attributes { + href = Neos.Fusion:ResourceUri { + path = 'resource://Neos.Neos.Ui/Public/Images/safari-pinned-tab.svg' + } + rel = 'mask-icon' + color = '#00adee' + } + } + } + + configuration = Neos.Fusion:DataStructure { + nodeTree = ${Configuration.setting('Neos.Neos.userInterface.navigateComponent.nodeTree')} + structureTree = ${Configuration.setting('Neos.Neos.userInterface.navigateComponent.structureTree')} + allowedTargetWorkspaces = ${Neos.Ui.Workspace.getAllowedTargetWorkspaces()} + endpoints = Neos.Fusion:DataStructure { + nodeTypeSchema = Neos.Fusion:UriBuilder { + package = 'Neos.Neos' + controller = 'Backend\\Schema' + action = 'nodeTypeSchema' + absolute = true + arguments = Neos.Fusion:DataStructure { + # TODO: dirty hack to not have to re-implement neos:backend.configurationCacheVersion VH + version = Neos.Fusion:Template { + templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/ConfigurationVersion.html' + @process.trim = ${String.trim(value)} + } + } + } + translations = Neos.Fusion:UriBuilder { + package = 'Neos.Neos' + controller = 'Backend\\Backend' + action = 'xliffAsJson' + absolute = true + arguments = Neos.Fusion:DataStructure { + locale = ${interfaceLanguage} + + # TODO: dirty hack to not have to re-implement neos:backend.configurationCacheVersion VH + version = Neos.Fusion:Template { + templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/ConfigurationVersion.html' + @process.trim = ${String.trim(value)} + } + } + } + } + @process.json = ${Json.stringify(value)} + } + + routes = Neos.Fusion:DataStructure { + prototype(Neos.Fusion:UriBuilder) { + absolute = true + } + + ui = Neos.Fusion:DataStructure { + service = Neos.Fusion:DataStructure { + prototype(Neos.Fusion:UriBuilder) { + package = 'Neos.Neos.Ui' + controller = 'BackendService' + } + + change = Neos.Fusion:UriBuilder { + action = 'change' + } + publish = Neos.Fusion:UriBuilder { + action = 'publish' + } + discard = Neos.Fusion:UriBuilder { + action = 'discard' + } + changeBaseWorkspace = Neos.Fusion:UriBuilder { + action = 'changeBaseWorkspace' + } + copyNodes = Neos.Fusion:UriBuilder { + action = 'copyNodes' + } + cutNodes = Neos.Fusion:UriBuilder { + action = 'cutNodes' + } + clearClipboard = Neos.Fusion:UriBuilder { + action = 'clearClipboard' + } + loadTree = Neos.Fusion:UriBuilder { + action = 'loadTree' + } + flowQuery = Neos.Fusion:UriBuilder { + action = 'flowQuery' + } + getWorkspaceInfo = Neos.Fusion:UriBuilder { + action = 'getWorkspaceInfo' + } + getAdditionalNodeMetadata = Neos.Fusion:UriBuilder { + action = 'getAdditionalNodeMetadata' + } + } + } + core = Neos.Fusion:DataStructure { + prototype(Neos.Fusion:UriBuilder) { + package = 'Neos.Neos' + } + + content = Neos.Fusion:DataStructure { + prototype(Neos.Fusion:UriBuilder) { + controller = 'Backend\\Content' + } + + imageWithMetadata = Neos.Fusion:UriBuilder { + action = 'imageWithMetaData' + } + createImageVariant = Neos.Fusion:UriBuilder { + action = 'createImageVariant' + } + loadMasterPlugins = Neos.Fusion:UriBuilder { + action = 'masterPlugins' + } + loadPluginViews = Neos.Fusion:UriBuilder { + action = 'pluginViews' + } + uploadAsset = Neos.Fusion:UriBuilder { + action = 'uploadAsset' + } + } + service = Neos.Fusion:DataStructure { + assetProxies = Neos.Fusion:UriBuilder { + controller = 'Service\\AssetProxies' + action = 'index' + } + assets = Neos.Fusion:UriBuilder { + controller = 'Service\\Assets' + action = 'index' + } + nodes = Neos.Fusion:UriBuilder { + controller = 'Service\\Nodes' + action = 'index' + } + userPreferences = Neos.Fusion:UriBuilder { + subpackage = 'Service' + controller = 'UserPreference' + action = 'index' + format = 'json' + } + dataSource = Neos.Fusion:UriBuilder { + subpackage = 'Service' + controller = 'DataSource' + action = 'index' + format = 'json' + } + contentDimensions = Neos.Fusion:UriBuilder { + package = 'Neos.Neos' + controller = 'Service\\ContentDimensions' + action = 'index' + } + } + modules = Neos.Fusion:DataStructure { + prototype(Neos.Fusion:UriBuilder) { + controller = 'Backend\\Module' + } + workspaces = Neos.Fusion:UriBuilder { + action = 'index' + arguments { + module = 'management/workspaces' + } + } + userSettings = Neos.Fusion:UriBuilder { + controller = 'Backend\\Module' + action = 'index' + arguments { + module = 'user/usersettings' + } + } + mediaBrowser = Neos.Fusion:UriBuilder { + controller = 'Backend\\Module' + action = 'index' + arguments { + module = 'media/browser' + } + } + } + login = Neos.Fusion:UriBuilder { + controller = 'Login' + action = 'index' + format = 'json' + } + logout = Neos.Fusion:UriBuilder { + controller = 'Login' + action = 'logout' + } + } + @process.json = ${Json.stringify(value)} + } + + frontendConfiguration = Neos.Neos.Ui:RenderConfiguration { + path = 'frontendConfiguration' + @process.json = ${Json.stringify(value)} + } + + nodeTypes = Neos.Fusion:DataStructure { + roles = ${Configuration.setting('Neos.Neos.Ui.nodeTypeRoles')} + groups = ${Neos.Ui.PositionalArraySorter.sort(Configuration.setting('Neos.Neos.nodeTypes.groups'))} + + @process.json = ${Json.stringify(value)} + } + + menu = Neos.Neos.Ui:Component.ModuleMenu + + initialState = Neos.Neos.Ui:RenderConfiguration { + path = 'initialState' + context { + documentNode = ${documentNode} + site = ${site} + user = ${user} + clipboardNodes = ${clipboardNodes} + clipboardMode = ${clipboardMode} + } + + @process.json = ${Json.stringify(value)} + } + + env = ${Configuration.setting('Neos.Flow.core.context')} +} diff --git a/Resources/Private/Fusion/Prototypes/RenderConfiguration.fusion b/Resources/Private/Fusion/Backend/Prototypes/RenderConfiguration.fusion similarity index 100% rename from Resources/Private/Fusion/Prototypes/RenderConfiguration.fusion rename to Resources/Private/Fusion/Backend/Prototypes/RenderConfiguration.fusion diff --git a/Resources/Private/Fusion/Backend/Root.fusion b/Resources/Private/Fusion/Backend/Root.fusion index cfe344668b..8002509e51 100644 --- a/Resources/Private/Fusion/Backend/Root.fusion +++ b/Resources/Private/Fusion/Backend/Root.fusion @@ -1,265 +1,4 @@ include: resource://Neos.Fusion/Private/Fusion/Root.fusion include: resource://Neos.Neos/Private/Fusion/Prototypes/NodeUri.fusion include: resource://Neos.Neos.Ui/Private/Fusion/Prototypes/RenderConfiguration.fusion -include: resource://Neos.Neos.Ui/Private/Fusion/Backend/Component/* - -backend = Neos.Fusion:Template { - templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/Index.html' - - headScripts = ${headScripts} - headStylesheets = ${headStylesheets} - splashScreenPartial = ${splashScreenPartial} - - headIcons = Neos.Fusion:Join { - appleTouchIcon = Neos.Fusion:Tag { - tagName = 'link' - attributes { - href = Neos.Fusion:ResourceUri { - path = 'resource://Neos.Neos.Ui/Public/Images/apple-touch-icon.png' - } - sizes = '180x180' - rel = 'apple-touch-icon' - } - } - favicon16 = Neos.Fusion:Tag { - tagName = 'link' - attributes { - href = Neos.Fusion:ResourceUri { - path = 'resource://Neos.Neos.Ui/Public/Images/favicon-16x16.png' - } - sizes = '16x16' - rel = 'icon' - type = 'image/png' - } - } - favicon32 = Neos.Fusion:Tag { - tagName = 'link' - attributes { - href = Neos.Fusion:ResourceUri { - path = 'resource://Neos.Neos.Ui/Public/Images/favicon-32x32.png' - } - sizes = '32x32' - rel = 'icon' - type = 'image/png' - } - } - safariPinnedTab = Neos.Fusion:Tag { - tagName = 'link' - attributes { - href = Neos.Fusion:ResourceUri { - path = 'resource://Neos.Neos.Ui/Public/Images/safari-pinned-tab.svg' - } - rel = 'mask-icon' - color = '#00adee' - } - } - } - - configuration = Neos.Fusion:DataStructure { - nodeTree = ${Configuration.setting('Neos.Neos.userInterface.navigateComponent.nodeTree')} - structureTree = ${Configuration.setting('Neos.Neos.userInterface.navigateComponent.structureTree')} - allowedTargetWorkspaces = ${Neos.Ui.Workspace.getAllowedTargetWorkspaces()} - endpoints = Neos.Fusion:DataStructure { - nodeTypeSchema = Neos.Fusion:UriBuilder { - package = 'Neos.Neos' - controller = 'Backend\\Schema' - action = 'nodeTypeSchema' - absolute = true - arguments = Neos.Fusion:DataStructure { - # TODO: dirty hack to not have to re-implement neos:backend.configurationCacheVersion VH - version = Neos.Fusion:Template { - templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/ConfigurationVersion.html' - @process.trim = ${String.trim(value)} - } - } - } - translations = Neos.Fusion:UriBuilder { - package = 'Neos.Neos' - controller = 'Backend\\Backend' - action = 'xliffAsJson' - absolute = true - arguments = Neos.Fusion:DataStructure { - locale = ${interfaceLanguage} - - # TODO: dirty hack to not have to re-implement neos:backend.configurationCacheVersion VH - version = Neos.Fusion:Template { - templatePath = 'resource://Neos.Neos.Ui/Private/Templates/Backend/ConfigurationVersion.html' - @process.trim = ${String.trim(value)} - } - } - } - } - @process.json = ${Json.stringify(value)} - } - - routes = Neos.Fusion:DataStructure { - prototype(Neos.Fusion:UriBuilder) { - absolute = true - } - - ui = Neos.Fusion:DataStructure { - service = Neos.Fusion:DataStructure { - prototype(Neos.Fusion:UriBuilder) { - package = 'Neos.Neos.Ui' - controller = 'BackendService' - } - - change = Neos.Fusion:UriBuilder { - action = 'change' - } - publish = Neos.Fusion:UriBuilder { - action = 'publish' - } - discard = Neos.Fusion:UriBuilder { - action = 'discard' - } - changeBaseWorkspace = Neos.Fusion:UriBuilder { - action = 'changeBaseWorkspace' - } - copyNodes = Neos.Fusion:UriBuilder { - action = 'copyNodes' - } - cutNodes = Neos.Fusion:UriBuilder { - action = 'cutNodes' - } - clearClipboard = Neos.Fusion:UriBuilder { - action = 'clearClipboard' - } - loadTree = Neos.Fusion:UriBuilder { - action = 'loadTree' - } - flowQuery = Neos.Fusion:UriBuilder { - action = 'flowQuery' - } - getWorkspaceInfo = Neos.Fusion:UriBuilder { - action = 'getWorkspaceInfo' - } - getAdditionalNodeMetadata = Neos.Fusion:UriBuilder { - action = 'getAdditionalNodeMetadata' - } - } - } - core = Neos.Fusion:DataStructure { - prototype(Neos.Fusion:UriBuilder) { - package = 'Neos.Neos' - } - - content = Neos.Fusion:DataStructure { - prototype(Neos.Fusion:UriBuilder) { - controller = 'Backend\\Content' - } - - imageWithMetadata = Neos.Fusion:UriBuilder { - action = 'imageWithMetaData' - } - createImageVariant = Neos.Fusion:UriBuilder { - action = 'createImageVariant' - } - loadMasterPlugins = Neos.Fusion:UriBuilder { - action = 'masterPlugins' - } - loadPluginViews = Neos.Fusion:UriBuilder { - action = 'pluginViews' - } - uploadAsset = Neos.Fusion:UriBuilder { - action = 'uploadAsset' - } - } - service = Neos.Fusion:DataStructure { - assetProxies = Neos.Fusion:UriBuilder { - controller = 'Service\\AssetProxies' - action = 'index' - } - assets = Neos.Fusion:UriBuilder { - controller = 'Service\\Assets' - action = 'index' - } - nodes = Neos.Fusion:UriBuilder { - controller = 'Service\\Nodes' - action = 'index' - } - userPreferences = Neos.Fusion:UriBuilder { - subpackage = 'Service' - controller = 'UserPreference' - action = 'index' - format = 'json' - } - dataSource = Neos.Fusion:UriBuilder { - subpackage = 'Service' - controller = 'DataSource' - action = 'index' - format = 'json' - } - contentDimensions = Neos.Fusion:UriBuilder { - package = 'Neos.Neos' - controller = 'Service\\ContentDimensions' - action = 'index' - } - } - modules = Neos.Fusion:DataStructure { - prototype(Neos.Fusion:UriBuilder) { - controller = 'Backend\\Module' - } - workspaces = Neos.Fusion:UriBuilder { - action = 'index' - arguments { - module = 'management/workspaces' - } - } - userSettings = Neos.Fusion:UriBuilder { - controller = 'Backend\\Module' - action = 'index' - arguments { - module = 'user/usersettings' - } - } - mediaBrowser = Neos.Fusion:UriBuilder { - controller = 'Backend\\Module' - action = 'index' - arguments { - module = 'media/browser' - } - } - } - login = Neos.Fusion:UriBuilder { - controller = 'Login' - action = 'index' - format = 'json' - } - logout = Neos.Fusion:UriBuilder { - controller = 'Login' - action = 'logout' - } - } - @process.json = ${Json.stringify(value)} - } - - frontendConfiguration = Neos.Neos.Ui:RenderConfiguration { - path = 'frontendConfiguration' - @process.json = ${Json.stringify(value)} - } - - nodeTypes = Neos.Fusion:DataStructure { - roles = ${Configuration.setting('Neos.Neos.Ui.nodeTypeRoles')} - groups = ${Neos.Ui.PositionalArraySorter.sort(Configuration.setting('Neos.Neos.nodeTypes.groups'))} - - @process.json = ${Json.stringify(value)} - } - - menu = Neos.Neos.Ui:Component.ModuleMenu - - initialState = Neos.Neos.Ui:RenderConfiguration { - path = 'initialState' - context { - documentNode = ${documentNode} - site = ${site} - user = ${user} - clipboardNodes = ${clipboardNodes} - clipboardMode = ${clipboardMode} - } - - @process.json = ${Json.stringify(value)} - } - - env = ${Configuration.setting('Neos.Flow.core.context')} -} +include: resource://Neos.Neos.Ui/Private/Fusion/Backend/**/*.fusion