Alles, was Sie vor der Installation wissen wollen.
Ein detaillierter Blick darauf, wie Dynamic Product Groups Unterkategorien Shopware 6 — DfStreamCategoryTree: rekursiver Kategoriefilter inklusive untergeordneter Kategorien funktioniert, warum wir es so gebaut haben und der Gedanke hinter den Funktionen oben.
Warum der native Kategoriefilter nicht in den Baum hinabsteigt
Der Bedingungs-Builder der dynamischen Produktgruppen bietet ein Feld Categories, das die Association product.categoriesRo abfragt. Diese Association listet ausschließlich die Kategorien, denen ein Produkt im Reiter Categories ausdrücklich zugeordnet ist. Ein sauber strukturierter Katalog legt Produkte in Blattkategorien ab: ein Sneaker-Modell liegt in Herren, Schuhe, Sneaker, nicht in Herren. Die Folge ist mechanisch: ein Filter auf Herren liefert nur die wenigen direkt auf dieser Ebene zugeordneten Produkte. Das ist kein Bug, sondern das dokumentierte Verhalten der Association, es überrascht aber regelmäßig beim Anlegen eines Merchandising-Streams über eine ganze Warengruppe.
Was product.categoryTree leistet
Shopware pflegt bereits für jedes Produkt ein JSON-Feld namens categoryTree, das die ID aller Kategorien des Pfades von der Wurzel bis zur Zuordnungskategorie enthält. Der CategoryIndexer berechnet es bei jeder Kategorieverschiebung und jeder geänderten Produktzuordnung neu. Die Storefront nutzt es intern für Kategorie-Listings. Ein equalsAny-Filter auf dieses Feld mit der ID einer übergeordneten Kategorie liefert daher alle Produkte, deren Pfad durch sie verläuft, unabhängig von der Tiefe. Das Feld existiert und funktioniert im DAL, wird von der Administration jedoch nicht im Feldselektor des Bedingungs-Builders angeboten: es fehlt in der Allow-Liste des Services productStreamConditionService.
Die genaue Rolle des Plugins
DfStreamCategoryTree fügt dieser Allow-Liste eine Zeile hinzu und liefert die passenden übersetzten Beschriftungen. Mehr nicht, und das ist Absicht. Es bringt keinen Service-Decorator mit, keinen Listener auf Produkt-Events, keine Tabelle, keine Migration. Der in der Oberfläche gebaute Filter ist ein völlig regulärer DAL-Filter, ausgewertet von derselben Engine wie alle anderen Stream-Bedingungen. Das bedeutet auch: ein mit diesem Plugin konfigurierter Stream bleibt lesbar und nutzbar, selbst wenn das Plugin später deaktiviert wird. Der Filter arbeitet auf DAL-Ebene weiter, nur die Anzeige des Feldes in der Oberfläche verschwindet.
Typische Einsatzfälle
Eine Navigationskategorieseite, die von einer dynamischen Gruppe über eine ganze Produktfamilie gespeist wird, ohne Unterkategorien von Hand aufzulisten. Eine Promotion-Regel, die einen Rabatt auf eine gesamte Abteilung samt Unterabteilungen anwendet. Ein automatischer Cross-Selling-Block auf Basis der Abteilung des betrachteten Produkts. Ein Export-Feed oder ein Shopping-Experience-Block, gespeist von einem Stream, der einen ganzen Zweig des Katalogs abbilden soll. In all diesen Fällen zwingt die native Variante dazu, die Konfiguration bei jeder neuen Unterkategorie erneut zu öffnen. Die categoryTree-Variante erfordert überhaupt keine Pflege.
Installation und Administration-Rebuild
Das Plugin wird per ZIP-Upload unter Extensions, My extensions installiert oder durch Ablegen des Ordners in custom Schrägstrich plugins mit anschließendem plugin:refresh und plugin:install --activate. Da es das Verhalten der Administration verändert, ist nach der Installation einmalig ein Rebuild des Admin-Bundles nötig, über den Befehl build-administration oder bin Schrägstrich console bundle:dump gefolgt von der Kompilierung. In einer über eine Deployment-Pipeline verwalteten Produktivumgebung gehört dieser Rebuild in der Regel bereits zu den Standardschritten. Nach der Neukompilierung erscheint das Feld sofort im Bedingungsselektor, ohne dass eine Plugin-Konfiguration auszufüllen wäre.
Was das Plugin nicht tut
Es ersetzt den nativen Categories-Filter nicht, sondern tritt daneben. Es verändert weder den Algorithmus der Kategorieindizierung noch die Berechnung von categoryTree, sondern nutzt, was Shopware ohnehin erzeugt. Es wirkt nicht auf Listing-Filter der Storefront oder die Facettennavigation, die auf einem anderen Mechanismus beruhen. Es läuft nicht auf Shopware Cloud, da die von Shopware gehostete SaaS-Version keine Server-Plugins zulässt. Und es beansprucht nicht, die Auswertung von Streams zu beschleunigen: da das Feld nativ und indiziert ist, entspricht der Auswertungsaufwand dem eines Standardfilters, nicht mehr und nicht weniger.
Es gibt noch keine Rezensionen.