Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typo3 ExtbaseObject与同一对象的多个事件相关_Typo3_Extbase - Fatal编程技术网

Typo3 ExtbaseObject与同一对象的多个事件相关

Typo3 ExtbaseObject与同一对象的多个事件相关,typo3,extbase,Typo3,Extbase,我有一个ExtbaseObject,它的关系可以包含对同一子对象的多个引用 我已经扩展了mm表中与uid字段的关系,并在tca中设置了mm_hasUidField选项。在后端,一切都按预期工作: 但如果我在前端加载对象,则只会出现一个Testzusatzpaket 1: 所讨论的tca配置是: 'zusatzpakete' => [ 'label' => 'LLL:EXT:ned_beratung/Resources/Private/Language/loc

我有一个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;
}

为什么这在前端不起作用,我错过了什么

这就是Extbase对象存储的工作方式。它检索每个对象的名称,并使用该名称仅唯一地存储对象。Extbase持久性通过在检索后将对象存储在持久性会话中,确保每个对象只创建一次

绕过此问题的一个选项是将MM表升级为一级表,包括TCA和自己的域模型。这样,每个关系都是一个单独的对象,因此是唯一的,这允许您对同一Artikel拥有多个关系。这种升级的MM表的示例是TYPO3中的sys_file_引用表

然后,您的Beratung模型将有一个多值属性ObjectStorage类型化为新引入的关系模型。然后,该模型需要一个属性来表示相关的Artikel

如果执行此操作,如果要继续使用当前设置维护MM表,则仍可将字段名保留在MM表中。然后,您只需要按照所述更改模型关系。但是,如果您想在表中有更多描述性名称,可以重命名字段,但在TYPO3中无法再将其作为MM表进行管理,因此您需要将基本表字段类型更改为


最后一个建议是:代码中的所有内容都使用英语,包括模型和属性名称,这是普遍的共识。这使其他人更容易进入您的代码,并与编程语言的英语融为一体。

这样认为。我有点困惑,TCA中有一个概念在Extbase中没有表示。谢谢。如果我的回答对你有帮助,你能接受吗-