diff --git a/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php b/typo3/sysext/fluid/Classes/ViewHelpers/Be/Menus/ActionMenuViewHelper.php index ee28a3f17a7aa9816812fd0c5c03d1acaacb3ef8..6de1beb7dd14b8bcd839e8280fec4ee0ec464869 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(); + } }