2011-08-05 7 views
2

J'ai un module best-seller que j'ai écrit et il fonctionne très bien, mais je veux pouvoir changer la taille de la collection qu'il renvoie via le XML, plutôt que le php/phtml.Magento Collection de produits Limiter via XML

Quelque chose comme ceci:

<block type="catalog/product_list" name="bestsellers" limit="3" 
template="custom/bestsellers.phtml" /> 

ou quelque chose comme:

<block type="catalog/product_list" name="bestsellers" 
template="custom/bestsellers.phtml"> 
     <action method="setLimit">3</action> 
    </block> 

Est-ce possible?

Je change actuellement la limite par le phtml avec:

->setPageSize(3) 
->setCurPage(1); 

Mais qui est codé en dur et méchant, je dois pouvoir utiliser mon fichier phtml comme modèle pour de nombreux cas du module de best-sellers être appelé de n'importe où avec la limite XML + dans le XML.

Merci d'avance si quelqu'un peut faire la lumière sur cela!

Répondre

4

Le bloc Mage_Catalog_Block_Product_List hérite de la classe Varien_Object qui contient les méthodes getData() et setData(), ainsi que les méthodes magiques get*() et set*(). Ces méthodes nous permettent de stocker (vous l'avez deviné) des données clés au sein d'un objet.

Les balises <action /> dans XML permettent d'effectuer des appels de méthode sur les instances de bloc. Vous y êtes presque avec votre deuxième exemple, mais la syntaxe est la suivante:

<block type="catalog/product_list" name="bestsellers"> 
    <action method="setLimit"><value>3</value></action> 
</block> 

ce qui équivaut à:

<block type="catalog/product_list" name="bestsellers"> 
    <action method="setData"><key>limit</key><value>3</value></action> 
</block> 

Ce qui est à peu près équivalent à:

$block = new Mage_Catalog_Block_Product_List(); 
$block->setLimit(3); 

Avec les données définir dans l'objet, nous pouvons maintenant accéder à travers les méthodes getData() ou get*() en appelant $this->getLimit() ou $this->getData('limit') en faisant notre code de bloc:

->setPageSize($this->getLimit()) 
->setCurPage(1); 

Vous devriez probablement effectuer une vérification de l'existence des données limit première et de fournir une valeur par défaut si aucun n'est fourni dans le fichier XML.

Remarque: Le nom des enfants dans la balise <action /> n'a pas d'importance. C'est l'ordre des arguments qui est important. Nous aurions tout aussi bien pu appeler <action method="setLimit"><foo>3</foo></action> et ça aurait encore marché.

+0

Merci beaucoup, cela fonctionne parfaitement! – mattpark22

Questions connexes