问题描述
我正在尝试从同一页面上的另一个操作中的一个操作访问提交的对象,同时使其可用于两个操作。 示例:站点 /search/ 嵌入了两个插件:
- 搜索插件
- 显示搜索表单
- 向自身提交表单
- 结果插件
- 应该从 SearchPlugin 获取表单数据
现在,如果我将 SearchPlugin 表单数据提交给自身,则只有 SearchPlugin 操作中的表单数据可用,而 ResultPlugin 中没有。如果它将 SearchPlugin 表单提交给 ResultPlugin 操作,那么我只有 ResultPlugin 中的可用数据,而不是 SearchPlugin 中的数据。 提交后,我需要数据在同一站点上的两个插件/操作中都可用。
这有什么可能吗?
解决方法
内置 Extbase 配置选项
您可以使用 view.pluginNamespace
让两个插件使用相同的 HTTP 参数命名空间,(例如 search
而不是 tx_extension_plugin1
/tx_extension_plugin2
):https://docs.typo3.org/m/typo3/book-extbasefluid/master/en-us/b-ExtbaseReference/Index.html
这将使您的 Extbase 操作能够“共享”所有参数。确保您的所有插件操作都已为此做好准备。
(请记住,虽然这个“功能”可能会被弃用一次,可能是因为它为有效解析路由配置增加了一些架构负担。但这只是谣言,我从这里得到了这个想法:https://github.com/TYPO3-Documentation/TYPO3CMS-Book-ExtbaseFluid/pull/379/files)
自定义解决方案
您可以在 initializeAction
中为您的 Extbase 操作手动设置参数:
$pluginContexts = [
'tx_extension_plugin2',];
// look for a SearchObject in a different (HTTP) plugin namespace
if (!$this->request->hasArgument('searchObject')) {
foreach ($pluginContexts as $pluginContext) {
$foreignPluginContext = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP($pluginContext);
if (isset($foreignPluginContext['searchObject'])) {
$searchObject = $foreignPluginContext['searchObject'];
// if needed do some mapping to object here or validate
...
$this->request->setArgument('searchObject',$searchObject);
break;
}
}
}