Nous contacter

Surcharger un block dans magento

PARLER DE MON PROJET

Une fonctionnalité de magento vous convient mais n'est pas aussi aboutie que vous le souhaitez? ou encore votre client souhaite un rendu différent? Nous allons étudier la procédure dans cet article.


Tout d'abord je vous invite à vous rendre dans le back office dans system configuration developper puis de choisir le niveau main website. Passez à Yes les options template path Hints et add block names to hints puis sauvegarder et purger les caches. Vous verrez apparaître les nom des fichiers de templates et block correspondants sur vos pages en frontend comme le monte la capture d'écran suivante :


Nous allons ici modifier le contenu du block Stock:

frontend/base/default/template/catalog/product/view/type/default.phtml

Mage_Catalog_Block_Product_View_Type_Simple

Mettre en place la surcharge dans le config.xml 

 Imaginons que votre namespace est valibus et que votre module s’appelle showstock

<global>
<blocks>
<showstock><class>Valibus_Showstock_Block</class></showstock>
<catalog>
<rewrite>
<product_view_type_simple>Valibus_Showstock_Block_Product_View_Type_Simple</product_view_type_simple>
</rewrite>
</catalog>
</blocks>
</global>

Comme vous le voyez on commence par déclarer l'emplacement des classes de block dans notre module, puis la surcharge ou héritage dans le module.

Pour comprendre la syntaxe de la réécriture c'est simple, on déclare d'abord le nom du module réécrit, on indique la balise rewrite puis entre les balises qui contiennent le nom du block du module d'origine ( <product_view_type_simple> ) on indique le nom de notre classe qui contient la réécriture.

Extension de la classe block du Core

Le plus simple (et plus cohérent) ici est de créer une arborescence identique à l'origine dans notre module, de plus, c'est évolutif au cas on aurait besoin de surcharger d'autres classes du même module.

<?php
class Valibus_Showstock_Block_Product_View_Type_Simple extends Mage_Catalog_Block_Product_View_Type_Simple {
public function checkOverStock() {
$product= $this->getProduct();
if($product->getStockItem()->getQty()>20){
return true;
}
return false;
}
}

Ici rien d’extraordinaire on définit juste une fonction qui teste si il y a plus de 20 item en stock, on peut la mettre en application en modifiant le template ainsi :

<?php if($this->checkOverStock()): ?>
<ul class="messages">
<ul>
<li>Beaucoup de stocks disponibles !</li>
</ul>
</ul>
<?php endif;?>
Livre

Découvrez les best practices en SEO

Téléchargez notre livre blanc SEO !