Textbausteine: Storefront-Integration
Wo Textbausteine in der Storefront ersetzt werden, mitgelieferte Templates, Twig-Filter mmd_snippets und Funktion mmd_snippet für eigene Templates sowie Hinweise zu Theme-Overrides
Textbausteine: Storefront-Integration
Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net
Wo Platzhalter ersetzt werden
Das Plugin liefert drei Template-Overrides mit, die den Filter mmd_snippets anwenden. Unter Shopware 6.7 sind davon zwei wirksam. Eigene Template-Änderungen sind dafür nicht nötig.
| Stelle | Template | Block | Ausgabe |
|---|---|---|---|
| Beschreibung im CMS-Produktlayout (Element "Produktbeschreibung" des Standard-Produktlayouts) | storefront/component/product/description.html.twig |
component_product_description_content_text |
HTML, Inhalte der Bausteine bereinigt |
| Produktkarten (Listen, Suche, CMS-Produkt-Slider und -Listings) | storefront/component/product/card/box-standard.html.twig |
component_product_box_description |
Nur Text, jedes HTML wird entfernt |
| Produktdetailseite, Legacy-Template | storefront/page/product-detail/description.html.twig |
page_product_detail_description_content_text |
Unter Shopware 6.7 inaktiv |
Das dritte Template ist unter Shopware 6.7 wirkungslos: Der Shopware-Kern hat in 6.7 kein Template mit diesem Pfad mehr, es ist seit 6.6 als veraltet markiert und wird nicht mehr standardmäßig geladen. Dieser Befund zum Shopware-Kern stammt aus den Quelltexten von Shopware 6.6 und 6.7. Die Plugin-Linie für Shopware 6.5/6.6 liefert dasselbe Template mit, ob der Kern es dort lädt, ist hier nicht geprüft.
Die Ersetzung gilt nur dort, wo der Filter angewendet wird: in der Produktbeschreibung des CMS-Produktlayouts und auf Produktkarten. Sie gilt nicht in CMS-Textelementen, in Kategorie-Beschreibungen, in Zusatzfeldern und in anderen Ausgaben, solange du dort den Filter nicht selbst einsetzt.
graph TD
A["Produktbeschreibung im Template"] --> B["Twig-Filter mmd_snippets"]
B --> C["Platzhalter im Text suchen"]
C --> D["Bausteine laden (Cache oder Datenbank)"]
D --> E["Inhalt bereinigen und einsetzen"]
E --> F["Ausgabe in der Storefront"]
Was bei der Ersetzung passiert
- Alle Platzhalter einer Beschreibung werden in einem Durchlauf ersetzt, Dopplungen des gleichen Platzhalters ebenfalls.
- Der Inhalt jedes Bausteins wird mit dem Shopware HTML-Sanitizer bereinigt, bevor er eingesetzt wird. Der übrige Text der Beschreibung bleibt unverändert.
- Unbekannte und inaktive Bausteine sowie Bausteine, für die in der aktuellen Sprache kein Inhalt hinterlegt ist, werden nicht ersetzt: Der Platzhalter bleibt als Klartext stehen und ist im Shop sichtbar.
- Ein Baustein, dessen Inhalt zwar vorhanden, aber leer ist, wird dagegen ersetzt: Der Platzhalter verschwindet und es erscheint nichts.
- Die Ersetzung läuft in einem Durchgang. Platzhalter innerhalb eines Textbausteins werden nicht erneut ersetzt, Bausteine lassen sich also nicht verschachteln.
Twig-Filter |mmd_snippets
Ersetzt alle Platzhalter in einem String und liefert HTML zurück, das nicht zusätzlich maskiert wird:
{{ product.translated.description|mmd_snippets }}
Ein |raw ist nicht nötig. Ist der übergebene Wert leer, ist das Ergebnis ein leerer String.
Twig-Funktion mmd_snippet('identifier')
Gibt den Inhalt eines einzelnen aktiven Bausteins in der aktuellen Sprache zurück, oder einen leeren String, wenn der Baustein nicht existiert oder inaktiv ist:
{{ mmd_snippet('garantie-info') }}
Die Funktion funktioniert nur in Twig-Templates, nicht in gespeicherten Inhalten wie Produktbeschreibungen. Dort verwendest du die Platzhalter-Syntax. Anders als der Filter bereinigt die Funktion den Inhalt nicht, sie gibt ihn so aus, wie er gespeichert ist. Pflege Bausteine deshalb nur mit Admin-Benutzern, denen du vertraust.
Eigene Templates und Themes
Wenn dein Theme einen der oben genannten Blöcke selbst überschreibt, ersetzt das Plugin dort nichts mehr, weil dann nicht mehr das Plugin-Template die Ausgabe erzeugt. Wende in diesem Fall den Filter im Override an:
{% sw_extends '@Storefront/storefront/component/product/description.html.twig' %}
{% block component_product_description_content_text %}
<div class="product-detail-description-text" itemprop="description">
{{ product.translated.description|mmd_snippets }}
</div>
{% endblock %}
Für andere Inhaltsbereiche setzt du den Filter in deinem eigenen Template auf den jeweiligen Wert.