Untergeordneter Block kann nicht zur Produktliste hinzugefügt werden

7

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_listkorrekt funktioniert, indem ich sehe , ob product_list_toolbarer 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_listanderen hinzugefügt wird product_list_toolbar. Gibt es also etwas an diesem Block, das das Hinzufügen von Kindern nicht funktioniert?

Tyler V.
quelle
Eigentlich ist das eine gute Frage und ich verstehe nicht, warum die Community versucht, diese Frage zu schließen! Dies ist sicherlich keine meinungsbasierte Frage. Wir sollten uns über diese Art von Fragen freuen.
Rajeev K Tomy

Antworten:

8

Hier geht es um die Reihenfolge, in der die Blöcke im Layout-XML angegeben sind.

catalog_category_viewist technisch gesehen das richtige Handle, ABER in diesem Handle existiert der product_listBlock (noch!) nicht.

Der product_listBlock wird nur in den Handles catalog_category_defaultund erstellt catalog_category_layered. (Und diese Handles werden später in der XML als angegeben catalog_category_view.)

Kurz gesagt, wenn das gesamte Layout-XML zusammengeführt wird, wird Ihr Verweis auf product_listnicht ausgeführt, da er zu diesem Zeitpunkt noch nicht vorhanden ist.

Die Lösung besteht darin, Ihren Block in beiden hinzuzufügen catalog_category_defaultund catalog_category_layeredODER Ihr eigenes benutzerdefiniertes Handle zu erstellen, Ihren Block in dieses Handle einzufügen und die <update>Anweisung zu verwenden, um Ihr Handle in catalog_category_defaultund einzuschließen catalog_category_layered.

Hoffe das hat bei dir geklappt.

Erfan
quelle
Jede Seite mit catalog_category_layeredscheint auch so zu sein, catalog_category_defaultdass es scheint, dass ich nur brauchte catalog_category_default. Davon abgesehen war dies genau richtig und half mir zu verstehen, warum es das tat. Vielen Dank.
Tyler V.
@ TylerV. Sie sind falsch in Ihrem Kommentar. Siehe meine Antwort für weitere Details.
Rajeev K Tomy
3

In der Tat catalog_category_viewwird 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) )

  0 => 'default'
  1 =  'STORE_default' 
  2 => 'THEME_frontend_rwd_default'
  3 => 'catalog_category_view'
  4 => 'catalog_category_layered' 
  5 => 'CATEGORY_4'
  6 => 'customer_logged_out'
  7 => 'SHORTCUT_popup'
  8 => 'SHORTCUT_uk_popup' 
  9 => 'product_list' 

Dies bedeutet, dass bei der Magento-Prozessaktion loadLayoutzuerst das defaultLayout-Handle berücksichtigt und die in diesem Layout-Handle definierten Blöcke durch Layout-Aktualisierungsdateien eingeschlossen werden. Dann wird es verarbeitet STORE_defaultund so weiter. Dies bedeutet, dass das catalog_category_viewLayout-Handle vor catalog_category_defaultoder verarbeitet wird catalog_category_layered. Dies ist der wichtige Punkt, den Sie hier beachten sollten.

Magento definiert einen product_listBlock innerhalb des Layout-Handles catalog_category_defaultund catalog_category_layered. Da catalog_category_viewdie Verarbeitung kurz vor diesen beiden Layout-Handles erfolgt, ist der product_listBlock, 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

  1. Standardkategorie
  2. geschichtete Kategorie

Magento fügt layout update handlefür diese beiden Kategorien unterschiedliche Kategorien hinzu. Denn default categorieses wird nur verarbeitet catalog_category_default. layered cateogriesNur für Magento-Prozess catalog_category_layered. In beiden Fällen wird Magento definitiv verarbeiten action layout handle catalog_category_viewund category specific layout handle CATEGORY_{ID}. Kurz gesagt, action layout handlewird für jede Kategoriesichtseite verarbeitet. (Das kategoriespezifische Layout-Handle ist für verschiedene Kategorien unterschiedlich.) Siehe den Beweis hier

Datei : app/code/core/Mage/Catalog/Model/Category.php

public function getLayoutUpdateHandle()
{
    $layout = 'catalog_category_';
    if ($this->getIsAnchor()) {
        $layout .= 'layered';
    }
    else {
        $layout .= 'default';
    }
    return $layout;
}

see catalog_category_layeredwird nur dann in die Layoutaktualisierung aufgenommen, wenn die isAnchorEigenschaft der Kategorie auf gesetzt ist yes(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.

Rajeev K Tomy
quelle
Sie haben Recht catalog_category_layeredund catalog_category_defaulterscheinen nicht zusammen. Ich habe sie gesehen catalog_category_layered_nochildrenund durcheinander gebracht. Seltsamerweise catalog_category_layered_nochildrenwird auch bei nicht geschichteten Kategorien hinzugefügt.
Tyler V.
catalog_category_layered_nochildrenwird 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?
Rajeev K Tomy
0

Ich habe meine Referenz und Aktualisierung unter das Handle gestellt, catalog_category_viewaber der product_listBlock ist unter dem Handle definiert catalog_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.

Tyler V.
quelle