Показать поле выбора с жидкостью, которая заполнена опциями `foreign_table`

Я создал расширение typo3 с внешним плагином, где вы можете создавать новые записи.

Одно поле представляет собой поле выбора со значениями из другой таблицы. В ТС это выглядит так:

'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,
    ),
),

Это работает в бэкенде. Я могу выбрать запись из таблицы tx_testcollection_domain_model_testcollection, а также во внешнем интерфейсе я могу получить доступ к этому элементу.

Но на странице «Новая» (где вы можете создать новый элемент) я понятия не имею, как заполнить поле выбора.

Я только что попробовал:

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

Но он говорит, что мне нужны «варианты».
Примерно так:

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

Но, конечно, мне нужны значения из таблицы tx_testcollection_domain_model_testcollection в этом поле выбора.

Итак, как я могу получить значения этой таблицы (с тем же условием) в это поле выбора?


Редактировать Я близок:
я заполняю переменную в своем контроллере в 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

person nbar    schedule 30.06.2016    source источник


Ответы (1)


Подсказка типа для аргумента в методе Test\TestCustomerfeedback\Domain\Model\Customerfeedback::setShoeref() неверна - вероятно, это выглядит так:

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

Вероятно, это должно выглядеть так:

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

(дополнительная обратная косая черта в типе параметра)

Было бы еще лучше добавить оператор use в заголовок вашего файла класса или, в этом особом случае (поскольку оба класса CustomerFeedback и TestCollection находятся в одном и том же пространстве имен), просто используйте короткий TestCollection в качестве подсказки типа:

<?php

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

Еще одна вещь: не извлекайте свои репозитории с помощью диспетчера объектов, внедряйте их в класс, который их использует. Вы можете сделать это, сделав свойство, которое должно содержать их, защищенным, добавьте необходимый класс как аннотацию @var и добавьте аннотацию @inject. Затем очистите кеши из инструмента установки, прежде чем снова запускать этот код.

/**
 * @var \Test\TestCollection\Domain\Repository\TestCollectionRepository
 * @inject
 */
protected $collectionRepository;
person Jost    schedule 30.06.2016
comment
Спасибо! «@inject» — это то, что я искал. (Я был слеп, потому что не видел этого) - person nbar; 04.07.2016