Setzen Sie die Magento-Blockvorlage in das Layout-XML

8

Probleme beim Setzen einer Blockvorlage in Magento's Layout-XML. Ich versuche, die Vorlage eines Kindblocks zu setzen, nicht das gesamte Seitenlayout (fast alle Dokumente erklären, wie man die Vorlage des Layouts setzt).

Hintergrund: Ich aktualisiere ein Layout-Handle in meiner benutzerdefinierten Aktion mit dem <update /> -Tag im Layout-XML meines Moduls.

Im Wesentlichen möchte ich das Layout und die Blöcke der integrierten Produktansichtsaktion wiederverwenden, aber benutzerdefinierte Vorlagen für einige Blöcke bereitstellen. (Dies sind nicht nur Überschreibungen, sondern müssen auch neue Vorlagen sein, die nur bei meiner benutzerdefinierten Aktion ausgelöst werden und selbst außer Kraft gesetzt werden können).

Mein Layout html:

%Vor%

Das setTemplate auf product.info.bundle funktioniert nie; Es scheint das Layout überhaupt nicht zu beeinflussen. Ich habe versucht, die <reference> in anderen <reference> Knoten von übergeordneten Blöcken ohne Wirkung zu wickeln. Ist es möglich, Blockvorlagen auf diese Weise zu ersetzen? Ich glaube, dass mein Problem auf die Tatsache zurückzuführen ist, dass ich ein <update /> verwende.

Übrigens, ich weiß, dass mein Layout-XML geladen wird und es keine Fehler gibt, der Rest der Datei funktioniert einwandfrei, das Caching ist deaktiviert, der Cache wurde trotzdem gelöscht, usw.

    
Nick Daugherty 03.03.2012, 05:21
quelle

1 Antwort

18

Ihr Ansatz ist fast korrekt.
Zwei Dinge:
1. Legen Sie eine neue Vorlage fest, anstatt einen neuen Block zu instanziieren.
Anstatt dem Block product.info nur eine andere Vorlage zuzuweisen, erstellen Sie eine neue Instanz mit dem gleichen Namen, wobei die ursprüngliche Instanz ersetzt wird. Anschließend wird die neue Vorlage darauf festgelegt. Nutze stattdessen folgendes:

%Vor%

Das sollte die Produktansichtsvorlage auf eine saubere Weise kümmern.

2. Bearbeitungsreihenfolge bearbeiten
Wenn Sie sich ansehen, wo der View-Block product.info.bundle für die gebündelten Produkte deklariert ist, sehen Sie, dass er in der Datei bundle.xml in einem Layout-Update-Handle namens <PRODUCT_TYPE_bundle> passiert.

Ihr Code verweist auf den Block aus dem <[route]_[controller]_[action]> -Layout-Handle, d. h. <mymodule_product_index> .

Beachten Sie hier die Verarbeitungsreihenfolge von Layout-Handles. Grob gesagt ist es:

  1. <default>
  2. <[route]_[controller]_[action]>
  3. <custom_handles>

Das <PRODUCT_TYPE_bundle> handle gehört zum dritten Typ von Layout-Handles, was bedeutet, dass es nach dem <mymodule_product_index> handle verarbeitet wird.
Im Wesentlichen verweisen Sie auf den Block product.info.bundle , bevor er deklariert wurde.

Um dies zu beheben, müssen Sie auch das <PRODUCT_TYPE_bundle> Handle verwenden. Dies wirkt sich natürlich auf jede gebündelte Produktanzeige aus. Mit Layout-XML nur gibt es keine saubere Möglichkeit.

Hier sind ein paar Vorschläge, wie Sie dieses Problem lösen können.

Sie könnten in Ihrem Modul eine separate Route erstellen, um die gebündelten Produkte anzuzeigen, und dann das <PRODUCT_TYPE_bundle> -Zeichen mit einer update -Direktive für diese Seite ebenfalls einfügen.

In Ihrem benutzerdefinierten Aktionscontroller können Sie ein weiteres Layoutupdate-Handle hinzufügen, das nach <PRODUCT_TYPE_bundle> verarbeitet wird.

Sie können einen Ereignisbeobachter verwenden, um die Vorlage für den product.info.bundle -Block festzulegen, wenn sie instanziiert wird. Eine Möglichkeit wäre das Ereignis controller_action_layout_generate_blocks_after .

Sie bekommen die Idee, es gibt viele Möglichkeiten, dies zu umgehen, aber sie benötigen PHP.

    
Vinai 05.03.2012, 07:17
quelle

Tags und Links