Fügen Sie dem Layout im Ereignisbeobachter dynamisch einen Block hinzu

8

Ich möchte wissen, wie layout.xml mit dem Ereignisbeobachter verwendet wird.

Ich möchte eine Nachricht in der Fußzeile anzeigen, wenn die Zahlung erfolgreich erfolgt ist.

Ich weiß, dass ich das Ereignis nutzen muss checkout_onepage_controller_success_action

Wie verwende ich controller oder layout.xml mit dem Ereignisbeobachter?

Rahul Chaurasia
quelle

Antworten:

13

Das Ereignis checkout_onepage_controller_success_actionwird unmittelbar vor dem Rendern des Layouts ausgelöst, sodass Sie es weiterhin bearbeiten können.

Der Beobachter erhält nur die Auftrags-ID als Parameter, daher müssen Sie das Layout über das App-Modell abrufen:

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

Jetzt können Sie Ihre Änderungen programmgesteuert wie folgt vornehmen:

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

Wenn Sie das controller_action_layout_load_beforeEreignis verwenden, können Sie auch ein benutzerdefiniertes Layout-Handle wie dieses laden, wenn Sie sich auf der Erfolgsseite befinden:

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

die Sie in XML definieren können:

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

Update: Der Fußzeilenblock wird zwischengespeichert, daher müssen wir sicherstellen, dass eine andere Version aus dem Cache abgerufen wird, wenn die Nachricht vorhanden ist. Zum Beispiel:

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

Wie werden generierte Daten an eine HTML-Datei übergeben? was ich zeige

Verweisen Sie auf Ihren Block nach Name und Verwendung setData(). Zum Beispiel:

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

Und in der Vorlage:

echo $this->getData('message');
Fabian Schmengler
quelle
1
Ich bin nicht sicher, ob dies für den Fußzeilenblock funktioniert. Es würde für fast jeden anderen Block funktionieren, aber wenn der Cache aktiviert ist, wird die Fußzeile zwischengespeichert und die Nachricht wird möglicherweise nicht angezeigt.
Marius
Guter Punkt @Marius, wenn möglich würde ich versuchen, das zu verwenden, before_body_endwas nicht zwischengespeichert ist
Fabian Schmengler
Ja, das sollte funktionieren.
Marius
Wenn es footeraus Designgründen sein muss, habe ich eine Lösung hinzugefügt, die den Cache-Schlüssel ändert.
Fabian Schmengler
deshalb bin ich auch verwirrt, weil im layout nichts mit beobachter zu tun hat. was ich gefunden habe, bevor ich hier eine Frage gestellt habe
Rahul Chaurasia