我使用TYPO3 CMS 6.2.12和Extension Builder 6.2.0为Report类建模并构建扩展来管理它。
域驱动设计要求之一是报表作者是登录的前端用户。第二个要求是作者在输入报告信息时从其前端用户组列表中选择一个组。
到目前为止,Extension Builder完成了生成代码和文件的大部分工作。它构建了Report模型和所有动作控制器以及Fluid模板和partials。这是一次巨大的飞跃。我没有为前端用户或他们的组构建模型,而是选择从现有类中注入依赖项。我现在正在尝试处理用户和用户组的要求,主要是通过向`newAction`控制器添加代码,为`FormFields`添加Fluid partial。
在我的开发服务器上,我可以成功输入新报告。我提出了一份新报告的网页表格;我可以输入信息并提交新报告;新创建的报告显示在列表页面和数据库中;我可以在网络浏览器中显示单个报告。
我现在的问题是前端用户组列表没有出现在新报告的网络表单中。
过去几天我一直在尝试各种各样的实验。
["通过博客示例之旅"] Extbase Fluid Book中的[blogexample]给出了一个很好的例子,让我相信我正在尝试做的事情应该工作。 ["替代路线:创建新帖子"] [newposting]在阅读本章的其余部分之后作为指南特别有用。
TYPO3 Wiki ["依赖注射"文章] [depinj]似乎说我们只需要@inject
注释,虽然文章警告t3lib_div::makeInstance
,但我发现在下面的测试中,该方法的重定位版本变得有用。
以下代码中的Fluid调试说明来自TYPO3 Wiki的[Fluid page] [fluid]。但是,在测试期间,它似乎只提供了TypoScript设置变量。
我发现了一些Stack Overflow文章,包括["如何在部分中的VHS的AllowViewHelper中设置FrontendUserGroup?"] [so1]由Vertex提出,[&#34] ;如何:在typo3 v4.5中使用Tx_Extbase_Domain_Repository_FrontendUserRepository"] [so2]由新手Qs询问,[" TYPO3 - 调用另一个存储库"] [so3]由Jeppe Donslund询问,[&# 34; Typo3 6.1 Extbase - 选择所有fe用户"] [so4]由cili询问。最后一篇文章给出了我在测试中使用的$feUserRepository
代码段,如下所示。倒数第二篇文章给出了警告,"添加依赖注入后,你必须清除缓存!"它没有说出哪个缓存,这导致我彻底清除了我能想到的测试内容。
今天,我使用下面显示的代码运行了我最近的测试。在TYPO3后端,我刷新了前端缓存和刷新的通用缓存。我进入了安装工具"重要的行动"并单击"清除所有缓存"。它很成功。然后我进入了Extension Manager,在那里我停用并重新激活了我的扩展。然后我在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实用程序调试器仅显示不相关的TypoScript设置。)
这个测试让我相信Extbase`newAction`控制器可以找到`$ feUserRepository`的前端用户组,但是在使用`$ frontendUserRepository`和`$ frontendUserGroupRepository`时遇到了问题。但是,由下面的第二个空中断标记输出行指示,即使是分配给`$ feUserRepository的`authortest`变量,也会在流向Fluid的路上丢失。
我尝试对包的其余部分产生最小的影响,我能找到的东西告诉我下面的代码应该正常工作。但事实并非如此。
你能告诉我错过了吗?
(请原谅我丢失的超链接.Stack Overflow告诉我,"你需要至少10个声望才能发布超过2个链接。这是我的第一个问题,所以这显然还没有发生,但是。)
/**
* 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);
}
<f:form action="create" name="newReport" object="{newReport}">
<f:render partial="Report/FormFields" />
<f:form.submit value="Create new" />
</f:form>
<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 />
<br />
<br />
<label for="authorGroupId">Author Group Id</label><br />
<select name="tx_myextension_myextensionauthorplugin[newReport][authorGroupId]"><option value=""></option>
</select><br />
答案 0 :(得分:3)
您的variables
未传递给部分内容,因此{groups}
不是Partial
内的变量。
您可以在variables
上为arguments
提供<f:render.partial>
属性,从而指定要在部分中使用的<f:render partial="Report/FormFields" arguments="{groups : groups}" />
:
arguments="{_all}"
从TYPO3 4.6起,您还可以使用hac.xss.filter.enabled=false
hmc.xss.filter.enabled=false
cmscockpit.xss.filter.enabled=false
将所有变量传递给部分。
另见:
- arguments(array,optional):传递给partial的参数。