在 TYPO3 6.2 中,我的前端用户组列表如何在 Extbase 操作控制器和 Fluid 模板部分之间丢失?
How does my frontend usergroup list get lost between Extbase action controller and Fluid template partial in TYPO3 6.2?
我正在使用 TYPO3 CMS 6.2.12 和 Extension Builder 6.2.0 为报告建模 class 并构建一个扩展来管理它。
域驱动设计要求之一是报表作者必须是登录的前端用户。第二个要求是作者在输入他们的报告信息时从他们的前端用户组列表中选择一个组。
到目前为止,Extension Builder 完成了生成代码和文件的大部分工作。它构建了报告模型和所有动作控制器以及流体模板和部分。这是一个巨大的飞跃。我没有让它为前端用户或其组构建模型,而是选择从现有 classes 中注入依赖项。我现在正在尝试满足用户和用户组的要求,主要是通过向 `newAction` 控制器和 `FormFields` 的 Fluid 部分添加代码。
在我的开发服务器上,我可以成功输入新报告。我为一份新报告打开了一个网络表格;我可以输入信息并提交新报告;新创建的报告出现在列表页面和数据库中;我可以在网络浏览器中显示该报告。
我现在的问题是前端用户组列表没有出现在新报告的网络表单中。
过去几天我一直在尝试各种实验。
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 文章,包括 Vertex 问的 ["How to set the FrontendUserGroup in AllowViewHelper of VHS in a partial?"][so1],The Newbie Qs 问的 ["how to: use Tx_Extbase_Domain_Repository_FrontendUserRepository in typo3 v4.5"][so2], ["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 后端,我刷新了前端缓存并刷新了通用缓存。我进入安装工具的 "Important actions" 并单击 "Clear all cache"。它是成功的。然后我进入扩展管理器,在那里我停用并重新激活了我的扩展。然后我 运行 在 PhpStorm 8.0.3 中进行调试,随后发生了事件。在我的开发网站中,我登录到前端。我导航到报告列表页面,然后单击 "New Report"。在 `newAction()` 中设置了断点后,PhpStorm 的手表告诉我他们有一个 "error evaluating code" 用于 `$frontendUserRepository` 和 `$frontendUserGroupRepository`,没有我知道如何找到的更多信息。 (我是 PhpStorm 的新手。)然而,`$feUserRepository` 变成了一个类型为 `TYPO3\CMS\Extbase\Domain\Model\FrontendUser` 的对象,其中包含许多项目,包括一个包含 `typo3\cms\extbase\domain\model\frontenduser` 和 ` 数组的 `identifierMap` 数组typo3\cms\extbase\domain\model\frontenduser组` 项。 frontenduser 数组包含一个包含正确用户记录的“TYPO3\CMS\Extbase\Domain\Model\FrontendUser”对象。 frontendusergroup 数组包含 2 个包含正确用户组记录的“TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup”对象。在接下来的调试步骤中,`TYPO3\CMS\Extbase\Domain\Model\FrontendUser $user` 对象包含相同的正确用户记录。尽管如此,新报告的 Web 表单的输出 HTML 页面为作者的用户名显示和作者的用户组 select 列表生成了空白。 (Extbase 实用程序调试器仅显示不相关的 TypoScript 设置。)
这个测试让我相信 Extbase `newAction` 控制器可以找到 `$feUserRepository` 的前端用户组,但是在 `$frontendUserRepository` 和 `$frontendUserGroupRepository` 中遇到了问题。然而,由下面第二个空的 break 标记输出行指示,即使分配给 $feUserRepository 的 `authortest` 变量也不知何故在流向 Fluid 的过程中丢失了。
我正在尝试将对包的其余部分的影响降到最低,我能找到的内容告诉我下面的代码应该可以工作。但事实并非如此。
你能告诉我错过了什么吗?
(请原谅我丢失的超链接。Stack Overflow 告诉我,“你需要至少 10 个信誉才能 post 超过 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 />
来自 HTML 新报告的 Web 表单输出:
<br />
<br />
<label for="authorGroupId">Author Group Id</label><br />
<select name="tx_myextension_myextensionauthorplugin[newReport][authorGroupId]"><option value=""></option>
</select><br />
你的 variables
没有传递给部分,所以 {groups}
不是你的 Partial
中的变量。
您可以通过在 <f:render.partial>
上提供属性 arguments
来指定要在部分中使用的 variables
,就像您的情况一样:
<f:render partial="Report/FormFields" arguments="{groups : groups}" />
从 TYPO3 4.6 开始,您还可以使用 arguments="{_all}"
将所有变量传递给部分变量。
另请参阅:
- arguments (array, optional): Arguments to pass to the partial.
我正在使用 TYPO3 CMS 6.2.12 和 Extension Builder 6.2.0 为报告建模 class 并构建一个扩展来管理它。
域驱动设计要求之一是报表作者必须是登录的前端用户。第二个要求是作者在输入他们的报告信息时从他们的前端用户组列表中选择一个组。
到目前为止,Extension Builder 完成了生成代码和文件的大部分工作。它构建了报告模型和所有动作控制器以及流体模板和部分。这是一个巨大的飞跃。我没有让它为前端用户或其组构建模型,而是选择从现有 classes 中注入依赖项。我现在正在尝试满足用户和用户组的要求,主要是通过向 `newAction` 控制器和 `FormFields` 的 Fluid 部分添加代码。
在我的开发服务器上,我可以成功输入新报告。我为一份新报告打开了一个网络表格;我可以输入信息并提交新报告;新创建的报告出现在列表页面和数据库中;我可以在网络浏览器中显示该报告。
我现在的问题是前端用户组列表没有出现在新报告的网络表单中。
过去几天我一直在尝试各种实验。
-
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 文章,包括 Vertex 问的 ["How to set the FrontendUserGroup in AllowViewHelper of VHS in a partial?"][so1],The Newbie Qs 问的 ["how to: use Tx_Extbase_Domain_Repository_FrontendUserRepository in typo3 v4.5"][so2], ["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 后端,我刷新了前端缓存并刷新了通用缓存。我进入安装工具的 "Important actions" 并单击 "Clear all cache"。它是成功的。然后我进入扩展管理器,在那里我停用并重新激活了我的扩展。然后我 运行 在 PhpStorm 8.0.3 中进行调试,随后发生了事件。在我的开发网站中,我登录到前端。我导航到报告列表页面,然后单击 "New Report"。在 `newAction()` 中设置了断点后,PhpStorm 的手表告诉我他们有一个 "error evaluating code" 用于 `$frontendUserRepository` 和 `$frontendUserGroupRepository`,没有我知道如何找到的更多信息。 (我是 PhpStorm 的新手。)然而,`$feUserRepository` 变成了一个类型为 `TYPO3\CMS\Extbase\Domain\Model\FrontendUser` 的对象,其中包含许多项目,包括一个包含 `typo3\cms\extbase\domain\model\frontenduser` 和 ` 数组的 `identifierMap` 数组typo3\cms\extbase\domain\model\frontenduser组` 项。 frontenduser 数组包含一个包含正确用户记录的“TYPO3\CMS\Extbase\Domain\Model\FrontendUser”对象。 frontendusergroup 数组包含 2 个包含正确用户组记录的“TYPO3\CMS\Extbase\Domain\Model\FrontendUserGroup”对象。在接下来的调试步骤中,`TYPO3\CMS\Extbase\Domain\Model\FrontendUser $user` 对象包含相同的正确用户记录。尽管如此,新报告的 Web 表单的输出 HTML 页面为作者的用户名显示和作者的用户组 select 列表生成了空白。 (Extbase 实用程序调试器仅显示不相关的 TypoScript 设置。)
这个测试让我相信 Extbase `newAction` 控制器可以找到 `$feUserRepository` 的前端用户组,但是在 `$frontendUserRepository` 和 `$frontendUserGroupRepository` 中遇到了问题。然而,由下面第二个空的 break 标记输出行指示,即使分配给 $feUserRepository 的 `authortest` 变量也不知何故在流向 Fluid 的过程中丢失了。
我正在尝试将对包的其余部分的影响降到最低,我能找到的内容告诉我下面的代码应该可以工作。但事实并非如此。
你能告诉我错过了什么吗?
(请原谅我丢失的超链接。Stack Overflow 告诉我,“你需要至少 10 个信誉才能 post 超过 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 />
来自 HTML 新报告的 Web 表单输出:
<br />
<br />
<label for="authorGroupId">Author Group Id</label><br />
<select name="tx_myextension_myextensionauthorplugin[newReport][authorGroupId]"><option value=""></option>
</select><br />
你的 variables
没有传递给部分,所以 {groups}
不是你的 Partial
中的变量。
您可以通过在 <f:render.partial>
上提供属性 arguments
来指定要在部分中使用的 variables
,就像您的情况一样:
<f:render partial="Report/FormFields" arguments="{groups : groups}" />
从 TYPO3 4.6 开始,您还可以使用 arguments="{_all}"
将所有变量传递给部分变量。
另请参阅:
- arguments (array, optional): Arguments to pass to the partial.