イベントオブザーバーでレイアウトにブロックを動的に追加


8

イベントオブザーバーでlayout.xmlを使用する方法を知りたい。

支払いが完了したときにメッセージをフッターに表示したい。

私はイベントを使用する必要があることを知っています checkout_onepage_controller_success_action

イベントオブザーバーでコントローラーまたはlayout.xmlを使用する方法

回答:


13

イベントcheckout_onepage_controller_success_actionはレイアウトがレンダリングされる直前にトリガーされるため、引き続き操作できます。

オブザーバーは注文IDをパラメーターとしてのみ受け取るため、アプリモデルを介してレイアウトを取得する必要があります。

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

これで、次のようにプログラムで変更を行うことができます。

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

controller_action_layout_load_beforeイベントを使用する場合は、成功ページで次のようにカスタムレイアウトハンドルをロードすることもできます。

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

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>

更新:フッターブロックはキャッシュされるため、メッセージが存在する場合は、異なるバージョンがキャッシュからフェッチされることを確認する必要があります。例えば:

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

生成されたデータをphtmlファイルに渡す方法は?私が見せているのは

名前でブロックを参照し、を使用しますsetData()。例えば:

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

そしてテンプレートで:

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

1
これがフッターブロックで機能するかどうかはわかりません。他のほぼすべてのブロックで機能しますが、キャッシュが有効になっている場合、フッターはキャッシュされ、メッセージが表示されない可能性があります。
マリウス

良い点@Marius、可能であれば、before_body_endキャッシュされていないものを使用しようとします
Fabian Schmengler

うん、それはうまくいくはずです。
マリウス

footer設計上の理由で必要な場合は、キャッシュキーを変更するソリューションを追加しました。
Fabian Schmengler、2016年

レイアウトではオブザーバーに関連する言及がないため、私も混乱しています。ここで質問を送信する前に見つけた
Rahul Chaurasia
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.