【问题标题】:ExtbaseObject with relation to multiple occurences of the same objectExtbase 对象与同一对象的多次出现有关
【发布时间】:2018-06-07 13:38:46
【问题描述】:

我有一个 ExtbaseObject,它的关系可以包含对同一子对象的多个引用。

我已经用一个 uid 字段扩展了关系的 mm 表,并在 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;
}



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

【问题讨论】:

    标签: typo3 extbase


    【解决方案1】:

    Extbase ObjectStorage 就是这样工作的。它检索每个对象的object hash 并使用它来唯一地存储对象。 Extbase 持久性确保每个对象只创建一次,方法是在检索后将其存储在持久性会话中。

    绕过此问题的一个选项是将您的 MM 表提升为包含 TCA 和自己的域模型的第一级表。这样,每个关系都是一个单独的对象,因此是唯一的,它允许您与同一个 Artikel 有多个关系。 TYPO3 中的sys_file_reference 表就是这种提升的 MM 表。

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

    如果您这样做,您仍然可以将字段名称保留在您的 MM 表中,如果您想继续使用当前设置对其进行维护。然后,您只需要按照描述更改模型关系。但是,如果您想在表中使用更具描述性的名称,您可以重命名字段,但不能在 TYPO3 中将其作为 MM 表进行管理,因此您需要更改基表字段类型,例如到inline

    最后一个建议:对代码中的所有内容(包括模型和属性名称)使用英文是普遍共识。这使得其他人更容易进入您的代码,并与编程语言的英语很好地融合在一起。

    【讨论】:

    • 是这样想的。我有点难过,TCA 中有一个概念在 Extbase 中没有表示。谢谢。
    • 如果我的回答对你有帮助,你能接受吗? :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2012-11-23
    • 2017-02-14
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多