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.