TYPO3 V11.5.15中Extbase插件间跳转实现方案咨询
TYPO3 11.5.15 员工表单跳转解决方案(公司不存在时自动跳转)
问题背景
使用TYPO3 11.5.15,需实现添加员工表单的跳转逻辑:当用户输入的公司不存在时,从当前表单直接跳转到创建公司的表单。以下尝试过的方案均无效:
- 原生
redirect和UriBuilder方法 - 旧帖推荐的
f:link.action方案(明确弃用,该方案需用户手动跳转后再检查输入) - 4年前针对AJAX跳转bug的过时workaround
- Stefan Bürk的类似手动实例化UriBuilder方案(代码如下):
// 引入UriBuilder use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder; // 实例化UriBuilder并构建URL $uriBuilder = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(UriBuilder::class); $uriBuilder->setTargetPageUid($PageUidGoesHere); $uri = $uriBuilder->uriFor($ControllerAction, $ParametersArray, $ControllerName, $ExtensionName, $PluginName); // 跳转至自定义URL return $this->redirectToUri($uri);
正确实现步骤
1. 控制器中注入UriBuilder(避免手动实例化)
TYPO3 11.5的Extbase控制器支持依赖注入UriBuilder,手动实例化会丢失请求上下文,导致URL构建错误。在控制器类中添加注入代码:
/** * @var \TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder */ protected $uriBuilder; /** * @param \TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder $uriBuilder */ public function injectUriBuilder(\TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder $uriBuilder) { $this->uriBuilder = $uriBuilder; }
2. 表单提交Action中添加跳转逻辑
假设表单提交到EmployeeController的addAction,在其中判断公司是否存在,不存在则跳转:
public function addAction(\Vendor\YourExtension\Domain\Model\Employee $employee) { // 替换为你实际的公司存在性检查逻辑 $companyExists = $this->companyRepository->findOneByTitle($employee->getCompanyTitle()) !== null; if (!$companyExists) { // 构建跳转URL:指定目标页面UID、控制器、Action $targetUri = $this->uriBuilder ->setTargetPageUid(123) // 替换为创建公司表单所在的页面UID ->uriFor( 'create', // 目标控制器的Action名称 ['companyTitle' => $employee->getCompanyTitle()], // 传递当前输入的公司名称(可选) 'Company', // 目标控制器名称 'YourExtension', // 你的扩展密钥(小写) 'CompanyPlugin' // 目标插件名称(对应ext_localconf.php中的配置) ); // 执行跳转,使用303状态码避免POST重复提交 return $this->redirectToUri($targetUri, 303); } // 公司存在时的正常逻辑:保存员工、提示成功 $this->employeeRepository->add($employee); $this->addFlashMessage('员工添加成功', '', \TYPO3\CMS\Core\Messaging\AbstractMessage::SUCCESS); return $this->redirect('list'); }
3. 关键注意事项
- 参数必须完全匹配:确保
控制器名称、扩展密钥、插件名称与ext_localconf.php/ext_tables.php中的配置一致(区分大小写) - 状态码设置:用303状态码,确保POST请求跳转后自动转为GET,避免刷新页面重复提交
- 插件权限检查:目标页面的插件需允许访问指定的Action(在插件配置的"Allowed actions"中添加)
- AJAX表单特殊处理:如果表单是AJAX提交的,需返回JSON让前端跳转:
前端收到后执行if (!$companyExists) { $targetUri = $this->uriBuilder->setTargetPageUid(123)->uriFor('create', [], 'Company', 'YourExtension', 'CompanyPlugin'); return new \TYPO3\CMS\Core\Http\JsonResponse(['redirect' => $targetUri]); }window.location.href = response.data.redirect即可完成跳转。
内容的提问来源于stack exchange,提问作者Starzi
相关产品推荐
相关产品推荐

