From b7118cc9900a543b18c4c8538adf8dcf87202093 Mon Sep 17 00:00:00 2001 From: Oliver Hader <oliver@typo3.org> Date: Thu, 18 Nov 2021 08:57:57 +0100 Subject: [PATCH] [TASK] Avoid inline JavaScript in f:be.menus.actionMenu Uses GlobalEventHandler functionality instead of onchange events. Resolves: #96018 Releases: master, 11.5 Change-Id: Ib217b294b9f3d0ff27c005b0d4f397aa2bfd665c Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/72221 Tested-by: core-ci <typo3@b13.com> Tested-by: Torben Hansen <derhansen@gmail.com> Tested-by: Oliver Hader <oliver.hader@typo3.org> Reviewed-by: Torben Hansen <derhansen@gmail.com> Reviewed-by: Oliver Hader <oliver.hader@typo3.org> --- .../Be/Menus/ActionMenuViewHelper.php | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php index ee28a3f17a7a..6de1beb7dd14 100644 --- a/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php +++ b/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php @@ -15,6 +15,9 @@ namespace TYPO3\CMS\Fluid\ViewHelpers\Be\Menus; +use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction; +use TYPO3\CMS\Core\Page\JavaScriptRenderer; +use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3Fluid\Fluid\Core\Compiler\TemplateCompiler; use TYPO3Fluid\Fluid\Core\Parser\SyntaxTree\ViewHelperNode; use TYPO3Fluid\Fluid\Core\ViewHelper\AbstractTagBasedViewHelper; @@ -80,15 +83,19 @@ class ActionMenuViewHelper extends AbstractTagBasedViewHelper */ public function render() { - $this->tag->addAttribute('onchange', 'window.location.href = this.options[this.selectedIndex].value;'); $options = ''; foreach ($this->childNodes as $childNode) { if ($childNode instanceof ViewHelperNode) { $options .= $childNode->evaluate($this->renderingContext); } } + $this->tag->addAttributes([ + 'data-global-event' => 'change', + 'data-action-navigate' => '$value', + ]); $this->tag->setContent($options); - return '<div class="docheader-funcmenu">' . $this->tag->render() . '</div>'; + return $this->loadRequireJsModule('TYPO3/CMS/Backend/GlobalEventHandler') + . '<div class="docheader-funcmenu">' . $this->tag->render() . '</div>'; } /** @@ -104,4 +111,18 @@ class ActionMenuViewHelper extends AbstractTagBasedViewHelper $compiler->disable(); return null; } + + /** + * Renders `<script src="JavaScriptHandler.js">...</script>` for loading + * corresponding module. Using `JavaScriptRenderer` makes this independent + * from `PageRenderer` and its current application state. + */ + protected function loadRequireJsModule(string $name): string + { + $javaScriptRenderer = JavaScriptRenderer::create(); + $javaScriptRenderer->addJavaScriptModuleInstruction( + JavaScriptModuleInstruction::forRequireJS($name) + ); + return $javaScriptRenderer->render(); + } } -- GitLab