如何在 Typo3 6.2 Extbase 扩展中将对象从存储库加载到 <f:form.select/>
How to load objects from a repository into <f:form.select/> in Typo3 6.2 Extbase Extension
首先是我的具体问题:创建新预约时我应该怎么做才能在所有医生之间select?
现在背景:
从 Typo 4.7 更新到 6.2 后,我遇到了一些类似这样的问题:
创建新的 Appointment
时,我需要一个 select 字段,其中用户 select 是 Doctor
.
所以我做了这个:
<f:form.select property="doctor" options="{doctors}" optionLabelField="lastName" />
我的 Extensionbuilder 设置:
Appointment
是具有 Doctor
类型关系的实体:"n:1"
Doctor
是一个扩展 \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
的实体
在我的 AppointmentController 中我放了
/**
* doctorRepository
*
* @var \Vendor\Extensionname\Domain\Repository\DoctorRepository
* @inject
*/
protected $doctorRepository = NULL;
在 newAction
我写道:
$doctors = $this->doctorRepository->findAll();
...
$this->view->assignMultiple(array(
'doctors' => $doctors,
));
这样 我的 select 字段中不会显示任何项目 ,即使我有一些 fe_users 类型 Doctor
。
然后我试图通过这样做来查看 $doctors
里面的内容:
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($doctors);
但它说:
Caught exception: Unknown column 'fe_users.sorting' in 'order clause'
编辑:
接受的答案解决了这个问题。
然后它显示了律师对象,但是select仍然是空的。
后来我自己找到了那个问题的答案(见我自己的答案)。
我认为您首先需要解决缺少列的问题。对我来说,似乎在 TYPO3 的更新过程中,数据库列 fe_users.sorting 被删除了。也许它在 ext_tables.sql 文件中没有正确定义,数据库分析器建议删除它? TYPO3 核心中不存在此类字段,因此必须事先从您或第三方扩展中添加。请执行以下操作:
检查数据库是否存在 fe_users.zzz_deleted_sorting,如果存在,将其名称更改为 fe_users.sorting 并将字段定义添加到您的 ext_tables.sql 文件中:
排序 int(11) 默认“0”不为空,
如果没有字段fe_users.zzz_deleted_sorting,说明已经从数据库中删除了。请将第 1 点的 SQL 代码添加到 ext_tables.sql 并使用安装工具执行数据库比较。它将建议您创建新字段 - fe_users.sorting。请创建它。
另请检查数据库结构是否存在其他重要差异。数据库分析器将向您展示所有这些。
解决数据库问题后,如果有任何更改,请提供反馈。那我们就可以继续下一期了。
编辑:
数据库问题已解决,我们可以更进一步。
I shows the lawyer-objects, but the select is still empty
您可能从数据库得到空响应,因为未定义 storagePid。 Extension Builder 可能已经为您创建了 TypoScript 配置。请执行以下操作:
在您的扩展目录中找到文件 Confiugration/TypoScript/constants.txt。
查看BE中医生记录是在哪个Page ID上创建的。
用适当的页面 ID 号填充 storagePid。 StoragePid 在路径中:plugin.tx_[pluginkey].persistence.storagePid。它也应该由 Extension Builder 定义,但它的值可能为空。
我找到了问题的第二个原因:
在我的 <f:render...>
中,我没有通过我的医生作为论据!
...arguments="{..., doctors:doctors}"/>
首先是我的具体问题:创建新预约时我应该怎么做才能在所有医生之间select?
现在背景:
从 Typo 4.7 更新到 6.2 后,我遇到了一些类似这样的问题:
创建新的 Appointment
时,我需要一个 select 字段,其中用户 select 是 Doctor
.
所以我做了这个:
<f:form.select property="doctor" options="{doctors}" optionLabelField="lastName" />
我的 Extensionbuilder 设置:
Appointment
是具有 Doctor
类型关系的实体:"n:1"
Doctor
是一个扩展 \TYPO3\CMS\Extbase\Domain\Model\FrontendUser
在我的 AppointmentController 中我放了
/**
* doctorRepository
*
* @var \Vendor\Extensionname\Domain\Repository\DoctorRepository
* @inject
*/
protected $doctorRepository = NULL;
在 newAction
我写道:
$doctors = $this->doctorRepository->findAll();
...
$this->view->assignMultiple(array(
'doctors' => $doctors,
));
这样 我的 select 字段中不会显示任何项目 ,即使我有一些 fe_users 类型 Doctor
。
然后我试图通过这样做来查看 $doctors
里面的内容:
\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($doctors);
但它说:
Caught exception: Unknown column 'fe_users.sorting' in 'order clause'
编辑: 接受的答案解决了这个问题。
然后它显示了律师对象,但是select仍然是空的。 后来我自己找到了那个问题的答案(见我自己的答案)。
我认为您首先需要解决缺少列的问题。对我来说,似乎在 TYPO3 的更新过程中,数据库列 fe_users.sorting 被删除了。也许它在 ext_tables.sql 文件中没有正确定义,数据库分析器建议删除它? TYPO3 核心中不存在此类字段,因此必须事先从您或第三方扩展中添加。请执行以下操作:
检查数据库是否存在 fe_users.zzz_deleted_sorting,如果存在,将其名称更改为 fe_users.sorting 并将字段定义添加到您的 ext_tables.sql 文件中:
排序 int(11) 默认“0”不为空,
如果没有字段fe_users.zzz_deleted_sorting,说明已经从数据库中删除了。请将第 1 点的 SQL 代码添加到 ext_tables.sql 并使用安装工具执行数据库比较。它将建议您创建新字段 - fe_users.sorting。请创建它。
另请检查数据库结构是否存在其他重要差异。数据库分析器将向您展示所有这些。
解决数据库问题后,如果有任何更改,请提供反馈。那我们就可以继续下一期了。
编辑:
数据库问题已解决,我们可以更进一步。
I shows the lawyer-objects, but the select is still empty
您可能从数据库得到空响应,因为未定义 storagePid。 Extension Builder 可能已经为您创建了 TypoScript 配置。请执行以下操作:
在您的扩展目录中找到文件 Confiugration/TypoScript/constants.txt。
查看BE中医生记录是在哪个Page ID上创建的。
用适当的页面 ID 号填充 storagePid。 StoragePid 在路径中:plugin.tx_[pluginkey].persistence.storagePid。它也应该由 Extension Builder 定义,但它的值可能为空。
我找到了问题的第二个原因:
在我的 <f:render...>
中,我没有通过我的医生作为论据!
...arguments="{..., doctors:doctors}"/>