Guide Magento Developpeur (Leçon 8) – Modifier / Réecrire un block dans Magento

25 août 2010

Ce tutoriel est le 8eme d’une longue série , si vous ne l’avez pas déjà fait je vous conseille de lire les tutoriels en commençant par le sommaire de cette série.

Parfois on a besoin de changer le fonctionnement de magento, on veut par exemple modifier le comportement d’un block pour afficher une information en plus sur un produit par exemple.

Dans ce tutoriel on va voir comment modifier un block de base de Magento. Quand on veut faire ce genre de modification, il vaut mieux garder en tête une des règles de base du développement magento (attention si je fais une interro…ca tombera !! xD ):

« On ne modifie JAMAIS les fichiers qui se trouvent dans le core »

Oubliez donc l’idée d’aller modifier directement les fichiers du répertoire /app/code/core.

A la place, on va surcharger ce Block c’est-à-dire créer une classe qui va étendre ce Block du core et réécrire seulement la partie qu’on veut modifier. Ensuite, pour pouvoir l’utiliser on la déclare dans notre fichier config.xml.

1- Commencez par recréer un module dans votre dossier Pfay que vous appellerez MonProduit

Créez donc le dossier :

/app/code/local/Pfay/MonProduit

Avec son etc/config.xml associé et n’oubliez pas de le déclarer dans le Pfay_All.xml (voir la leçon2 ).

2- Créez votre Block « modifié »

Ce qui nous intéresse c’est de réécrire le block Mage_Catalog_Block_Product_View, On va dire qu’on veut reecrire la méthode « afficherLesInfos » de se Block.

On va donc créer dans /app/code/local/Pfay/MonProduit/Block/Product/ un fichier View.php.

Qui contiendra :

Class Pfay_MonProduit_Block_Product_View extends Mage_Catalog_Block_Product_View{
 public function afficherLesInfos()
{
    return 'les infos complementaires';
}
}

3- Dites à Magento de prendre en compte la nouvelle version de ce block

Editez le config.xml de votre module MonProduit comme ceci et mettez dedans :

<?xml version="1.0"?>
<config>
 <modules>
    <Pfay_MonProduit>
        <version>1.0.0</version>
    </Pfay_MonProduit>
 </modules>
<global>
   <blocks>
    <catalog>
         <rewrite>
              <product_view>
                    Pfay_MonProduit_Block_Catalog_Product_View
               </product_view>
             </rewrite>
      </catalog>
  </blocks>
 </global>
</config>

Grâce à ces balises, on dit à Magento qu’on va configurer un block du module core qui s’apelle « catalog » et qu’on va réécrire (<rewrite>) le block « product_view » de ce module.

Il prendra ensuite Notre nouveau Block à la place de celui de base.

Conclusion:

Et voila ! Vous savez maintenant réécrire un block ;)

Comme d’habitude, N’hésitez pas à laisser vos messages en commentaire et mettre un liens vers ces tutoriaux sur vos sites internet. Ça fait toujours plaisir :)

Retrouvez le sommaire de ce tutoriel

JOvi # 24 octobre, 2010

Super.

Quelle est la différence entre cette réécriture de block et celle consistant en :
copie du fichier core à réécrire dans le répertoire “local” en gardant l’arborescence complète, et modifier ce dernier au lieu de celui du core. Dans ce présent cas, il n’y a pas de nouvelle classe à créer ni ajout dans le config.xml

Dans quel cas utiliser l’un, dans quel cas utiliser l’autre solution ?

Merci!

# 25 novembre, 2010 seb

J’ai eu un problème chez moi : page blanche.
pour résoudre le problème, il m’a fallu modifier le fichier config.xml et réécrire la balise Pfay_Test_Block_Catalog_Product_View

Il ne faut pas faire de retour chariot et/ou d’espace dans la valeur de la balise .

Voilà.

darz # 25 avril, 2011

Bonjour, merci pour vos tutos seulement j ai tout fait comme vous expliquez seulement j ai un probleme lorsque je vais sur un produit avec la surcharge du block, j obtiens cette erreur :

( ! ) Fatal error: Call to a member function addToChildGroup() on a non-object in C:\wamp\www\magento\app\code\core\Mage\Core\Block\Abstract.php on line 654

merci

# 4 octobre, 2011 clasie

Bonjour,

Petite question. Dans certains tutos montrant une procédure semblable ils est spécifié d’ajouter au global config, etc/modules/Monpackage_Monmodule.xml, l’élément suivant:

<depends> Mage_Catalog </depends>

Ici cela fonctionne sans.
Ma question: qu’elle est l’utilité de ce tag ?

Merci pour votre travail.
Clasie

Pierre FAY # 4 octobre, 2011

Merci Clasie, en fait ca veut dire que pour utiliser ce module, tu as besoin que le module Catalog de magento soit installé, ce qui est le cas par défaut dans le core donc en théorie pas besoin de ca dans les notres. (que quelqu’un me corrige si je me trompe mais je pense pas me tromper)

# 6 octobre, 2011 clasie

Merci pour la réponse.
Clasie

Nicolas # 15 novembre, 2011

Bonjour,

Merci pour tous ces tutos, ils sont très bien faits.
Toutefois sur celui-ci j’ai la même erreur que darz : Fatal error: Call to a member function addToChildGroup() on a non-object in \app\code\core\Mage\Core\Block\Abstract.php on line 759

Est-ce lié à la version de Magento ?

Merci d’avance,
Nicolas.

# 15 novembre, 2011 Nicolas

En réponse à Darz et en complément du commentaire de Seb :

Ne pas écrire :

Pfay_MonProduit_Block_Product_View

Mais :
Pfay_MonProduit_Block_Product_View

Nicolas.

Nicolas # 15 novembre, 2011

Souci avec les balises, nouvel essai…

Ne pas écrire :
[product_view]
Pfay_MonProduit_Block_Product_View
[/product_view]

Mais :
[product_view]Pfay_MonProduit_Block_Product_View[/product_view]

# 26 décembre, 2011 Pidoux75

Re à tous :)

J’espère déjà que vous avez passé un joyeux Noël et de bonnes fêtes ;)

En fait, pour le soucis avec l’erreur “Fatal Error”, suffit de ne pas mettre le “_Catalog_” dans la définition de product_view du config.xml vu qu’il n’y a pas de répertoire “Catalog” entre “Block” et “Product” ‘si vous voulez le laisser, alors il faut créer la même arborescence (Block/Catalog/Product/View.php) et aussi ajouter “_Catalog_” dans le nom de la classe appelée dans le View.php (Pfay_MonProduit_Block_Catalog_Product_View)

Par contre ce que je ne comprends pas, c’est qu’à première vue cela ne change rien chez moi dans l’affichage avec la nouvelle view ??

Pidoux75 # 26 décembre, 2011

C’est re-moi…

Désolé de pas comprendre tout, mais en fait ça fonctionne pas du tout…

Déjà, soit manque un truc dans le tuto, vu que la fonction crée dans le nouveau View.php (afficherLesInfos()) n’est jamais appelée, ça ne risque pas d’afficher grand chose (si la classe est au moins appelée, ce qui ne semble pas être mon cas ;)

# 24 janvier, 2012 eddz

Pour tous ce qui rencontre des problèmes notez bien que dans config.xml la ligne 10 et 12 renseigne le chemin vers la
classe du core à savoir Catalog/Product/view.php, tandis que la signature présente entre les balises [product_view] et [/product_view] renseigne la classe surchargé dans votre module.

Enjoy !!!

Olivier.D # 25 janvier, 2012

Nickel, on commence à le connaître ce config.xml !
Une fois de plus merci ~

# 20 mars, 2012 Netty

Quelqu’un peut m’expliquer comment je peux tester?
Je ne sais pas comment je peux vérifier si ca marche ou pas. Quel lien je dois aller?
Merci

Mobinaute # 26 septembre, 2012

Bonjour,

Merci encore une fois pour ces excellents tutoriels.
J’essaye de surcharger un block d’un module placé dans le dossier community, mais ça ne marche pas comme je l’espérait! est ce que la surcharge concerne seulement les modules du core?

Merci de m’éclairer sur ce point

# 27 septembre, 2012 Mobinaute

Bonjour,

Je m’excuse pour la question, il n’y a pas de différence ! la surcharge marche super bien. le problème venait de cette fameuse erreur d’espace entre les balises. Avec Magento, faut toujours faire attention au moindre détail!

Merci :)

Guillaume # 24 octobre, 2012

Je confirme l’erreur dans le tuto : le cotenu de la balise product_view de config.xml est faux :

Mynamespace_Myproduct_Block_Catalog_Product_View, Catalog est en trop car le dossier associé n’existe pas. De plus, Catalog est le nom de module du core, ici chez nous c’est Myproduct.

Donc il faut mettre : Mynamespace_Myproduct_Block_Product_View.

En production, je conseillerai même : Nomdushop_Catalog_Block_Product_View comme arborescence histoire de ne pas s’emmeler et savoir qu’on modifie bien le module Catalog du core ;)

A+, merci pour le tuto !

# 12 février, 2013 Sniteiru

merciiiiiiiiiiiii Pierre vivement tes tutos XD

data-j@ck # 14 janvier, 2014

Merci pour ce tuto très simple.

Dommage tout de même, modifier le fichier View.php du module Catalog/Product/ s’avère pas très pertinent pour en voir des résultats.

Je me suis donc rabattu vers le fichier List.php et la méthode getMode(), et là ok, on peut voir la surcharge fonctionner rapidement.

Très pratique, très utile, très simple. Incontournable petit tuto magento.

Vous aussi donnez votre avis
(requis)



Expert magento sur Lille - Pierre FAY
Rechercher dans le site :