Wie können Layout-Updates mit CMS-Seiten durchgeführt werden?

8

Ich habe ein Modul für vorgestellte Produkte, das ich geschrieben habe, das einen benutzerdefinierten Block auf die Seite mit einer Liste von Produkten setzt, die mit den Attributen übereinstimmen, die ich in dem Block definiert habe. Ursprünglich hatte ich es funktionierend, indem ich eine {{block...}} -Zeile dem Inhaltsabschnitt der CMS-Seite hinzufügte. Das hat gut funktioniert, aber ich habe den Pager nicht bekommen. Also habe ich das behoben, indem ich die {{block...}} -Zeile aus dem Content-Bereich entfernt habe und XML wie folgt in den XML-Bereich für Layout-Update eingefügt habe:

%Vor%

Das hat auch super geklappt. Ich entschied dann, da es so viele Instanzen dieses Blocks gibt, dass es viel sauberer wäre, wenn ich eine XML-Datei zum Layout-Ordner für mein Thema hinzufügen würde und diesen Code dort einfügen würde. Dann könnte ich im Abschnitt "Layout-Update" einfach folgendes haben:

%Vor%

Also habe ich eine Datei namens vps_featured.xml erstellt und diese hinzugefügt:

%Vor%

Diese Layoutupdate-XML-Datei wurde in config.xml für mein benutzerdefiniertes Feature-Modul referenziert. Ich nahm naiv an, dass vps_featured.xml nur dann in das Seitenlayout integriert würde, wenn mein VPS-Featured-Block auf der Seite wäre, was nur in diesen wenigen Fällen auf speziellen CMS-Seiten passieren würde. Anscheinend ist das nicht der Fall. Das hat jede zweite Seite kaputt gemacht, denke ich, weil es das Standard-Handle überschrieben hat.

Das führt mich zu Frage 1: Wann sind die Layout-XML-Dateien im Seitenlayout enthalten? Werden sie für ALLE Seiten verwendet, unabhängig davon, ob das Modul, das auf sie verweist, tatsächlich verwendet wird?

Ich habe dann beschlossen, ein neues Layout-Handle hinzuzufügen, das ich auf meinen CMS-Seiten referenzieren kann. Ich habe meine Layout-XML-Datei so geändert, dass der Hauptteil in den <vps_featured_list> -Tags und nicht in den <default> -Tags liegt. Dies hat die anderen Seiten wieder zum Leben erweckt, aber meine CMS-Seiten funktionierten natürlich nicht mehr, weil das Layout-Update-Handle auf diesen Seiten nicht verwendet wurde. Ich habe versucht, <update handle="vps_featured_list" /> dem XML-Bereich für das Layout-Update der CMS-Seite hinzuzufügen, aber das hat nicht funktioniert (das habe ich nicht erwartet).

Das bringt mich zu Frage 2: Was ist der richtige Weg, dies zu erreichen?

Das hört sich nicht so schwer an, aber ich vermisse etwas. Ich habe alles gelesen, was ich auf Layouts finden kann, aber es sind immer einfache Beispiele, wie "füge das zu jeder Produktseite hinzu". Ich möchte nicht, dass etwas zu jeder cms Seite hinzugefügt wird ... nur ein paar von ihnen. Bleibe ich bei der Verwendung des XML-Layoutupdates für die betreffenden CMS-Seiten hängen? Ich habe das Gefühl, dass es einen saubereren Weg geben muss.

Danke,

Brian

    
BrianVPS 26.04.2011, 14:03
quelle

2 Antworten

17

Der Knoten <default/> ist ein sogenannter "Layout-Handle". Jede Anforderung in Magent generiert eine Anzahl dieser Handles. Rufen Sie die Registerkarte "Layout" auf der Commerce Bug-Demo-Website auf, um eine Vorstellung davon zu erhalten, welche Arten von Handles generiert werden.

Magento fasst alle XML-Layoutdateien in einem riesigen Baum zusammen, der als Paketlayout bezeichnet wird. Anschließend bestimmen Handles, welche Layout-XML-Update-Fragmente für eine bestimmte Anforderung verwendet werden. Diese Fragmente werden zum Seitenlayout zusammengefasst. Wie Sie erahnt haben, ist der <default/> - Handle immer hinzugefügt, weshalb Sie jede Site in Ihrem System betreiben.

Die schlechte Nachricht ist, während es ein Handle für CMS-Seiten gibt ( <cms_page_view /> ), wäre es immer noch eine Alles-oder-nichts-Affäre. Sie könnten etwas zu allen CMS-Seiten hinzufügen, aber nicht zu bestimmten CMS-Seiten. Also ja, der Layout-Update-XML-Bereich des CMS-Administrators ist "der richtige" Weg, um das zu tun, was Sie wollen.

Die gute Nachricht ist, dass es zwei Möglichkeiten gibt, die Sie ergreifen können, die sauberer sind als das, was Sie bisher herausgefunden haben. Zunächst können Sie die Dinge ein wenig aufräumen, indem Sie in Ihrer XML-Datei ein eigenes Handle definieren und dann einen speziellen Layout-XML-Befehl verwenden, um dieses Handle einzubeziehen.

Fügen Sie Ihr XML-Layoutaktualisierungsfragment in Ihrem XML-Code in ein benutzerdefiniertes Handle ein.

%pr_e%

Fügen Sie dann im CMS-Admin die folgenden XML-Layoutaktualisierungen für die gewünschten Seiten hinzu

%pr_e%

Magento ermöglicht Layout-Update-XML-Fragmenten das Hinzufügen zusätzlicher Handles zur Anfrage. Das machst du oben. Das räumt ein bisschen auf und wenn Sie etwas von der XML ändern möchten, gibt es einen zentralen Ort dafür.

Update : Es stellt sich heraus, dass das & lt; update / & gt; Befehl kann nur aus den Layout-XML-Dateien selbst verwendet werden. Der Code, der die Layoutaktualisierungs-XML für CMS-Seiten lädt, ist nicht derselbe Code, der Aktualisierungen für die XML-Dateien lädt und verarbeitet. Magento wird buchstäblich etwas in der CMS-Form als Layout-Update hinzufügen. Es wird es nicht für rekursive Updates verarbeiten. Also, so etwas wie local.xml hinzufügen würde funktionieren

%Vor%

Aber Sie können das nicht direkt mit einem Update tun, das über den CMS-Administrator angewendet wird. Lebe und lerne.

Alles in allem ist der Widget-Ansatz wahrscheinlich noch praktikabel, und eine Alternative zu den oben genannten wäre.

  1. Erstellen Sie ein benutzerdefiniertes Modul mit einer benutzerdefinierten Blockklasse

  2. Die Blockklasse gibt kein HTML aus

  3. Die Block-Klasse enthält eine einzelne Methode namens "addFooToLayout"

Fügen Sie dann auf Ihrer CMS-Seite ein Update wie folgt hinzu

%Vor%

und dann in Ihrer Blockdefinition

%Vor%

So etwas sollte funktionieren und ist etwas übersichtlicher (abhängig davon, wie viel Layout-Update-XML Sie hinzufügen möchten). Allerdings habe ich es nicht getestet und meine Glaubwürdigkeit ist auf diesem einen geblasen, also Käufer aufpassen.

Der zweite Ansatz besteht darin, ein einzelnes Widget zu erstellen, das die Elemente enthält, die Sie der Seite hinzufügen möchten, und dann das Widget zu verwenden Instanzadministrator, um dieses Widget bestimmten Blöcken auf bestimmten Seiten hinzuzufügen. Diese Links sollten dir den Anfang machen.

Schließlich habe ich auf eigene Gefahr ein Buch über Magento veröffentlicht Layouts , die diese Art von Problemen ausführlich behandeln. Es ist Ihre Zeit wert, wenn Sie daran interessiert sind zu verstehen, wie das gesamte System funktioniert.

    
Alan Storm 26.04.2011, 16:37
quelle
3

Trotzdem ist diese Frage schon ziemlich alt, ich habe sie über Google gefunden und möchte einige Informationen für diejenigen hinzufügen, die diesen Beitrag in Zukunft lesen werden.

Gestern, als ich diese Frage und Antwort gelesen habe, und auch das und diese Posts, ich bin ziemlich sicher geworden, dass das nicht möglich oder ziemlich schwierig ist Überschreiben / Erweitern des CMS-Seitenlayouthandles nur für bestimmte Seiten. Das hat mich dazu geführt, eine kleine Erweiterung zu entwickeln, die jedes benutzerdefinierte Layout-Handle in eine bestimmte Seite einfügt. Ich werde diesen Beitrag bald mit einem öffentlichen Link zu der Erweiterung aktualisieren.

Aber dann habe ich festgestellt, dass es tatsächlich möglich ist, einfach eine neue Vorlage für die CMS-Seite zu erstellen und ihr ein beliebiges benutzerdefiniertes Layout-Handle zuzuweisen, siehe diese Frage und Antwort von Marius zum Beispiel. Hier ist das wichtige Bit dieses Codebeispiels:

%Vor%

Es ist ziemlich einfach, ein beliebiges benutzerdefiniertes Layout-Handle auf jede Seite zu injizieren und alles, was Sie wollen, nur mit Seiten zu verwenden, die diese Vorlage und Ihr benutzerdefiniertes Layout-Handle verwenden. Ich wünschte, ich wüsste das vorher, hoffe, dass dieser Beitrag jemandem Zeit sparen wird.

    
Anton Boritskiy 07.11.2014 09:47
quelle

Tags und Links