Création d’un module magento 3/3 : Ajout d’un block

novembre 7, 2009 29 Commentaires

Dans les précédents tutoriels consacrés à la création de modules magento, nous avons vu comment créer un module, le référencer lui ajouter un controller et un layout. Notre module contient deux dossiers un controllers et un etc. Nous allons ajouter un autre élément important du module un block en créant un dossier Block qui contiendra un fichier monblock.php avec une méthode que nous appellerons dans un phtml.

Configuration du dossier Block de notre Module

Il faut déclarer notre block dans le fichier config.xml du module. Il se trouve dans

app\code\local\Magentocreation\Module\etc\config.xml

Dans le noeud config rajouter ce code :

<global>
	<blocks>
            <module>
		<class>Magentocreation_Module_Block</class>
	   </module>	
        </blocks>
</global>

Explication du code :
Magento déclare le block grâce à la balise block vient,ensuite le nom du module. Ici c’est module. Je vous rappelle que nous travaillons depuis le début dans un nameSpace « Magentocration » et notre module est nommé Module. Il est important de noter que dans la déclaration de Block le nom du module est écrit sans majuscule. On déclare le chemin vers les fichiers de notre block =>Magentocreation_Module_Block. Vous devez donc créer un dossier Block dans :
app\code\local\Magentocreation\Module\

Création du fichier block

A l’intérieur du dossier block créez un fichier php nommé « monblock.php » contenant ce code

<?php
 
class Magentocreation_Module_Block_monblock extends Mage_Core_Block_Template
{
			public function methodblock()
			{
			$message = '<h1>salut le block magento</h1>';
			return $message;
			}
}

Notez que le nom de la classe reprend le chemin vers celle-ci. Nous sommes dans le nameSpace « Magentocreation » dans le module « Module » dans le dossier « Block » et enfin dans le fichier « monblock.php ».
Dans cette classe créez une simple méthode methodblock() qui affiche un message « salut le block magento ». Cette classe étend la classe Mage_Core_Block_Template.
Notre block est maintenant déclaré et accessible, nous allons nous en servir au travers du layout crée lors du précédent tutoriel sur les modules magento 2/3.

Ajout instruction dans le layout

Dans le noeud content du layout « aveclayout.xml « rajouter ce code :

<block type="module/monblock"  name="montemplateun"  template="magentomodule/montemplateun.phtml"/>

voici le code complet

<reference name="content">
  <block type="core/template"  name="montemplate"  template="magentomodule/montemplate.phtml"/>
  <block type="module/monblock"  name="montemplateun"  template="magentomodule/montemplateun.phtml"/> 
 
</reference>

Ce code rattache notre block « monblock.php » à un nouveau template « montemplateun.phtml que vous devez créer dans le dossier template de votre thème. Ce template aura donc accès à toutes les méthodes de la casse monblock.php ainsi que toutes les classes étendues par celle-ci.

Mise en application

Toujours avec cette url http://localhost/magento/Magentocreation-Module/index/aveclayout le contenu de montemplate.phtml s’affiche.
Pour afficher le contenu de montemplateun.phtml allez dans le fichier montemplate.phtml et appelez le template grâce à la méthode getChildHtml()

<?php echo $this->getChildHtml() ?>

Placez du contenu dans montemplateun.phtml ce code :

<?php
 echo "template appelé via getChildHtml()";
 echo $this->methodblock(); ?>

Voici le résultat la première partie correspond au tutoriel numéro 2 sur les modules, le bas de la page à ce tutoriel. Vous voyez le contenu de la méthode methodeblock() s’afficher.

Le block est rattaché à notre template, vous avez accès à ses méthodes

Le block est rattaché à notre template, vous avez accès à ses méthodes

Code
29 commentaires : “Création d’un module magento 3/3 : Ajout d’un block”
  1. Nicolas dit :

    Bonjour,

    J’ai suivi à la lettre le tuto, mais impossible d’afficher le contenu du block.

    Pour la partie 2/3 création d’un module avec layout, tout fonctionne.

    Pour information, si je change le type= »module/monblock » par type= »core/template », j’ai bien le message « template appelé via getChildHtml() ».

    j’ai retiré l’appel de la fonction (monblock) pour faire des tests.

    D’ou peut provenir le problème ?

    Voici le contenu du fichier aveclayout.xml

    page/3columns.phtml

    Cordialement

  2. cédric rousset dit :

    Bonjour,
    je n’ai pas reçu le code, mais wordpress le supprime il faut que tu l’entoures de
    <pre lang = »php »>

    </ pre>

    Tu sa suivie le tutoriel depuis le début 1/3 2/3 3/3
    tu sa les mêmes noms de modules et de block ?
    re poste ton code entouré des balises.

  3. ctito17 dit :

    J’ai eu le même probleme et en fait dans

    il faut vérifier que « module » est bien le nom du module que tu as choisi et ça fonctionnera mieux

    Enjoy

  4. ctito17 dit :

    oups pardon je fais référence à ce code :

    
    
    		
  5. cédric rousset dit :

    On ne vois pas le code dans les commentaires il faut l’entouré des balises pre lang= »php » pre
    mais vous avez trouvez la solution pour le code.

  6. Gauthier dit :

    Idem ici, le block ne s’affiche pas…

    De plus j’ai une erreur si je force le type en « core/template »

    Erreur:Invalid method Mage_Core_Block_Template::methodblock

    Qu’avez vous changer dans l’attribut type pour que cela fonctionne ?

    Mon controller: Entropia
    Mon module: Reader

    Merci d’avance

  7. cédric rousset dit :

    Bonjour
    Fais le module magento avec exactement les mêmes noms que j’ai mis, tu verras, que ça marche. Ensuite tu pourras essayé de personnalisé comme bon te semble :)

  8. Gauthier dit :

    Re !

    Je viens de refaire avec les noms exactement comme dans ton tutorial, et… Ca ne marche pas…

    Le block ne s’affiche pas…

    Et si je change le type en core/template, j’ai tjs mon erreur
    Invalid method Mage_Core_Block_Template::methodblock

    Là je coince…

    Je suis en 1.4.0.1

  9. sly dit :

    pour le block, vérifie que tu as nommé ton fichier Monblock.php
    Hier ça ne fonctionnait pas non plus pour moi et comme les noms de classes doivent commencer par des Maj. avec Zend, j’ai fait la modif ce matin et maintenant le bloc s’affiche bien.

  10. Cedric dit :

    Bonjour,

    j’aurais une question pas vraiment importante pour le moment mais qui pourrait l’etre a l’avenir O_o .

    J’ai bien fais comme vous l’avez indiqué, cependant, l’affichage du block se fait en haut de page, et je n’arrive pas a modifier ca. Comment faire ?

    Merci d’avance :)

  11. cédric rousset dit :

    Bonjour,
    En haut de la page c’est normal. ou voulez vous le placer?

  12. Cedric dit :

    J’aimerais par exemple le placer en bas de page, ou au milieu ou que sait je. Je ne cherche pas vraiment a positioner a un point spécial, je cherche juste a savoir comment changer la position ^^. Je parle bien du message qu’affiche montemplateun.phtml .

    Merci d’avance :) .

  13. Cedric dit :

    J’ai trouvé. En faite, c’est bien le fichier prévu pour ça qui le permet. J’avais modifié le layout en local, mais j’ai oublié de le renvoyer sur le serveur… je me disais bien que quelque chose n’allait pas XD . Désolé !!

    Merci beaucoup pour ce tuto, et bonne continuation.

  14. Genius5000 dit :

    Bonjour à tous,

    je pense avoir trouvé pourquoi l’affichage du « template appelé via getChildHtml() » ne marche pas.

    Voici ce qu’indique le tuto pour aveclayout.xml :

    <reference name="content">
          <block type="core/template" name="montemplate" template="magentomodule/montemplate.phtml"></block>
          <block type="module/monblock" name="montemplateun" template="magentomodule/montemplateun.phtml"></block>
        </reference>

    Et voici ce que j'ai fais (et ça fonctionne sans soucis) :

     

    En espérant que cela vous a aidé!

  15. cédric rousset dit :

    Salut merci pour la rectification en effet il y avait une erreur dans le code.

  16. Cédric dit :

    Bonjour,

    j’ai testé un peu le code que vous avez fait en le modifiant pour voir le comportement de tout ça et j’ai un autre petit soucis.

    Dans montemplate.phtml, j’ai retiré l’appel à la fonction getchildhtml, mais l’affiche de montempateun.phtml se fait toujours. Est ce normal ? Si oui, à quoi cela nous serre alors cet appel dans l’exemple ? O_o

    Sinon, j’arrive pas à voir la correction faite par Genius, je vois le champ vide, quelqu’un pourrait il reposter la modif ? D’ailleurs, c’est bizarre. Si on compte pas mon fouarage concernant le nom d’un dossier, pour moi, ça a marché du premier coup.

  17. Genius5000 dit :

    @ Cédric :
    Ma correction est désormais inutile, l’auteur de l’article a directement modifié son code ;)

  18. cédric rousset dit :

    Salut,
    Oui j’ai modifié le code car tous le monde ne regarde pas les commentaire. C’est normal que je mette des coquilles dans le code ça vous aide a être vigilant ^^

  19. Cédric dit :

    Serait il possible de changer cette phrase en mettant bien que le fichier doit s’appeler Monblock.php avec un « M » majuscule ? Je faisais de la customisation avec des requetes sur la base et j’ai rajouter un block pour voir les resultats en suivant votre tuto, et j’ai bien reperdu 30 minutes a verifier mes requetes plutot qu’a mettre un « M » XD ! Je fais la demande pour moi, mais aussi et surtout pour les futurs visiteurs de ce tuto :) .

    C’est cette phrase :

    « Création du fichier block

    A l’intérieur du dossier block créez un fichier php nommé « monblock.php » contenant ce code »

    Merci d’avance.

  20. Louis dit :

    Bonjour,

    Je ne comprend pas comment fonctionne getChildHTML. J’ai fais des testes en enlevant la fonction getChildHTML dans mon template, mais le second template est toujours appeler. Mon code de layout est identique au votre. J’effacé tous ce que j’avais dans montemplate.phtlm pour voir si cela affiche toujours mon second templates, etben oui !! Pourquoi ? est ce que j’ai manqué quelque chose ?

  21. cédric rousset dit :

    Bonjour,
    Voici des précisions sur la méthode getChildHtml()
    http://bloggento.fr/getchildhtml-/1398

  22. fatima dit :

    Salut,
    pour que getChildHtml() ça fonctionne correctement, il faut que le 2eme block soit inclus dans le premier block comme le code ci-dessous indique :

    Crdlt.

  23. fatima dit :

    le code :

    <reference name="content">
          <block type="core/template" name="montemplate" template="magentomodule/montemplate.phtml">
             <block type="module/monblock" name="montemplateun" template="magentomodule/montemplateun.phtml" />
     
          </block>
        </reference>
  24. cédric rousset dit :

    Merci pour le code voici un tutoriel sur getChildHtml()
    http://bloggento.fr/getchildhtml-/1398

  25. seb dit :

    Un grand merci pour ce tuto très bien fait et qui m’a permis d’y voir plus clair dans la création de block.

  26. HENNEBERT dit :

    après la réalisation du tuto j’ai eut quelques soucis pour la prise en compte du template et donc j’ai simplement remplacé le nom du fichier monblock.php par Monblock.php, j’ai donc rajouté une majuscule !!

  27. cédric rousset dit :

    Salut,
    Et oui il y a un piège c’est pour tromper l’ennemi :)
    Il faut que je change dans le tuto merci pour le retour

  28. Elianora la blanche dit :

    Bonjour et merci pour ce tuto.

    J’aimerais maintenant appeler mon block ailleurs que dans le module créé.
    Est-ce possible ? Si oui, comment ?
    Merci d’avance.

    Elianora

  29. Pakito dit :

    Merci Cedric pour ces tutos :)
    j’ai réussi, j’avais juste eu un petit problème ^^

    dans « aveclayout.xml »

     

    Je sais pas si le code sera visible, donc j’explique ^^
    J’ai mis montemplateun.phtml dans un dossier template dans mon theme. donc dans aveclayout.xml, j’ai modifié magentomodule/template/montemplateun.phtml

    Voila :) encore merci

Poster un commentaire

(obligatoire)

(obligatoire)