我有一个ExtbaseObject,其关系可以包含对同一个子对象的多个引用。
我已经将mm表扩展为与uid字段的关系,并在tca中设置选项MM_hasUidField。在后端,一切都按预期工作:
但是,如果我在前端加载对象,我只会出现一次" Testzusatzpaket 1":
有问题的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;
}
为什么这不适用于前端,我错过了什么?
答案 0 :(得分:1)
这就是Extbase ObjectStorage
的工作方式。它检索每个对象的object hash并使用它来仅唯一地存储对象。 Extbase持久性确保每个对象只有在检索后将其存储在持久性会话中才会创建一次。
绕过此选项的一个选项是将MM表提升为包含TCA和自己的域模型的第1级表。这样每个关系都是一个单独的对象,因此是唯一的,它允许您与同一个Artikel
有多个关系。这种推广的MM表的例子是TYPO3中的sys_file_reference
表。
然后,您的Beratung
模型会为新引入的关系模型输入一个多值属性(ObjectStorage
)。然后,该模型需要一个属性来表示相关的Artikel
。
如果您这样做,您仍然可以将字段名称保留在MM表中,如果您想继续使用当前设置进行维护。然后,您只需要按照描述更改模型关系。但是,如果您希望在表中包含更多描述性名称,则可以重命名字段,但不能再将其作为TYPO3中的MM表进行管理,因此您需要更改基表字段类型,例如到inline
。
最后一个建议:对于代码中的所有内容,包括模型和属性名称,使用英语是普遍的共识。这使得其他人更容易进入您的代码并与编程语言的英语很好地融合。