使用TYPO3 12。
我正在尝试将 JavaScript 模块添加到我的后端模块,但我无法让它工作。
这是我按照官方文档所做的:
/Configuration/JavaScriptModules.php
return [
'dependencies' => ['backend'],
'imports' => [
'@vendor/package/' => 'EXT:vendor/Resources/Public/JavaScript/',
],
];
PageRenderer
向模块控制器提供
/Configuration/Services.yaml
Vendeor\package\Controller\Backend\BackendModuleController:
tags: ['backend.controller']
arguments:
$pageRenderer: '@TYPO3\CMS\Core\Page\PageRenderer'
loadJavaScriptModule
将JS模块添加到页面 public function initializeAction(): void
{
$this->pageRenderer->loadJavaScriptModule('@vendor/package/backend-module.js');
}
我已经尝试过其他替代方案,例如直接通过
JavaScriptRenderer
访问 PageRenderer
或使用 f:be.pageRenderer
ViewHelper,但似乎没有任何效果。
我还可以通过调试来验证 JS 文件是否已添加到
JavaScriptRenderer
并位于其 importMap
内部。我现在还多次检查了所有文件路径是否存在可能的拼写错误。
我在这里缺少什么?
解决方案:使用
ModuleTemplateFactory
代替 TemplateView
(extbase)。
不明白为什么这不适用于 extbase 方法,但无论如何,以下是解决此问题的步骤:
在您的控制器中
use TYPO3\CMS\Backend\Template\ModuleTemplateFactory;
将
private readonly ModuleTemplateFactory $moduleTemplateFactory
属性添加到构造函数
在
Configuration/Services.yaml
中添加$moduleTemplateFactory: '@TYPO3\CMS\Backend\Template\ModuleTemplateFactory'
在控制器的任何操作中,您现在都可以执行以下操作:
public function listAction(): ResponseInterface
{
$this->pageRenderer->loadJavaScriptModule('@vendor/package/backend-module.js');
$data= $this->dataRepository->findAll();
$moduleTemplate = $this->moduleTemplateFactory->create($this->request);
$moduleTemplate->assign("data", $data);
return $moduleTemplate->renderResponse();
}
JS 文件被添加到模块中。