在 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 部分添加代码。

在我的开发服务器上,我可以成功输入新报告。我为一份新报告打开了一个网络表格;我可以输入信息并提交新报告;新创建的报告出现在列表页面和数据库中;我可以在网络浏览器中显示该报告。

我现在的问题是前端用户组列表没有出现在新报告的网络表单中。

过去几天我一直在尝试各种实验。

今天,我 运行 使用下面显示的代码进行了最近的测试。在 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}" 将所有变量传递给部分变量。

另请参阅:

http://docs.typo3.org/flow/TYPO3FlowDocumentation/stable/TheDefinitiveGuide/PartV/FluidViewHelperReference.html#f-render

  • arguments (array, optional): Arguments to pass to the partial.