Voyons ensemble aujourd’hui comment ajouter un block de contenu dans une page magento via les observers.
Pour l’exemple on va se baser sur la problématique suivante :
Je souhaite afficher un message particulier sur la page du panier pour les clients qui ne sont pas connectés.
Le contenu du message doit être gérable dans le backoffice via un block cms.

En analysant la structure du fichier de layout checkout.xml pour la page panier, on constate qu’il existe un noeud de type core/text_list dans lequel nous allons inserer le contenu.

<checkout_cart_index>
...
<block type="core/text_list" name="additional.product.info" translate="label">
<label>Additional Product Info</label>
</block>
</checkout_cart_index>

Pour réaliser cela nous allons créer un module. ( je ne détaille pas la procédure ) qui va se baser sur l’événement : controller_action_layout_generate_blocks_after
via le code suivant dans le fichier config.xml

<events>
 <controller_action_layout_generate_blocks_after>
  <observers>
   <test_add_block_layout_xml>
    <class>Hhennes_Tests_Model_Observer</class>
    <method>testAddBlockToLayoutXml</method>
   </test_add_block_layout_xml>
  </observers>
 </controller_action_layout_generate_blocks_after>
</events>

Puis voici le code de l’observer :

<?php 
class Hhennes_Tests_Model_Observer  {
  
  /**
   * Ajout d'un contenu dynamique dans le layout
   */
  public function testAddBlockToLayoutXml($observer) {
   
    $action = $observer->getAction();
    $layout = $observer->getLayout();
    
    //Sur la page du panier : On ajoute le texte d'un block cms
    if ( $action->getRequest()->getOriginalPathInfo() == '/checkout/cart/') {
 
      $additionnalBlock = $layout->getBlock('additional.product.info'); //Récupération du block parent auquel on veut ajouter le contenu
      $cmsBlock = $layout->createBlock('cms/block','test_block')->setBlockId('dresses-skirts'); //Création du block cms dans le layout
      $additionnalBlock->append($cmsBlock,'test_add_cms_block'); //Ajout du nouveau block au block parent
      
    }
    
  }
  
}

Avec ce principe il est ainsi possible d’ajouter facilement du contenu sur n’importe laquelle de vos pages, de manière programmable.