Ich versuche, der Produktliste einen Block hinzuzufügen:
<?xml version="1.0"?>
<layout version="0.1.0">
<catalog_category_view translate="label">
<reference name="product_list">
<remove name="product_list_toolbar"/>
<block type="core/template" name="helloworld" as="helloworld" template="helloworld.phtml"/>
</reference>
<reference name="footer">
<block type="core/template" name="helloworld" as="helloworld" template="helloworld.phtml"/>
</reference>
</catalog_category_view>
</layout>
In catalog / product / list.phtml habe ich Folgendes :
<?php Zend_Debug::dump($this->getSortedChildren()); ?>
<?php echo $this->getChildHtml('helloworld'); ?>
In Seite / html / footer.phtml habe ich Folgendes :
<?php Zend_Debug::dump($this->getSortedChildren()); ?>
<?php echo $this->getChildHtml('helloworld'); ?>
Beachten Sie, dass ich nur hinzugefügt <remove name="product_list_toolbar"/>
habe, damit ich testen kann, ob mein Verweis auf product_list
korrekt funktioniert, indem ich sehe , ob product_list_toolbar
er aus der Liste der sortierten untergeordneten Elemente entfernt wurde. Es ist.
Was ich jetzt habe, ist identischer Code in der Produktliste und in der Fußzeile, und er funktioniert nur in der Fußzeile. Nach dem Graben kann ich keine Instanz eines Blocks finden, der zu einem product_list
anderen hinzugefügt wird product_list_toolbar
. Gibt es also etwas an diesem Block, das das Hinzufügen von Kindern nicht funktioniert?
quelle
Antworten:
Hier geht es um die Reihenfolge, in der die Blöcke im Layout-XML angegeben sind.
catalog_category_view
ist technisch gesehen das richtige Handle, ABER in diesem Handle existiert derproduct_list
Block (noch!) nicht.Der
product_list
Block wird nur in den Handlescatalog_category_default
und erstelltcatalog_category_layered
. (Und diese Handles werden später in der XML als angegebencatalog_category_view
.)Kurz gesagt, wenn das gesamte Layout-XML zusammengeführt wird, wird Ihr Verweis auf
product_list
nicht ausgeführt, da er zu diesem Zeitpunkt noch nicht vorhanden ist.Die Lösung besteht darin, Ihren Block in beiden hinzuzufügen
catalog_category_default
undcatalog_category_layered
ODER Ihr eigenes benutzerdefiniertes Handle zu erstellen, Ihren Block in dieses Handle einzufügen und die<update>
Anweisung zu verwenden, um Ihr Handle incatalog_category_default
und einzuschließencatalog_category_layered
.Hoffe das hat bei dir geklappt.
quelle
catalog_category_layered
scheint auch so zu sein,catalog_category_default
dass es scheint, dass ich nur brauchtecatalog_category_default
. Davon abgesehen war dies genau richtig und half mir zu verstehen, warum es das tat. Vielen Dank.In der Tat
catalog_category_view
wird für jede Kategorieansichtsseite verarbeitet und Sie haben ein Layout-Handle richtig ausgewählt. Das Problem hierbei ist jedoch, dass wir uns um die Reihenfolge kümmern müssen, in der Layout-Handles in Magento verarbeitet werden.In diesem Zusammenhang, dh für die Seite zum Anzeigen der Kategorie-Produktliste, werden Layout-Handles in dieser Reihenfolge verarbeitet (siehe) Magento-1.9.1)
Dies bedeutet, dass bei der Magento-Prozessaktion
loadLayout
zuerst dasdefault
Layout-Handle berücksichtigt und die in diesem Layout-Handle definierten Blöcke durch Layout-Aktualisierungsdateien eingeschlossen werden. Dann wird es verarbeitetSTORE_default
und so weiter. Dies bedeutet, dass dascatalog_category_view
Layout-Handle vorcatalog_category_default
oder verarbeitet wirdcatalog_category_layered
. Dies ist der wichtige Punkt, den Sie hier beachten sollten.Magento definiert einen
product_list
Block innerhalb des Layout-Handlescatalog_category_default
undcatalog_category_layered
. Dacatalog_category_view
die Verarbeitung kurz vor diesen beiden Layout-Handles erfolgt, ist derproduct_list
Block, auf den in Ihrer Definition verwiesen wird, völlig fremd und daher vernachlässigt Magento einfach den Inhalt darin.Über Ihren Kommentar
Ich denke, Sie haben es falsch verstanden. Es gibt zwei Arten von Kategorien, die auf dem Layout basieren. Sie sind
Magento fügt
layout update handle
für diese beiden Kategorien unterschiedliche Kategorien hinzu. Denndefault categories
es wird nur verarbeitetcatalog_category_default
.layered cateogries
Nur für Magento-Prozesscatalog_category_layered
. In beiden Fällen wird Magento definitiv verarbeitenaction layout handle
catalog_category_view
undcategory specific layout handle
CATEGORY_{ID}
. Kurz gesagt,action layout handle
wird für jede Kategoriesichtseite verarbeitet. (Das kategoriespezifische Layout-Handle ist für verschiedene Kategorien unterschiedlich.) Siehe den Beweis hierDatei :
app/code/core/Mage/Catalog/Model/Category.php
see
catalog_category_layered
wird nur dann in die Layoutaktualisierung aufgenommen, wenn dieisAnchor
Eigenschaft der Kategorie auf gesetzt istyes
(dies geschieht über die Administratorseite). Andernfalls wird es verarbeitetcatalog_category_default
Kurz gesagt : Die Reihenfolge, in der Layout-Griffe in Magento verarbeitet werden, ist in diesem Fall der Bösewicht und Held.
quelle
catalog_category_layered
undcatalog_category_default
erscheinen nicht zusammen. Ich habe sie gesehencatalog_category_layered_nochildren
und durcheinander gebracht. Seltsamerweisecatalog_category_layered_nochildren
wird auch bei nicht geschichteten Kategorien hinzugefügt.catalog_category_layered_nochildren
wird nur berücksichtigt, wenn die Anzeigekategorie keine untergeordneten Kategorien hat. Bei Kategorien, die einige untergeordnete Kategorien enthalten, wird dieses spezielle Layout-Handle nicht verarbeitet. Klingt das logisch?Ich habe meine Referenz und Aktualisierung unter das Handle gestellt,
catalog_category_view
aber derproduct_list
Block ist unter dem Handle definiertcatalog_category_default
. Es scheint, als sollte dies kaskadieren und trotzdem funktionieren, und ich lade jemanden ein, mir zu sagen, warum dies nicht der Fall ist. Das Ändern des für dieses Update verwendeten Handles hat das Problem jedoch behoben.quelle