Unterschiedliche Toolbars in der Produktliste
Veröffentlicht am 22.08.2010 von jkuensebeck in der Schublade Magento-Templates | Tags: layout.xml, template | 2 Kommentare »Das Problem

Ich habe gerade dieses Design auf dem Tisch. Eine Produktliste, oben eine Toolbar mit Sortieroptionen, unten eine Toolbar mit Pager, bestimmt kein Problem: Die Template-Engine von Magento ist doch wie gemacht für so etwas.
Schauen wir mal ins Template:
<div class="category-products"> <?php echo $this->getToolbarHtml(); ?> ... Produktlisten-Ausgabe ... <?php echo $this->getToolbarHtml(); ?> </div>
Die Nicht-Lösung
$this->getToolbarHtml() ruft lediglich $this->getChildHtml(‘toolbar’) auf, also werde ich einfach zwei Mage_Catalog_Block_Product_List_Toolbar-Blöcke mit verschiedenen Templates erstellen und mit $this->getChildHtml(‘product_list_toolbar’) und $this->getChildHtml(‘product_list_toolbar2′) ins Template einfügen, à la:
... <catalog_category_default> <reference name="content"> <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml"> <block type="catalog/product_list" name="product_list" template="catalog/product/list.phtml"> <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar-sort.phtml" > <block type="page/html_pager" name="product_list_toolbar_pager"/> </block> <block type="catalog/product_list_toolbar" name="product_list_toolbar2" template="catalog/product/list/toolbar-pager.phtml"/> <block type="page/html_pager" name="product_list_toolbar_pager"/> </block> </block> </block> </reference> ... </catalog_category_default> ...
Super Lösung, ausser, dass sie nicht funktioniert: Die Toolbar wird gesondert behandelt, in Mage_Catalog_Block_Product_List_Toolbar::_beforeToHtml() wird der Toolbar-Block on the fly unter dem Name “toolbar” erstellt, mit den nötigen Daten (der Produkt-Collection und den Pager- und Sortieroptionen) befüllt und dann erst gerendert.
Die Lösung: 2 verschiedene Toolbar-Templates?
Die obere Toolbar behandeln wir einfach wie von Magento gedacht, sie wird per $this->getToolbar() in das Template eingefügt, dafür müssen wir im Layout-XML noch den Toolbar-Block-Namen registrieren:
... <catalog_category_default> <reference name="content"> <block type="catalog/category_view" name="category.products" template="catalog/category/view.phtml"> <block type="catalog/product_list" name="product_list" template="catalog/product/list.phtml"> <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar-sort.phtml"> <block type="page/html_pager" name="product_list_toolbar_pager"/> </block> <action method="setToolbarBlockName"><name>product_list_toolbar</name></action> <block type="catalog/product_list_toolbar" name="product_list_toolbar2" template="catalog/product/list/toolbar-pager.phtml"> <block type="page/html_pager" name="product_list_toolbar_pager"/> </block> </block> </block> </reference> ... </catalog_category_default> ...
Ausserdem haben wir eine weiteren Toolbar-Block unter dem Namen “product_list_toolbar2″ im XML angelegt. Damit wir diesen benutzen können, muss der Block aus dem PHP-Template heraus per $this->setToolbarBlockName(‘product_list_toolbar2′) als der Toolbar-Block registriert und per “$this->_beforeToHtml()” mit Daten befüllt werden.
Für die eigentlich Ausgabe kann dann $this->getChildHtml(‘toolbar’,false) aufgerufen werden, der zweite Parameter bewirkt, dass der Block-Cache umgangen wird (im Cache ist sonst noch die obere Toolbar hinterlegt):
<?php
$this->setToolbarBlockName('product_list_toolbar2');
$this->_beforeToHtml();
echo $this->getChildHtml('toolbar',false);
?>
ich bin nicht so wirklich zufrieden mit der Lösung: Gut ist, dass sie funktioniert, schlecht ist, dass sie den Layout-XML-Mechanismus und das Block-Caching umgeht, das Template vollmüllt, und es evtl. Seiteneffekte durch den doppelten Aufruf von _beforeToHtml() gibt.
Kennt jemand einen besseren Ansatz?
Ein an sich guter Ansatz, aber leider funktioniert es bei mir nicht auf V 1.4.2.0. welche Version hast du genutzt?
hat bei mir funktioniert (1.5.0.1). Danke.