我正在使用TYPO3 CMS 6.2.12和Extension Builder 6.2.0来建模Report类并构建一个扩展来管理它 .
域驱动设计要求之一是报表作者是登录的前端用户 . 第二个要求是作者在输入其报告信息时从其前端用户组列表中选择单个组 .
到目前为止,Extension Builder完成了生成代码和文件的大部分工作 . 它构建了Report模型和所有动作控制器以及Fluid模板和partials . 这是一次巨大的飞跃 . 我没有为前端用户或他们的组构建模型,而是选择从现有类中注入依赖项 . 我现在正在尝试处理用户和用户组的要求,主要是通过向newAction
控制器和FormFields
的Fluid partial添加代码 .
在我的开发服务器上,我可以成功输入新报告 . 我提出了一份新报告的网页表格;我可以输入信息并提交新报告;新创建的报告显示在列表页面和数据库中;我可以在网络浏览器中显示单个报告 .
我现在的问题是前端用户组列表没有出现在新报表的Web表单中 .
过去几天我一直在尝试各种各样的实验 .
Extbase Fluid Book中的
-
["A journey through the blog example"] [blogexample]给出了一个很好的例子,并且相信我正在尝试做的事情应该有效 . ["Alternative route: creating a new posting"] [newposting]在阅读本章的其余部分后,作为指南特别有用 .
-
TYPO3 Wiki的["Dependency Injection"文章] [depinj]似乎说我们只需要
@inject
注释,虽然文章警告t3lib_div::makeInstance
,但我发现该方法的重新定位版本在测试期间变得有用,如下所示 . -
以下代码中的Fluid调试指令来自TYPO3 Wiki的[Fluid page] [fluid] . 但是,在测试期间,它似乎只提供了TypoScript设置变量 .
-
我发现了一些Stack Overflow文章,包括["How to set the FrontendUserGroup in AllowViewHelper of VHS in a partial?"] [so1]由Vertex提出,["how to: use Tx_Extbase_Domain_Repository_FrontendUserRepository in typo3 v4.5"] [so2]由The Newbie Qs询问,["TYPO3 - Call another repository"] [so3]由Jeppe Donslund提问,["Typo3 6.1 Extbase - select all fe users"] [so4] ] cili问道 . 最后一篇文章给出了我在测试中使用的
$feUserRepository
片段,如下所示 . 倒数第二篇文章给出了警告,"After adding a Dependency Injection, you have to clear the cache!"它没有说明哪个缓存,这导致我彻底清除了我能想到的测试内容 .
今天,我使用下面显示的代码运行了我最近的测试 . 在TYPO3后端,我刷新了前端缓存和刷新的通用缓存 . 我进入了安装工具的“重要操作”,然后单击“清除所有缓存” . 它很成功 . 然后我进入了Extension Manager,在那里我停用并重新激活了我的扩展 . 然后我在PhpStorm 8.0.3中运行Debug,它遵循事件 . 在我的开发网站上,我登录到了前端 . 我导航到报告列表页面,然后点击“新报告” . 在newAction()
中设置了断点,PhpStorm的 Watch 告诉我他们有'$ 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设置 . )
这个测试让我相信ExtbasenewAction
控制器可以找到$ 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}
{authortest.username}
<label for="authorGroupId"><f:translate key="tx_myextension_domain_model_report.author_group_id" /></label>
<f:form.select property="authorGroupId" options="{groups}" optionLabelField="title" optionValueField="uid" />
来自Web表单中的HTML输出以获取新报告:
<label for="authorGroupId">Author Group Id</label>
<select name="tx_myextension_myextensionauthorplugin[newReport][authorGroupId]"><option value=""></option>
</select>
1 回答
您的
variables
未传递给部分,因此{groups}
不是Partial
中的变量 .您可以通过在
<f:render.partial>
上给出属性arguments
来指定要在partial中使用的variables
,就像您的情况一样:从TYPO3 4.6开始,您也可以使用
arguments="{_all}"
将所有变量传递给partial .也可以看看: