【问题标题】:How to load objects from a repository into <f:form.select/> in Typo3 6.2 Extbase Extension如何将存储库中的对象加载到 Typo3 6.2 Extbase 扩展中的 <f:form.select/>
【发布时间】:2016-10-03 09:27:14
【问题描述】:

首先我的具体问题是:我应该怎么做才能在创建新预约时在所有医生之间进行选择?

现在是背景:
从 Typo 4.7 更新到 6.2 后,我遇到了一些类似这样的问题:

创建新的Appointment 时,我需要一个选择字段,用户可以在其中选择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,
        ));

这样没有项目显示在我的选择字段中,即使我有一些 Doctor 类型的 fe_users。 然后我尝试通过这样做来查看$doctors 里面的内容:

\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($doctors);

但它说:

Caught exception: Unknown column 'fe_users.sorting' in 'order clause' 

编辑: 接受的答案解决了这个问题。

然后它显示了律师对象,但选择仍然是空的。 后来我自己找到了这个问题的答案(见我自己的答案)。

【问题讨论】:

    标签: typo3 fluid extbase


    【解决方案1】:

    我认为首先您需要解决缺少列的问题。对我来说,似乎在更新 TYPO3 期间,数据库列 fe_users.sorting 被删除了。也许它在 ext_tables.sql 文件中没有正确定义,并且数据库分析器建议删除它? TYPO3 核心中不存在此类字段,因此必须事先从您的或第三方扩展中添加。请执行以下操作:

    1. 如果 fe_users.zzz_deleted_sorting 存在,请检查数据库,如果存在,请将其名称更改为 fe_users.sorting 并将字段定义添加到您的 ext_tables.sql 文件中:

      排序 int(11) DEFAULT '0' NOT NULL,

    2. 如果没有字段fe_users.zzz_deleted_sorting,则表示已经从数据库中删除。请将第 1 点的 SQL 代码添加到 ext_tables.sql 并使用安装工具执行数据库比较。它会建议您创建新字段 - fe_users.sorting。请创建它。

    还请检查数据库结构是否还有其他重要差异。数据库分析器将向您展示所有这些。

    解决数据库问题后,如果有任何更改,请提供反馈。然后我们可以继续下一期。

    编辑:

    数据库问题已解决,因此我们可以更进一步。

    我显示了律师对象,但选择仍然是空的

    您可能从数据库中得到空响应,因为 storagePid 未定义。 Extension Builder 可能已经为您创建了 TypoScript 配置。请执行以下操作:

    1. 在您的扩展目录中找到文件 Confiugration/TypoScript/constants.txt。

    2. 检查在 BE 中创建的页面 ID 医生记录。

    3. 用适当的页面 ID 号填充 storagePid。 StoragePid 在路径中:plugin.tx_[pluginkey].persistence.storagePid。它也应该由 Extension Builder 定义,但它的值可能为空。

    【讨论】:

    • 但是我真的需要那个专栏来达到我的目标吗?我不能更改一些内容,以便我的扩展程序不会尝试查找该列吗?
    • 我不能告诉你是否需要它,因为需要检查整个代码。这就是为什么我建议添加该字段而不是删除单个用法,因为在其他地方仍然可能存在一些错误。但是,如果您只想删除单一用法,请检查属性:\Vendor\Extensionname\Domain\Repository\DoctorRepository:defaultOrderings (wiki.typo3.org/…) 我想“排序”字段被定义为默认排序字段。如果不是,则检查 findAll 方法是否覆盖 DoctorRepository 中的默认 findAll。
    • 好的,是不是因为我勾选了“启用排序”?在我的医生存储库中的扩展构建器中,它写道:protected $defaultOrderings = array( 'sorting' =&gt; \TYPO3\CMS\Extbase\Persistence\QueryInterface::ORDER_ASCENDING );我实际上不知道这是做什么的。
    • 我的意思是删除这样的属性,如果它存在,而不是添加它。无论如何,我错过了您正在使用扩展生成器。我虽然你正在迁移到 TYPO3 6.2 已经准备好的扩展。请忘记最后的评论并从 DoctorRepository 中完全删除 defaultOrderings 属性。检查“启用排序?”不是这里的问题。问题是您在扩展构建器模型中进行更改后没有更新数据库结构。如前所述,请使用安装工具中的数据库分析器进行数据库更新。没有它,我们无法走得更远。
    • 我做了你的第 2 点,这行得通...还没有显示任何律师,但这是向前迈出的一步 :) 我现在会调整我的问题
    【解决方案2】:

    我发现了问题的第二个原因:
    在我的&lt;f:render...&gt; 中,我没有通过我的医生作为论据!

    ...arguments="{..., doctors:doctors}"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      相关资源
      最近更新 更多