Ich habe vor kurzem begonnen, das local.xml
als meinen Spielplatz für Layouts zu verwenden. Bevor ich meine Zweifel hatte, es aus ... Gründen zu benutzen.
Ich habe die Vorteile gesehen, aber jetzt bin ich gegen eine Mauer gestoßen.
In der Standardlayoutdatei catalog.xml
befindet sich ein bestimmter Block (Name nicht wichtig). Mit dem habe layout.xml
ich einen generischen untergeordneten Block hinzugefügt, in dem ich andere Blöcke platzieren möchte.
<reference name="not.important">
<block type="core/text_list" name="extra.left.menu" as="extra" />
</reference>
So weit, ist es gut.
Aber jetzt habe ich eine Erweiterung, die dem oben deklarierten einen untergeordneten Block hinzufügen soll.
Wenn ich diesen neuen Block hinzufüge local.xml
, funktioniert er gut.
<block type="core/text_list" name="extra.left.menu" as="extra">
<block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</block>
Ich möchte dies jedoch nicht tun, local.xml
da diese neue Erweiterung möglicherweise in Zukunft deaktiviert wird. Wenn ich es über local.xml
die Erweiterung mache und sie deaktiviere, werden meine Protokolldateien überflutet, da der Block nicht mehr existiert.
Also füge ich in meiner Erweiterungslayoutdatei Folgendes hinzu:
<reference name="extra.left.menu">
<block type="myextension/some_block" template="some/template.phtml" as="some_name" name="some_name" />
</reference>
Aber so funktioniert es nicht. Ich habe das Gefühl, dass dies passiert, weil die local.xml
Datei zuletzt geladen wurde und ich keine Modulabhängigkeit hinzufügen kann, sodass meine Erweiterungslayoutdatei danach geladen wird layout.xml
.
Wie soll ich das angehen? Habe ich etwas falsch gemacht?
Oder wenn ich es so will, muss ich die "gute alte Art" des Klonens catalog.xml
in meinem Thema verwenden und diesen neuen Block in das catalog.xml
meines Themas einfügen?
quelle
Antworten:
Beim Rendern des Layouts in Magento werden einige Schritte ausgeführt:
Warum funktioniert Ihr Beispiel nicht? Dies liegt daran, dass die Modul-XML-Datei vor der Datei local.xml geladen wird. Was passiert ist, dass das System zuerst versucht, einen Block zu einer Referenz (zu einem Block) hinzuzufügen, die noch nicht existiert.
So lösen Sie das Problem: Sie können ein Update verwenden. Updates werden vor den Handles platziert, in denen sie aufgerufen werden.
Und fügen Sie in Ihrer anderen Moduldatei den Block hinzu, wie Sie es getan haben.
quelle
default
über erfolgtlocal.xml
und Sie auf dasdefault
Layout-Handle selbst in einer benutzerdefinierten Layout-XML-Datei verweisen . Wenn Sie ein anderes Layout-Handle in dieser Datei verwenden, funktioniert es. Hab ich recht?local.xml
in einem Handlelocal_xml_handle
und das Markup aus der Erweiterungslayoutdatei in einem anderen Handle hinzugefügtextension_layout_handle
. Dann habe ich beidelocal.xml
nacheinander benutzt. Daher wird das Layout-Handle aus der Erweiterung nach dem ersten angewendet<default><update handle="local_xml_handle" /><update handle="extension_layout_handle" /></default>
. Wenn ich meine Erweiterung deaktiviere, gibt es keine,extension_layout_handle
sodass nichts geladen werden kann. Vielen Dank.Dies ist über LAYOUT XML FILES nicht möglich. Weil die
local.xml
Datei endlich geladen wird. Ein Block, der in einer local.xml-Datei "definiert" ist, kann daher nicht über eine andere Layoutdatei "referenziert" werden.Normalerweise werde ich jeden Beobachter verwenden, um in einer solchen Situation einen Block hinzuzufügen.
Es gibt jedoch einen alternativen Weg, denke ich. Sie können diesen Block im
default
Handle durchlocal.xml
Datei definieren. Jetzt eröffnet sich eine Verwendungsmöglichkeitlayout handles
, die nach demdefault
Layout-Handle von Magento berücksichtigt wird. Da der Block über dasdefault
Handle enthalten ist und Sie den Block über ein anderes Layout-Handle über Ihre eigene Layout-XML-Datei referenzieren, ist Magento jetzt über Ihren Block informiert, auch wenn er über einelocal.xml
Datei hinzugefügt wird.local.xml
your_layout.xml
BEARBEITEN
Zunächst möchte ich sagen, dass ich genug Zeit für dich habe :-)
Ich habe meinen Code getestet, indem ich eine Demo erstellt habe. Das habe ich versucht. Ich habe diesen Code in die
local.xml
Datei eingefügtDann habe ich unten Code direkt in die
catalog.xml
Datei eingefügt .Dann habe ich eine geschichtete Kategorie geladen, ich sehe dort Inhalte
test.phtml
davon. (Bitte nicht, ich habecore/template
Block als untergeordneten Block für diesen Testzweck verwendet. In Ihrem Fall wird er jedoch durch Ihren eigenen Block ersetzt. Aber es ist überhaupt kein Problem. Beide Fälle sind etwas gleich.)Mein Punkt ist also, dass diese Methode definitiv funktioniert. Ich bin mir in diesem Punkt sicher, weil ich diesen Trick schon oft benutzt habe und mein ultimativer Guru für das Magento-Layout @alanstorm ist :-)
quelle
extra.left.menu
Block direkt in dencontent
Block einfüge. Aber es ist nicht so, wenn ich es in einen anderen Block einfüge, der ein Kind voncontent
oder istleft
. Ich denke, das verdient eine +1. Wie auch immer, verbringen Sie keine Zeit mehr damit. Ich bevorzuge den Ansatz mit 2 Layoutgriffen. Wie ich in einem der Kommentare zu dieser Antwort erklärt habe: magento.stackexchange.com/a/41624/146 . Irgendwie ist es für mich sauberer.