通过 typoScript 包含的前端插件在 TYPO3 8.7 中不再工作
Frontend plugin which is included via typoScript does not work in TYPO3 8.7 anymore
在 TYPO3 7.6 中我定义了一个 "PLUGIN_TYPE_CONTENT_ELEMENT".
类型的前端插件
ext_localconf.php:
ExtensionUtility::configurePlugin(
'MyVendor.' . $_EXTKEY,
'Maildownload',
['Maildownload' => 'show'],
[],
ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT
);
configurePlugin 方法创建了一个 typoScript Setup,其中调用了 Extbase Bootstrap class 的 "run()" 方法:
...
tt_content.myext_maildownload.20 = USER
tt_content.myext_maildownload20.userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
...
这意味着 Extbase 通过在我的扩展的控制器 "Maildownload" 中调用操作 "show" 来处理请求。
我通过 ajax 调用我的插件。这意味着,我定义了一个带有单独 typenum 的页面,并通过 typoScript 包含插件:
setup.ts:
ajax_page = PAGE
ajax_page {
typeNum = 123
config.disableAllHeaderCode = 1
config.metaCharset = UTF-8
config.debug = 0
config.additionalHeaders = Content-type:application/json
config.xhtml_cleaning = 0
config.adminPanel = 0
10 < tt_content.myext_maildownload
}
当我调用页面 index.php?type=123 时,控制器 "Maildownload" 中的操作 "show" 将被执行。
升级到 TYPO3 8.7 后,这个行为明显改变了。
"configurePlugin()"方法生成的typoScript代码还是一样的。当我调用页面 index.php?type=123 时,TYPO3 将其呈现为普通内容元素,不再调用 TYPO3\CMS\Extbase\Core\Bootstrap->运行 方法。所以我的 showAction 方法不会被调用。
我现在可以定义一个数据处理器 class 并将 showAction 移入其中。
但这不是一个很好的解决方案,因为我不想绕过完整的 extbase 渲染过程。
现在是否有一种新方法可以将我的插件包含到页面中,以便将其视为 extbase 插件而不是内容元素?
@andrei 谢谢你的回复,但是没有说到重点
与此同时,我发现问题的原因是 TYPO3 8.5 中的重大更改:https://docs.typo3.org/typo3cms/extensions/core/Changelog/8.5/Breaking-78002-EnforceCHashArgumentForExtbaseActions.html?highlight=chash
所以一个可能的解决方案是在 typoScript 插件设置中将 requireCHashArgumentForActionArguments 设置为 false:
plugin.tx_myextension {
features.requireCHashArgumentForActionArguments = 0
...
}
在 TYPO3 7.6 中我定义了一个 "PLUGIN_TYPE_CONTENT_ELEMENT".
类型的前端插件ext_localconf.php:
ExtensionUtility::configurePlugin(
'MyVendor.' . $_EXTKEY,
'Maildownload',
['Maildownload' => 'show'],
[],
ExtensionUtility::PLUGIN_TYPE_CONTENT_ELEMENT
);
configurePlugin 方法创建了一个 typoScript Setup,其中调用了 Extbase Bootstrap class 的 "run()" 方法:
...
tt_content.myext_maildownload.20 = USER
tt_content.myext_maildownload20.userFunc = TYPO3\CMS\Extbase\Core\Bootstrap->run
...
这意味着 Extbase 通过在我的扩展的控制器 "Maildownload" 中调用操作 "show" 来处理请求。
我通过 ajax 调用我的插件。这意味着,我定义了一个带有单独 typenum 的页面,并通过 typoScript 包含插件:
setup.ts:
ajax_page = PAGE
ajax_page {
typeNum = 123
config.disableAllHeaderCode = 1
config.metaCharset = UTF-8
config.debug = 0
config.additionalHeaders = Content-type:application/json
config.xhtml_cleaning = 0
config.adminPanel = 0
10 < tt_content.myext_maildownload
}
当我调用页面 index.php?type=123 时,控制器 "Maildownload" 中的操作 "show" 将被执行。
升级到 TYPO3 8.7 后,这个行为明显改变了。
"configurePlugin()"方法生成的typoScript代码还是一样的。当我调用页面 index.php?type=123 时,TYPO3 将其呈现为普通内容元素,不再调用 TYPO3\CMS\Extbase\Core\Bootstrap->运行 方法。所以我的 showAction 方法不会被调用。
我现在可以定义一个数据处理器 class 并将 showAction 移入其中。 但这不是一个很好的解决方案,因为我不想绕过完整的 extbase 渲染过程。
现在是否有一种新方法可以将我的插件包含到页面中,以便将其视为 extbase 插件而不是内容元素?
@andrei 谢谢你的回复,但是没有说到重点
与此同时,我发现问题的原因是 TYPO3 8.5 中的重大更改:https://docs.typo3.org/typo3cms/extensions/core/Changelog/8.5/Breaking-78002-EnforceCHashArgumentForExtbaseActions.html?highlight=chash
所以一个可能的解决方案是在 typoScript 插件设置中将 requireCHashArgumentForActionArguments 设置为 false:
plugin.tx_myextension {
features.requireCHashArgumentForActionArguments = 0
...
}