与同一对象多次出现相关的 Extbase 对象
ExtbaseObject with relation to multiple occurences of the same object
我有一个 ExtbaseObject,其关系可以包含对同一子对象的多个引用。
我已经扩展了 mm table 与 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;
}
为什么这在前端不起作用,我错过了什么?
这就是 Extbase ObjectStorage
的工作方式。它检索每个对象的 object hash 并使用它来唯一地存储对象。并且 Extbase 持久性确保每个对象只创建一次,方法是在检索后将其存储在持久性会话中。
绕过这个的一个选择是将您的 MM table 提升到第一级 table,包括 TCA 和自己的域模型。这样每个关系都是一个单独的对象,因此是唯一的,它允许您对同一个 Artikel
有多个关系。这种提升的MM table的例子是TYPO3中的sys_file_reference
table。
您的 Beratung
模型将有一个多值 属性 (ObjectStorage
) 类型到新引入的关系模型。然后该模型需要一个 属性 来表示相关的 Artikel
.
如果您这样做,您仍然可以将字段名称保留在您的 MM 中 table 如果您想继续使用当前设置维护它。然后你只需要按照描述改变你的模型关系。但是,如果您想在 table 中使用更具描述性的名称,您可以重命名这些字段,但在 TYPO3 中它不能再作为 MM table 进行管理,因此您需要更改基础 table 字段类型,例如至 inline
.
最后一个建议:代码中的所有内容都使用英语是普遍共识,包括模型和 属性 名称。这使得其他人更容易进入您的代码并与编程语言的英语很好地融合。
我有一个 ExtbaseObject,其关系可以包含对同一子对象的多个引用。
我已经扩展了 mm table 与 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;
}
为什么这在前端不起作用,我错过了什么?
这就是 Extbase ObjectStorage
的工作方式。它检索每个对象的 object hash 并使用它来唯一地存储对象。并且 Extbase 持久性确保每个对象只创建一次,方法是在检索后将其存储在持久性会话中。
绕过这个的一个选择是将您的 MM table 提升到第一级 table,包括 TCA 和自己的域模型。这样每个关系都是一个单独的对象,因此是唯一的,它允许您对同一个 Artikel
有多个关系。这种提升的MM table的例子是TYPO3中的sys_file_reference
table。
您的 Beratung
模型将有一个多值 属性 (ObjectStorage
) 类型到新引入的关系模型。然后该模型需要一个 属性 来表示相关的 Artikel
.
如果您这样做,您仍然可以将字段名称保留在您的 MM 中 table 如果您想继续使用当前设置维护它。然后你只需要按照描述改变你的模型关系。但是,如果您想在 table 中使用更具描述性的名称,您可以重命名这些字段,但在 TYPO3 中它不能再作为 MM table 进行管理,因此您需要更改基础 table 字段类型,例如至 inline
.
最后一个建议:代码中的所有内容都使用英语是普遍共识,包括模型和 属性 名称。这使得其他人更容易进入您的代码并与编程语言的英语很好地融合。