ExtbaseObject по отношению к нескольким вхождениям одного и того же объекта - PullRequest
0 голосов
/ 07 июня 2018

У меня есть ExtbaseObject с отношением, которое может содержать несколько ссылок на один и тот же подобъект.

Я расширил таблицу mm для отношения с полем uid и установил параметр MM_hasUidField в tca.,В бэкэнде все работает, как задумано:

enter image description here

Но если я загружаю объект в интерфейс, я получаю только один случай «Testzusatzpaket 1»:

enter image description here



Соответствующая конфигурация tca:

    'zusatzpakete' => [
        'label' => 'LLL:EXT:ned_beratung/Resources/Private/Language/locallang_db.xlf:tx_nedberatung_domain_model_beratung.zusatzpakete',
        'config' => [
            'type' => 'select',
            'renderType' => 'selectMultipleSideBySide',
            'foreign_table' => 'tx_nedshop_domain_model_artikel',
            'multiple' => true,
            'maxitems' => 99,
            'MM' => 'tx_nedberatung_beratung_zusatzpakete_mm',
            'MM_hasUidField' => true,
        ],
    ],


В моделиобъект определяется как хранилище объектов:

/**
 * zusatzpakete
 *
 * @var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NED\NedShop\Domain\Model\Artikel>
 * @cascade remove
 */
protected $zusatzpakete = null;

/**
 * Adds a Zusatzpaket
 *
 * @param \NED\NedShop\Domain\Model\Artikel $zusatzpakete
 * @return void
 */
public function addZusatzpakete(\NED\NedShop\Domain\Model\Artikel $zusatzpakete)
{
    $this->zusatzpakete->attach($zusatzpakete);
}

/**
 * Removes a Zusatzpakete
 *
 * @param \NED\NedShop\Domain\Model\Artikel $zusatzpaketeToRemove The Zusatzpakete to be removed
 * @return void
 */
public function removeZusatzpakete(\NED\NedShop\Domain\Model\Artikel $zusatzpaketeToRemove)
{
    $this->zusatzpakete->detach($zusatzpaketeToRemove);
}

/**
 * Returns the Zusatzpakete
 *
 * @return \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NED\NedShop\Domain\Model\Artikel> $zusatzpakete
 */
public function getZusatzpakete()
{
    return $this->zusatzpakete;
}

/**
 * Sets the Zusatzpakete
 *
 * @param \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\NED\NedShop\Domain\Model\Artikel> $zusatzpakete
 * @return void
 */
public function setZusatzpakete(\TYPO3\CMS\Extbase\Persistence\ObjectStorage $zusatzpakete)
{
    $this->zusatzpakete = $zusatzpakete;
}



Почему это не работает во внешнем интерфейсе, чего мне не хватает?

1 Ответ

0 голосов
/ 07 июня 2018

Так работает Extbase ObjectStorage.Он извлекает хэш объекта каждого объекта и использует его для уникального хранения объектов.А постоянство Extbase гарантирует, что каждый объект создается только один раз, сохраняя его в сеансе сохранения после извлечения.

Один из способов обойти это - перевести вашу таблицу MM в таблицу 1-го уровня, включая TCA и собственный домен.модель.Таким образом, каждое отношение является отдельным объектом и, таким образом, уникальным, что позволяет иметь несколько отношений к одному и тому же Artikel.И примером такой продвигаемой таблицы MM является таблица sys_file_reference в TYPO3.

Ваша модель Beratung будет иметь многозначное свойство (ObjectStorage), типизированное для недавно введенной модели отношений.Затем этой модели требуется свойство для представления связанных Artikel.

Если вы сделаете это, вы все равно сможете сохранить имена полей в своей таблице MM, если хотите продолжить поддерживать его с текущей настройкой.Тогда вам нужно всего лишь изменить ваши модельные отношения, как описано.Однако если вы хотите, чтобы в таблице было больше описательных имен, вы можете переименовать поля, но тогда вы не сможете управлять ими как таблицей MM в TYPO3, поэтому вам придется изменить тип поля базовой таблицы, например, на inline.

Последнее предложение: общий консенсус заключается в использовании английского языка для всего в коде, включая имена моделей и свойств.Это значительно облегчает другим доступ к вашему коду и хорошо сочетается с английским языком программирования.

...