在事件观察器中动态将块添加到布局


8

我想知道如何在事件观察器中使用layout.xml。

付款成功后,我想在页脚中显示一条消息。

我知道我必须使用这个活动 checkout_onepage_controller_success_action

如何在事件观察器中使用controller或layout.xml?

Answers:


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,2016年

是的,应该可以。
— 马里乌斯

如果footer出于设计原因必须将其插入,则添加了一个更改缓存键的解决方案。
— Fabian Schmengler,

这就是为什么我也感到困惑的原因,因为在布局中没有提及与观察者相关的内容。在提交问题之前我被发现了
— Rahul Chaurasia
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.