DmfCmsBlockLibrary
Zentrale Bibliothek zum Speichern und Wiederverwenden von CMS-Blöcken und -Sections in Shopware 6.7 Shopping Experiences. Editor:innen persistieren beliebige Blöcke oder ganze Sections (mit allen Slots und Elements), nutzen sie über jede beliebige Erlebniswelt und kopieren Blöcke oder Sections innerhalb einer Admin-Session zwischen Seiten, wiederkehrende Layouts müssen nicht mehr von Hand nachgebaut werden.
Schnellinfo
| Composer-Paket | dmf/sw6-plugin-cms-block-library |
| Plugin-Klasse | Dmf\CmsBlockLibrary\DmfCmsBlockLibrary |
| Namespace | Dmf\CmsBlockLibrary |
| Version | 1.0.0 |
| Shopware | ^6.7 |
| PHP | 8.2+ |
| Scope | Admin-only, keine Storefront-Komponente |
Installation
composer require dmf/sw6-plugin-cms-block-library
bin/console plugin:refresh
bin/console plugin:install --activate DmfCmsBlockLibrary
bin/console cache:clear
bin/console database:migrate --all DmfCmsBlockLibrary
./bin/build-administration.shReine Admin-Erweiterung
Kein Storefront-Build nötig. Gespeicherte Einträge sind Templates für den Page Builder; die Storefront rendert nach dem Einfügen wie gewohnt über cms_block und cms_section.
Konfiguration
DmfCmsBlockLibrary bringt keine Plugin-Konfiguration mit. Die Bedienung erfolgt direkt im Admin unter Inhalte → Blockbibliothek und Inhalte → Sectionbibliothek.
Features
- Saved Blocks: beliebige CMS-Blöcke mit allen Slots persistieren und in jeder Erlebniswelt wiederverwenden.
- Linked Blocks: alternativer Insert-Modus, der jede Instanz mit dem Bibliothekseintrag synchron hält. Änderungen an einer verlinkten Instanz propagieren live an alle weiteren Instanzen und an den Bibliothekseintrag.
- Saved Sections: vollständige Sections (inkl. Blöcken und Elementen) persistieren und vor/nach beliebigen Sections einfügen.
- Block-Bibliothek-Übersicht unter Inhalte → Blockbibliothek: Liste, Suche, Vorschau, Umbenennen, Löschen, Import, Export. Spalte Typ unterscheidet statische Kopien von Linked Blocks.
- Section-Bibliothek-Übersicht unter Inhalte → Sectionbibliothek mit demselben Funktionsumfang.
- Picker-Kategorie Saved Blocks, Drag-and-drop in die Erlebniswelt erzeugt einen frischen
cms_block(neue UUIDs). Bei Linked-Mode behält die eingefügte Instanz eine Referenz auf den Bibliothekseintrag. - Block-Copy/Paste in der Block-Sidebar: vor/nach beliebigen Block einfügen, über mehrere Seiten hinweg innerhalb derselben Admin-Session.
- Section-Zahnrad auf jeder Section öffnet Section Settings: umbenennen, kopieren, einfügen, in Bibliothek speichern, gespeicherte Section vor/nach einsetzen.
- JSON-Import/Export je Bibliothek.
Datenmodell
Zwei DAL-Entitäten, jeweils mit Standard-Admin-API-CRUD:
dmf_cms_saved_block
| Spalte | Typ | Anmerkung |
|---|---|---|
id | BINARY(16) | UUID |
name | VARCHAR(255) | Anzeigename |
tags | JSON NULL | optionale Liste aus Strings |
block_type | VARCHAR(255) | originaler cms_block.type |
block_config | JSON | Snapshot Block + Slots |
is_linked | TINYINT(1) | 1 = Linked-Mode |
created_at/updated_at | DATETIME(3) |
dmf_cms_saved_section
| Spalte | Typ | Anmerkung |
|---|---|---|
id | BINARY(16) | UUID |
name | VARCHAR(255) | Anzeigename |
tags | JSON NULL | optional |
section_type | VARCHAR(255) | default, sidebar, … |
section_config | JSON | Snapshot Section + Blöcke + Slots |
created_at/updated_at | DATETIME(3) |
API-Endpunkte
Alle Routen liegen im Scope api und erfordern Admin-Auth.
| Method | Route | Beschreibung |
|---|---|---|
| POST | /api/search/dmf-cms-saved-block | DAL-Suche |
| POST | /api/dmf-cms-saved-block | erstellen |
| PATCH | /api/dmf-cms-saved-block/{id} | aktualisieren |
| DELETE | /api/dmf-cms-saved-block/{id} | löschen |
| GET | /api/_action/dmf-cms-block-library/export[?ids=…] | JSON-Download |
| POST | /api/_action/dmf-cms-block-library/import | Multipart-Upload file |
| POST | /api/_action/dmf-cms-block-library/{id}/sync | neuen block_config persistieren, an alle Linked-Instanzen propagieren, betroffene cms-page-{id}-Cache-Tags invalidieren |
| POST | /api/search/dmf-cms-saved-section | DAL-Suche |
| POST | /api/dmf-cms-saved-section | erstellen |
| PATCH | /api/dmf-cms-saved-section/{id} | aktualisieren |
| DELETE | /api/dmf-cms-saved-section/{id} | löschen |
| GET | /api/_action/dmf-cms-section-library/export[?ids=…] | JSON-Download |
| POST | /api/_action/dmf-cms-section-library/import | Multipart-Upload file |
UUIDs
Beim Import werden alle UUIDs neu generiert, derselbe Payload kann beliebig oft importiert werden, ohne Kollisionen zu erzeugen.
Linked Blocks
Wird ein Linked-Block in eine CMS-Seite eingefügt:
- Block speichert
customFields.dmfSavedBlockIdundcustomFields.dmfLinked = true. - Live-Mirroring auf der Seite: Ein Watcher auf
page.sectionsspiegelt Slot-Config-Änderungen sofort auf alle Geschwister-Instanzen desselben Bibliothekseintrags. - Live-Library-Sync (debounced): Derselbe Watcher pusht den neuen
block_confignach ~800 ms Idle an die Sync-Route. Der Bibliothekseintrag bleibt aktuell, ohne dass gespeichert werden muss. - Auto-Sync beim Save: Beim Speichern der CMS-Seite werden alle Linked Blocks zusammengeführt und pro Saved-Block-ID gesynct.
- Cache-Invalidierung: Sync-Route resolvt alle CMS-Seiten mit passender
dmfLinked-Markierung und invalidiert derencms-page-{id}-Tags. - Storefront-Rendering bleibt unverändert: Die Sync-Route schreibt direkt in
cms_slot_translation.config, keine Runtime-Substitution.
Bedienung
Block speichern
- Erlebniswelt im Admin öffnen.
- Block markieren, die rechte Sidebar zeigt Settings und Quickactions.
- Als Block speichern, Name + optionale Tags eingeben, optional Als Linked-Block speichern aktivieren, Speichern.
Saved Block wiederverwenden
- Block-Picker (linke Sidebar) öffnen.
- Kategorie Saved Blocks auswählen.
- Eintrag auf die Stage ziehen.
Section-Settings (Zahnrad)
Jede Section zeigt ein Zahnrad neben den bestehenden Section-Actions. Im Modal:
- Allgemein: Name editieren (Live-Binding, sichtbar im Navigator).
- Aktionen: Section kopieren, Section nach einsetzen (aktiv, wenn Clipboard eine Section enthält), Section speichern.
- Saved Section einfügen: vor/nach der aktuellen Section. Section, Blöcke und Slots erhalten neue UUIDs.
Bekannte Einschränkungen
Clipboard-Scope
Block- und Section-Clipboards leben in sessionStorage. Sie überleben Navigation innerhalb eines Admin-Tabs, aber nicht das Schließen des Tabs. Cross-Tab-Paste wird nicht unterstützt.
- Import/Export ausschließlich JSON: keine Integration in Shopware Import/Export-Profile. Exporte sind nicht über Schema-Major-Versionen hinweg portabel.
- Linked-Block-Editor zeigt Roh-JSON. Die Edit linked block-Modale exponieren den
block_configübersw-code-editor. Ein WYSIWYG-Editor existiert nur für die Live-Instanzen, der CMS-Editor bleibt der empfohlene Pfad für nicht-technische Edits. - Linked-Block-Scope. Synchronisiert wird nur der
block_config. Wrapper-Felder (cssClass,marginTop,backgroundColor) und Section-Zuordnung bleiben seitenlokal. - Sync schreibt durch in
cms_slot_translation.config: sprachspezifische Overrides werden überschrieben. - Live-Mirroring nur seitenintern: Instanzen auf anderen Seiten aktualisieren erst nach Library-Sync und nächstem Storefront-Request.