Unterschiedliche Toolbars in der Produktliste

Veröffentlicht am 22.08.2010 von jkuensebeck in der Schublade Magento-Templates | Tags: , | 2 Kommentare »

Das Problem

2 verschiedene Toolbars in Magento
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?


2 Kommentare zu “Unterschiedliche Toolbars in der Produktliste”

  1. 1 Stephan sprach am 11.03.2011 um 16:27:

    Ein an sich guter Ansatz, aber leider funktioniert es bei mir nicht auf V 1.4.2.0. welche Version hast du genutzt?

  2. 2 Marco sprach am 23.03.2011 um 14:47:

    hat bei mir funktioniert (1.5.0.1). Danke.