Le blog du pangolin

Accueil > Programmation > PHP > Magento 2 > Magento 2 Tuto 2.2 - Créer un block

Création de modules

Magento 2 Tuto 2.2 - Créer un block

mercredi 5 octobre 2016, par Super Pangolin

Le principe de bloc
Dans magento, tout est découpé en bloc.

Le but d’un site de vente en ligne est d’afficher des produits et leurs infos, de les sélectionner et de payer à la fin. On veut donc, basiquement, afficher des données sur un navigateur.

La finalité d’un bloc est donc d’afficher des informations mises en pages.

Un bloc peut être redécoupé en blocs plus petits : l’affichage d’un produit sera découpé en blocs photo, description, prix, ...

La classe contenant le code php du block
Nous allons créer un block basique dans notre module tout neuf. Ce bloc étendra de \Magento\Framework\View\Element\Template, la classe qui permet de générer de l’affichage. Souvent, on étend directement des blocs natifs de magento qui implémentent des méthodes utiles, comme par exemple vendor/magento/module-catalog/Block/Product/ListProduct.php qui permet d’étendre les listes de produits.

  1. <?php
  2. namespace Pangolin\ExtendedProducts\Block;
  3.  
  4. /**
  5.  * Block Message
  6.  */
  7. class Message extends \Magento\Framework\View\Element\Template
  8. {
  9.     public function getMessage()
  10.     {
  11.         return "Message qui sera bientôt configurable!!";
  12.     }
  13.  
  14.  
  15.     protected function _toHtml()
  16.     {
  17.         $html = parent::_toHtml();
  18.         if(empty($html)){
  19.             $html = '<div>'.$this->getMessage().'</div>';
  20.         }
  21.         return $html;
  22.     }
  23. }

Ici, la méthode getMessage renvoie un texte en dur et _toHtml redéfinit celle de la classe parente qui normalement ne renvoit rien si on ne définit pas de template (cf plus loin).

Insérer notre block dans une page
On passe par un « layout », un fichier xml qui définit le contenu des pages. Le nommage des layout est fonction du module, contrôleur et de l’action exécutée.

Par exemple, pour l’affichage d’une page produit, on passe par le contrôleur vendor/magento/module-catalog/Controller/Product/View.php.

Le nom du layout sera donc vendor/magento/module-catalog/view/frontend/layout/catalog_product_view.xml

Pour l’exemple, nous allons insérer notre bloc sur la page d’accueil du site. Son layout est vendor/magento/module-cms/view/frontend/layout/cms_index_index.xml car c’est une page générée par le cms (système de gestion de contenu) interne de magento.

Nous n’allons évidemment pas modifier ce fichier mais en créer un autre dans notre module.

Pour cela, on crée le répertoire view/frontend/layout à la racine de notre module. Dans mon exemple, ce sera app/code/Pangolin/ExtendedProducts/view/frontend/layout. A l’intérieur, on créer le fichier cms_index_index.xml. Maintenant, il faut réussir à insérer notre bloc dans la page. Il faudrait plusieurs tutos complets pour tout comprendre sur les layouts. Ici, nous allons insérer notre bloc au contenu de la page.

  1. <?xml version="1.0"?>
  2. <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  3.     <body>
  4.         <referenceContainer name="content">
  5.             <block class="Pangolin\ExtendedProducts\Block\Message" name="pangolin_extended_products_message" />
  6.         </referenceContainer>
  7.     </body>
  8. </page>

Petite explication : on se place dans le conteneur "content" (qui est compris entre le header et le footer) et on lui dit d’insérer le rendu de notre bloc. Comme nous ne précisons rien de plus, il sera en haut de la page. On reviendra sur les layouts dans un tuto ultérieur.

Bien entendu, nous sommes sous magento, tout changement dans un xml nécessite de vider les caches.

  1. php bin\magento cache:flush

Le rendu n’est pas terrible, mais notre bloc est bien pris en compte :

Dernière étape :

Utiliser un template

Les templates sont de simples fichiers phtml appelés dans le layout. Leur particularité est de connaître l’objet $block qui contient l’instance de notre classe de block.

Un fichier phtml contient du code html plus la balise php.

On stocke les templates du site dans le répertoire view/frontend/templates du module. Leur nommage est laissé à la discrétion du développeur ; ils peuvent être hiérarchisés dans des répertoires.

Nous allons en définir un simple. Appelons le app/code/Pangolin/ExtendedProducts/view/frontend/templates/message.phtml :

  1. <?php
  2. /**
  3.  * @var $block \Pangolin\ExtendedProducts\Block\Message
  4.  */
  5. $message = $block->getMessage();
  6. ?>
  7. <span class="info"><?php echo $message ?></span>

On modifie ensuite le layout pour qu’il prenne en compte notre template :

  1. <?xml version="1.0"?>
  2. <page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
  3.     <body>
  4.         <referenceContainer name="content">
  5.             <block class="Pangolin\ExtendedProducts\Block\Message" name="pangolin_extended_products_message"  template="Pangolin_ExtendedProducts::message.phtml" />
  6.         </referenceContainer>
  7.     </body>
  8. </page>

Télécharger

Le chemin du template comprend le nom du module (tel que défini dans le fichier module.xml) suivi de « : :» puis du chemin vers le fichier à partir du répertoire « template ».

Ça fonctionne, on peut nettoyer notre bloc et rajouter la méthode pour le rendre dynamique :

  1. <?php
  2. namespace Pangolin\ExtendedProducts\Block;
  3.  
  4. /**
  5.  * Block Message
  6.  */
  7. class Message extends \Magento\Framework\View\Element\Template
  8. {
  9.     /**
  10.      * @var string
  11.      */
  12.     protected $messageText = "Message par défaut";
  13.  
  14.     /**
  15.      * @param $message string
  16.      */
  17.     public function setMessage($message) {
  18.         $this->messageText = $message;
  19.     }
  20.  
  21.     /**
  22.      * @return string
  23.      */
  24.     public function getMessage()
  25.     {
  26.         return $this->messageText;
  27.     }
  28. }

La méthode setMessage pourra être appelée dans un bloc parent ou un contrôleur pour modifier le message. Ici, nous allons l’appeler dans le template, ce qui n’est pas très utile.

  1. <?php
  2. /**
  3.  * @var $block \Pangolin\ExtendedProducts\Block\Message
  4.  */
  5. $block->setMessage('Bienvenue sur ma boutique!!');
  6. ?>
  7. <span class="info"><?php echo $block->getMessage() ?></span>


Et voila !! Vous avez les bases pour créer vos blocs magento 2.

Un message, un commentaire ?

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides.