显示 select 字段,其中包含填充有“foreign_table”选项的流体

Show select field with fluid that is filled with `foreign_table` options

我使用前端插件创建了一个 typo3 扩展,您可以在其中创建新条目。

一个字段是一个 select 字段,其值来自另一个 table。在 TCA 中,它看起来像这样:

'shoeref' => array(
    'exclude' => 0,
    'label' => 'Shoe Ref Test',
    'config' => array(
        'type' => 'select',
        'foreign_table' => 'tx_testcollection_domain_model_testcollection',
        'foreign_table_where' => 'and tx_testcollection_domain_model_testcollection.pid = 96 and tx_testcollection_domain_model_testcollection.sys_language_uid = 0',
        'minitems' => 0,
        'maxitems' => 1,
    ),
),

这在后端有效。我可以 select 来自 table tx_testcollection_domain_model_testcollection 的记录,而且在前端我可以访问这个元素。

但是在 'New' 页面(您可以在其中创建新元素)上,我不知道如何填写 select 字段。

我刚试过:

<f:form.select property="shoeref" />

但是它说需要我'options'。
像这样:

<f:form.select property="shoeref" options="{0: 'test1', 1: 'test2'}"/>

但是我当然需要这个 select 字段中 table tx_testcollection_domain_model_testcollection 的值。

那么我如何才能将 table 的值(具有相同的 where- 条件)放入此 select 字段中?


编辑我很接近:
我在 newAction:

的控制器中填充了一个变量
    $collection = $this->objectManager->get('Test\TestCollection\Domain\Repository\TestCollectionRepository');

    $querySettings = $this->objectManager->get('TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings');
    $querySettings->setRespectStoragePage(FALSE);
    $querySettings->setStoragePageIds(array(96)); //Looks like he dont care about this and just finds all..

    $collection->setDefaultQuerySettings($querySettings);
    $this->view->assign('collecton',$collection->findAll());

并在模板中:

<f:form.select property="shoeref" options="{collecton}" optionLabelField="name"/>

我看到了正确的选项,但是当我想保存时,我得到:

    Exception while property mapping at property path "": PHP Catchable Fatal Error: Argument 1 passed to Test\TestCustomerfeedback\Domain\Model\Customerfeedback::setShoeref() must be an instance of
 Test\TestCustomerfeedback\Domain\Model\Test\TestCollection\Domain\Model\TestCollection
, instance of 
Test\TestCollection\Domain\Model\TestCollection
 given

, called in /home/www-data/typo3_src-7.6.4_dev/typo3/sysext/extbase/Classes/Reflection/ObjectAccess.php on line 209 and defined in /home/www-data/mydomain/typo3conf/ext/test_customerfeedback/Classes/Domain/Model/Customerfeedback.php line 32

方法 Test\TestCustomerfeedback\Domain\Model\Customerfeedback::setShoeref() 中参数的类型提示是错误的 - 它可能看起来像这样:

public function setShoeref(Test\TestCollection\Domain\Model\TestCollection $shoeRef)
{
    // ...
}

它大概应该是这样的:

public function setShoeref(\Test\TestCollection\Domain\Model\TestCollection $shoeRef)
{
    // ...
}

(参数类型中加反斜杠)

最好在 class 文件的头部添加一个 use 语句,或者,在这种特殊情况下(因为 class 和 CustomerFeedbackTestCollection 在同一个命名空间中),只需使用短 TestCollection 作为类型提示:

<?php

public function setShoeref(TestCollection $shoeRef)
{
    // ...
}

另一件事:不要使用对象管理器获取您的存储库,将它们注入使用它们的 class - 您可以通过使应该包含它们的 属性 受保护,添加需要的class as @var注解,并添加注解@inject。然后从安装工具中清除缓存,然后再次 运行 该代码。

/**
 * @var \Test\TestCollection\Domain\Repository\TestCollectionRepository
 * @inject
 */
protected $collectionRepository;