我正在使用 TYPO3 CMS 6.2.12 和 Extension Builder 6.2.0 来为 Report 类建模并构建一个扩展来管理它。
领域驱动的设计要求之一是报表作者是登录的前端用户。第二个要求是作者在输入他们的报告信息时从他们的前端用户组列表中选择一个组。
到目前为止,Extension Builder 完成了生成代码和文件的大部分工作。它构建了报告模型和所有动作控制器和流体模板和部分。这是一个巨大的飞跃。我没有让它为前端用户或其组构建模型,而是选择从现有类中注入依赖项。我现在正在尝试处理用户和用户组的要求,主要是通过向`newAction` 控制器和`FormFields` 的Fluid 部分添加代码。
在我的开发服务器上,我可以成功输入新报告。我为新报告打开了一个网络表单;我可以输入信息并提交新报告;新创建的报告出现在列表页和数据库中;我可以在网络浏览器中显示该单一报告。
我现在的问题是前端用户组列表没有出现在新报告的 Web 表单中。
在过去的几天里,我一直在尝试各种实验。
[“博客示例之旅”][blogexample] 在 Extbase Fluid Book 中提供了一个很好的示例,并且相信我正在尝试做的事情应该会奏效。[“替代路线:创建新帖子”][newposting] 在阅读本章的其余部分后,作为指南特别有用。
TYPO3 Wiki 的 ["Dependency Injection" article][depinj] 似乎说我们只需要
@inject
注释,尽管文章警告不要使用t3lib_div::makeInstance
,但我发现该方法的重新定位版本在测试期间变得有用,如下所示。以下代码中的 Fluid 调试指令来自 TYPO3 Wiki 的 [Fluid page][fluid]。但是,在测试期间,它似乎只给出了 TypoScript 设置变量。
我发现了许多 Stack Overflow 文章,包括 [“如何在部分 VHS 的 AllowViewHelper 中设置 FrontendUserGroup?”][so1] Vertex 询问,[“如何:在typo3 v4.5 中使用 Tx_Extbase_Domain_Repository_FrontendUserRepository”][so2 ] The Newbie Qs 询问,["TYPO3 - Call another repository"][so3] Jeppe Donslund 询问,["Typo3 6.1 Extbase - select all fe users"][so4] cili 询问。最后一篇文章给出了
$feUserRepository
我在测试中使用的片段,如下所示。倒数第二篇文章给出了警告,“添加依赖注入后,你必须清除缓存!” 它没有说是哪个缓存,这导致我为了这个测试清除了我能想到的所有东西。
今天,我使用下面显示的代码运行了我最近的测试。在 TYPO3 后端,我刷新了前端缓存并刷新了通用缓存。我进入安装工具的“重要操作”并单击“清除所有缓存”。它是成功的。然后我进入扩展管理器,在那里我停用并重新激活了我的扩展。然后,我在 PhpStorm 8.0.3 中运行了 Debug,它跟随事件。在我的开发网站中,我登录到前端。我导航到报告列表页面,然后单击“新建报告”。在 `newAction()` 中设置断点后,PhpStorm 的手表告诉我,`$frontendUserRepository` 和 `$frontendUserGroupRepository` 都有一个“错误评估代码”,我不知道如何找到更多信息。(我是 PhpStorm 的新手。)但是,`$feUserRepository` 变成了 `TYPO3\CMS\Extbase\Domain\Model\FrontendUser` 类型的对象,包含许多项目,包括 `identifierMap` 数组,其中包含 `typo3\cms\extbase\domain\model\frontenduser` 数组和`typo3\cms\extbase\domain\model\frontendusergroup` 项目。frontenduser 数组包含一个 `TYPO3\CMS\Extbase\Domain\Model\FrontendUser` 对象,其中包含正确的用户记录。frontendusergroup 数组包含 2 个包含正确用户组记录的 TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup 对象。在下一个调试步骤中,`TYPO3\CMS\Extbase\Domain\Model\FrontendUser $user` 对象包含相同的正确用户记录。然而,在所有这些之后,新报告的 Web 表单的输出 HTML 页面为我的作者的用户名显示和我的作者的用户组选择列表产生了空白。
这个测试让我相信 Extbase 的 `newAction` 控制器可以找到 `$feUserRepository` 的前端用户组,但是在 `$frontendUserRepository` 和 `$frontendUserGroupRepository` 上遇到了问题。但是,如下面的第二个空中断标记输出行所示,即使是分配给 $feUserRepository 的 `authortest` 变量也不知何故在通往 Fluid 的途中丢失了。
我正在尝试对包的其余部分产生最小的影响,我能找到的告诉我下面的代码应该可以工作。但事实并非如此。
你能说出我错过了什么吗?
(请原谅我丢失的超链接。Stack Overflow 告诉我,“你需要至少 10 个声望才能发布超过 2 个链接。这是我的第一个问题,所以显然还没有发生。)
从 myextension\Classes\Controller\ReportController.php:
/**
* reportRepository
*
* @var \MyVendor\Myextension\Domain\Repository\ReportRepository
* @inject
*/
protected $reportRepository = NULL;
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository
* @inject
*/
protected $frontendUserRepository;
/**
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserGroupRepository
* @inject
*/
protected $frontendUserGroupRepository;
/**
* action new
*
* @param \MyVendor\Myextension\Domain\Model\Report $newReport
* @ignorevalidation $newReport
* @return void
*/
public function newAction(\MyVendor\Myextension\Domain\Model\Report $newReport = NULL) {
$this->view->assign('newReport', $newReport);
$this->view->assign('author', $this->frontendUserRepository->findByUid($GLOBALS['TSFE']->fe_user->user['uid']));
$this->view->assign('groups', $this->frontendUserGroupRepository->findAll());
$feUserRepository = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance( 'TYPO3\\CMS\\Extbase\\Domain\\Repository\\FrontendUserRepository' );
$user = $feUserRepository->findByUid( 1 );
$this->view->assign('authortest', $user);
}
从 myextension\Resources\Private\Templates\Report\New.html:
<f:form action="create" name="newReport" object="{newReport}">
<f:render partial="Report/FormFields" />
<f:form.submit value="Create new" />
</f:form>
从 myextension\Resources\Private\Partials\Report\FormFields.html:
<f:debug title="All available variables">{_all}</f:debug>
{author.username}<br />
{authortest.username}<br />
<label for="authorGroupId"><f:translate key="tx_myextension_domain_model_report.author_group_id" /></label><br />
<f:form.select property="authorGroupId" options="{groups}" optionLabelField="title" optionValueField="uid" /><br />
来自新报告的 Web 表单中的 HTML 输出:
<br />
<br />
<label for="authorGroupId">Author Group Id</label><br />
<select name="tx_myextension_myextensionauthorplugin[newReport][authorGroupId]"><option value=""></option>
</select><br />