Ajouter un bloc à la disposition de manière dynamique dans l'observateur d'événements


8

Je veux savoir comment utiliser layout.xml avec l'observateur d'événements.

Je souhaite afficher un message en pied de page lorsque le paiement a été effectué avec succès.

Je sais que je dois utiliser l'événement checkout_onepage_controller_success_action

Comment utiliser le contrôleur ou layout.xml avec l'observateur d'événements?

Réponses:


13

L'événement checkout_onepage_controller_success_actionest déclenché juste avant le rendu de la mise en page, vous pouvez donc toujours le manipuler.

L'observateur ne reçoit que l'ID de commande en tant que paramètre, vous devez donc obtenir la mise en page via le modèle d'application:

$layout = Mage::app()->getLayout();

Vous pouvez maintenant effectuer vos modifications par programme, comme ceci:

$messageBlock = $layout->createBlock('core/template', 'payment_message_block');
$messageBlock->setTemplate('payment_message.phtml');
$layout->getBlock('footer')->append($messageBlock);

Si vous utilisez l' controller_action_layout_load_beforeévénement, vous pouvez également charger un descripteur de mise en page personnalisé comme celui-ci, si sur la page de réussite:

if ($observer->getAction()->getFullActionName() === 'checkout_onepage_success') {
    $layout = $observer->getLayout();
    $layout->getUpdate()->addHandle('custom_layout_handle');
}

que vous pouvez définir en XML:

<layout>
  <custom_layout_handle>
     <reference name="footer">
       <block type="core/template" name="payment_message_block" template="payment_message.phtml" />
     </reference>
  </custom_layout_handle>
</layout>

Mise à jour: le bloc de pied de page est mis en cache, nous devons donc nous assurer qu'une version différente est extraite du cache si le message est présent. Par exemple:

$footer = $layout->getBlock('footer');
$footer->setCacheKey(sha1($footer->getCacheKey() . '-payment-message');

comment passer des données générées au fichier phtml? que je montre

Référencez votre bloc par son nom et son utilisation setData(). Par exemple:

$block = $layout->getBlock('payment_message_block')->setData('messsage', 'Hello');

Et dans le modèle:

echo $this->getData('message');

1
Je ne suis pas sûr que cela fonctionne pour le bloc de pied de page. Cela fonctionnerait pour presque n'importe quel autre bloc, mais lorsque le cache est activé, le pied de page est mis en cache et il peut ne pas afficher le message.
Marius

Bon point @Marius, si possible j'essaierais d'utiliser before_body_endce qui n'est pas mis en cache
Fabian Schmengler

Oui, ça devrait marcher.
Marius

Si elle doit l'être footerpour des raisons de conception, j'ai ajouté une solution qui modifie la clé de cache.
Fabian Schmengler du

c'est pourquoi je suis également confus car dans la mise en page, rien ne mentionne l'observateur. que j'ai trouvé avant de soumettre une question ici
Rahul Chaurasia
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.