TYPO3:如何通过控制器初始化操作和页面渲染器添加 css 和 js 文件?
TYPO3: How could I add css and js files via controller initialize action and page renderer?
我在控制器级别使用来自 TYPO3 8 的新页面渲染器通过 initializeAction 添加特定扩展 css 和 js 文件:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$extCss = $extPath . 'Resources/Public/Css/ext_booking_manager.css';
/** @var PageRenderer $pageRenderer */
$pageRenderer = $this->objectManager->get(PageRenderer::class);
$pageRenderer->addCssFile($extCss);
$pageRenderer->addJsFooterFile(
$extJs, 'text/javascript', false
);
}
这有时工作正常,但只是有时。这意味着有时 css 文件和 js 文件会被正确添加,有时如果我重新加载页面,文件将不会被正确添加。有什么问题吗?
对于像 TYPO3 7 这样的旧版本,我使用了类似这样的东西:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$GLOBALS['TSFE']->getPageRenderer()->addJsFooterFile(
$extJs, 'text/javascript', false
);
parent::initializeAction();
}
但这不再适用于 TYPO3 8。有什么建议吗?
请注意,在您的模板中使用 HeaderAssets
and FooterAssets
sections 的 TYPO3 v8 提供了一种不同的方法。因此,您的操作模板可能如下所示:
Your template code
<f:section name="FooterAssets">
<link rel="stylesheet" href="{f:uri.resource(path: 'Css/ext_booking_manager.css')}"/>
<script src="{f:uri.resource(path: 'Js/ext_booking_manager.min.js')}"></script>
</f:section>
这样您就不需要控制器中的任何资源逻辑,因此可以删除您的 initializeAction()
方法。
顺便说一句:我建议使用 JavaScript
作为 JavaScript 资源的目录名称以与 TYPO3 约定保持一致。
在 TYPO3 8 中 getPageRenderer()
方法已弃用。你可以在这里看到 Deprecated Methods.
现在您可以在 TYPO3 8 中使用此方法,就像这样 solution
我在控制器级别使用来自 TYPO3 8 的新页面渲染器通过 initializeAction 添加特定扩展 css 和 js 文件:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$extCss = $extPath . 'Resources/Public/Css/ext_booking_manager.css';
/** @var PageRenderer $pageRenderer */
$pageRenderer = $this->objectManager->get(PageRenderer::class);
$pageRenderer->addCssFile($extCss);
$pageRenderer->addJsFooterFile(
$extJs, 'text/javascript', false
);
}
这有时工作正常,但只是有时。这意味着有时 css 文件和 js 文件会被正确添加,有时如果我重新加载页面,文件将不会被正确添加。有什么问题吗?
对于像 TYPO3 7 这样的旧版本,我使用了类似这样的东西:
public function initializeAction()
{
$extPath = ExtensionManagementUtility::siteRelPath(
$this->request->getControllerExtensionKey()
);
$extJs = $extPath . 'Resources/Public/Js/ext_booking_manager.min.js';
$GLOBALS['TSFE']->getPageRenderer()->addJsFooterFile(
$extJs, 'text/javascript', false
);
parent::initializeAction();
}
但这不再适用于 TYPO3 8。有什么建议吗?
请注意,在您的模板中使用 HeaderAssets
and FooterAssets
sections 的 TYPO3 v8 提供了一种不同的方法。因此,您的操作模板可能如下所示:
Your template code
<f:section name="FooterAssets">
<link rel="stylesheet" href="{f:uri.resource(path: 'Css/ext_booking_manager.css')}"/>
<script src="{f:uri.resource(path: 'Js/ext_booking_manager.min.js')}"></script>
</f:section>
这样您就不需要控制器中的任何资源逻辑,因此可以删除您的 initializeAction()
方法。
顺便说一句:我建议使用 JavaScript
作为 JavaScript 资源的目录名称以与 TYPO3 约定保持一致。
在 TYPO3 8 中 getPageRenderer()
方法已弃用。你可以在这里看到 Deprecated Methods.
现在您可以在 TYPO3 8 中使用此方法,就像这样 solution