Daher möchte ich ein benutzerdefiniertes Layout-Handle für alle Seiten der Kategorieansicht hinzufügen. Das Handle, das geladen werden soll, hängt von bestimmten Kategorieparametern ab. Daher muss das Handle programmgesteuert mit hinzugefügt werden $page->addPageLayoutHandles()
Scheint einfach ..? Scheinbar nicht
Magento 2 bietet ein nettes Plugin-System, das ich natürlich verwenden wollte. Definieren Sie einfach ein afterExecute()
Plugin, das nach der ursprünglichen Kategorie ausgeführt werden soll, execute()
und übertragen Sie von dort aus alle Aktualisierungen in das Page-Objekt.
Leider funktioniert dies nicht ganz. Grund dafür ist, dass die ursprüngliche execute()
Methode (ganz am Ende) ausgeführt wird. Durch $page->getConfig()->addBodyClass()
einen Aufruf dieser Methode wird das Layout automatisch vollständig geladen und generiert, sodass alle nachfolgenden Versuche, neue hinzuzufügen, ausgeführt werden Layout-Handles zu Seite sind völlig nutzlos. Ich habe mich umgesehen, um nicht so elegante Wege zu finden, um dasselbe zu erreichen (immer noch mit Plugins). Ich habe keine gefunden.
Am Ende habe ich meinen eigenen Controller für die Kategorieansicht ausgeführt, aber ich würde es nicht vorziehen, ihn so zu belassen.
Meine Frage lautet also: Wie kann ich (programmgesteuert) neue Seitenlayout-Handles für die Kategorieansicht hinzufügen? und mach es elegant.
quelle
$page->getConfig()->addBodyClass()
Ihr Layout geladen und generiert wird? Ich habe im Moment eine ähnliche Aufgabe, nur mit CMS-Seiten.Antworten:
Der XML-Weg
Eine einfache Möglichkeit besteht darin, die folgende Datei in Ihrem Modulordner zu erstellen:
view/frontend/layout/catalog_category_view.xml
mit folgendem Inhalt:Es ist nicht mehr oder weniger elegant als PHP und nach Ihren Erkenntnissen sicherer.
Der PHP-Weg
Leider scheint es in Ihrem Fall so zu sein, dass PHP die einzige Möglichkeit ist, Handles basierend auf den Parametern der Kategorie dynamisch zu erstellen.
Über Plugins
Anstatt ein Plugin für die
execute()
Methode Ihrer Aktionsklasse zu erstellen, können Sie auch ein Plugin für dieaddPageLayoutHandles()
Methode von erstellenMagento\Framework\View\Result\Page
Das Hauptproblem besteht darin, dass es bei jedem Aufruf dieser Methode aufgerufen wird und Sie einige Bedingungen in Ihren Plugin-Code einfügen müssen, um sicherzustellen, dass Sie sich auf einer Kategoriesicht befinden.
Über Einstellungen
Eine andere Möglichkeit besteht darin, Einstellungen für die Aktionsklasse "Kategorieansicht" zu verwenden:
Dann überschreiben Sie in Ihrer benutzerdefinierten Controller-Klasse einfach die
execute()
Methode, indem Sie die ursprüngliche Methode kopieren / einfügen und Ihre Änderungen direkt in diese Methode einfügen.Das Hauptproblem besteht darin, dass beim Aktualisieren Ihrer Magento-Installation Änderungen an der ursprünglichen nativen Magento-Aktionsklasse nicht in Ihrer benutzerdefinierten Aktionsklasse berücksichtigt werden.
quelle
Ich hatte ein ähnliches Problem. Für Kategorien, in denen keine Produktlisten angezeigt werden, benötigte ich ein zusätzliches Handle. Nachdem ich das Handle nicht über das benutzerdefinierte Layout-XML der Kategorie hinzugefügt hatte, fügte ich es schließlich einem Beobachter des
layout_load_before
Ereignisses hinzu:Es handelt sich um einen kleinen Leistungseinbruch, da der Beobachter für jeden Seitenaufruf aufgerufen wird. Leider scheinen alle 'category_view'-bezogenen Ereignisse entweder zu früh (Kategorie noch nicht geladen) oder zu spät (Layout bereits verarbeitet) zu sein.
quelle
\Magento\Cms\Controller\Page\View::execute()
und\Magento\Framework\View\Result\Page::addPageLayoutHandles() or render()
habe den Trick nicht gemacht. Diese Lösung der letzten Instanz war die einzige Lösung, die für mich funktioniert hat.Versuchen wir, das Ereignis layout_load_before zu beobachten. Die Ausführungsfunktion ist dieselbe wie folgt:
Hoffe das wird helfen
quelle