Extension Felder Beschreiben

Hallo,

Ich würde gerne die CmsSection Componente mit einigen Einstellungen erweitern. In diesem HowTo: Shopware 6: Entity extension
habe ich erfahren, dass man eine Entity extension hinzufügen kann. Als erstes habe ich die Extension angelegt:

class SectionExtension implements EntityExtensionInterface
{
    public function extendFields(FieldCollection $collection): void
    {
        $collection->add(
            (new ObjectField('section_extension', 'sectionExtension'))->addFlags(new Runtime())
        );
    }

    public function getDefinitionClass(): string
    {
        return CmsSectionDefinition::class;
    }
}

Und dazu noch den passenden Subscriber, der natürlich auch als Service eingetragen wurde:

class SectionExtensionSubscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents(): array
    {
        return [
            CmsPageEvents::PAGE_LOADED_EVENT => 'onPageLoaded'
        ];
    }

    public function onPageLoaded(EntityLoadedEvent $event): void
    {
        /** @var CmsPageEntity $pageEntity */
        foreach ($event->getEntities() as $pageEntity) {
            /** @var CmsSectionEntity $sectionEntity */
            foreach ($pageEntity->getSections() as $sectionEntity)
                $sectionEntity->addExtension('section_extension', new SectionExtensionStruct());
        }
    }
}

Danach habe ich die Componente überschrieben in src/Resources/app/administration/src/module/sw-cms/component/sw-cms-section/sw-cms-section-config/index.js
 

Component.override('sw-cms-section-config', {
    template,
    
    created() {
        console.log(this.section);
    }
});

An dieser Stelle ging ich davon aus, dass die Extension durch das PageLoadedEvent auch in der ExperienceWorld beim editieren der Sections verfügbar ist. Leider ist dem nicht so. Die extension existiert nur in der Storefront. Ich konnte bisher nicht nachvollziehen wo die Extension überhaupt gespeichert wird. Muss ich dafür selbst noch eine Entity anlegen und verwenden? Oder übernimmt Shopware das für mich? Wie kann ich in die geänderten Werte in der CmsSectionEntity abspeichern? Wenn ich zum Beispiel das ‘locked’ Feld verändere und die Page speicher, dann wird der Wert in der Datenbank nicht mit angepasst. Für ‘name’ funktioniert das ja aber ganz einfach.

Die Frage kam schon mehrmals hier im Forum, wurde aber leider bisher nie seitens Shopware beantwortet ob es derzeit überhaupt möglich ist einen vorhandene CMS block / element zu erweitern. Die Frage hatte ich auch schon.

Bspw. hier: https://forum.shopware.com/discussion/comment/264923/#Comment_264923

Oder hier: https://forum.shopware.com/discussion/62857/erweitern-eines-custom-cms-elements-oder-blocks

Aktuell gehen wir davon aus, dass es derzeit gar nicht möglich ist. Aber eine Antwort wäre dennoch hilfreich seitens Shopware [@Moritz Naczenski](http://forum.shopware.com/profile/14574/Moritz Naczenski “Moritz Naczenski”)‍ , man kann sich ja auch täuschen  Wearing-Sunglasses

1 Like

Guten Tag, 

die Extension Felder sind nicht dafür einfache skalare Daten zu speichern. Durch die Runtime Flag legst du fest, dass das Feld nur zur Runtime existiert und demnach in deinem Fall unter section.extensions.sectionExtension vorhanden sein sollte. Allerdings können hier keine Daten angehangen und gespeichert werden.

Mit den Extensions lassen sich Associations an den entities speichern. Danach muss man im Admin beim Auslesen allerdings dem Criteria die Association anfügen. Als Beispiel kann ich hier auf das BundleExample verweisen: https://github.com/shopware/swag-docs-bundle-example/blob/master/src/Core/Content/Product/ProductExtension.php

Falls aber einfache skalare Werte an der entity gespeichert werden sollen eignen sich hierfür die custom fields. Dazu hier die passende Doku: https://docs.shopware.com/en/shopware-platform-dev-en/internals/core/data-abstraction-layer/custom-field

Viele Grüße aus Schöppingen,