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


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.