TYPO3 Extension Pagerenderer 禁用 addJsInlineCode 的缓存

问题描述

我有一个缓存问题,在我自己的扩展名的 ext_localconf.php 中,我调用了我的函数

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['tslib/class.tslib_fe.php']['checkDataSubmission'][$_EXTKEY] = 'Tester\Test\Hooks\Hook';

我通过 pageRenderer 添加的地方

$pageRenderer = GeneralUtility::makeInstance(PageRenderer::class);
$pageRenderer->addJsInlineCode('Test','myvar= "'.$acckey.'";');

一些内联 Javascript。

每次从页面重新加载时,Javascript 都会更改,但使用 config.no_cache = 0 时,Javascript 始终相同。

我如何告诉页面渲染器这个 Javascript 是新的并且必须更新? no_cache = 1 不是一个选项 ;)

我安装的版本是 9.5。

解决方法

您使用的钩子已被弃用 (https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/9.5/Deprecation-86279-VariousHooksAndPSR-15Middlewares.html)。

通过中间件

您可能希望迁移到一个中间件,您的 PageRenderer 代码将在其中以非缓存方式运行 (https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/RequestHandling/Index.html)。

或:通过 USER_INT

根据您的用例,您还可以从 USER_INT TypoScript 对象调用您的代码。 (https://docs.typo3.org/m/typo3/reference-typoscript/master/en-us/ContentObjects/UserAndUserInt/Index.html)。这也将为您提供对动态添加的 JS 的非缓存控制。在性能方面,中间件应该更轻一些(特别是如果这将是您页面上的第一个 USER_INT)。将为所有请求调用中间件,USER_INT 仅用于您的 page (type=0)。所以可能只是口味问题。

TypoScript 设置:

page.23789 = USER_INT
page.23789 {
  userFunc = Vendor\ExtensionName\AddAssets->jsInline
}

PHP:

namespace Vendor\ExtensionName;
class AddAssets {
  public function jsInline(string $content,array $conf): string
  {
    \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(
      \TYPO3\CMS\Core\Page\PageRenderer::class
    )
      ->addJsInlineCode(
          'extensionname-mytest','alert("Hello there! \nGenerated@' . time() . ')"'
      );
    return '';
  }
}

您也可以从函数返回 HTML (<script>...),但为了可维护性,我建议通过 PageRenderer API(或 TYPO3 v10+ https://docs.typo3.org/c/typo3/cms-core/master/en-us/Changelog/10.3/Feature-90522-IntroduceAssetCollector.html 中的 AssetCollector)注册资产。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...