我想知道是否每次加载页面时都会触发一次事件,然后再渲染为magento中的html?
如果您想为不依赖于用户会话的半静态属性执行某些业务逻辑,这可能很有用。
例如,我将使用它将规范标签传递给magento的标题。
答案 0 :(得分:39)
为大多数页面/内容生成请求分派了几个请求相关事件。下面是一些有用的处理顺序的部分列表,我希望其他人可以与其他人一起评论这篇文章。其中许多不适合您的需要(我在下面以粗体字注明您应该开始考虑的地方)。还有一些与块实例化相关的事件,尽管它们可能会出于您的目的而被观察到,但它们对于每个块都是通用的,并且实际上并不合适。
第一个实际的单发事件是controller_front_init_before
。在Front Controller初始化中调度此事件以响应所有已分派的请求。因为在调用操作控制器之前调度它,所以只有全局区域的观察者才能观察到这个事件。
假设请求从Front Controller通过路由器路由到动作控制器,有一些events which can be observed prior to rendering in preDispatch()
- 请注意可以为所有事件vs使用的通用controller_action_predispatch
事件句柄两个动态事件句柄:
Mage::dispatchEvent('controller_action_predispatch', array('controller_action' => $this));
Mage::dispatchEvent('controller_action_predispatch_' . $this->getRequest()->getRouteName(),
array('controller_action' => $this));
Mage::dispatchEvent('controller_action_predispatch_' . $this->getFullActionName(),
array('controller_action' => $this));
如何呈现响应可能会影响可用的事件;主要变化来自于是否使用布局更新来呈现响应(以及如何)。例如,core_layout_update_updates_get_after
可用于将布局更新文件注入已配置的模块布局更新文件列表(这是一种罕见但可能有用的案例)。控制器动作与布局建模紧密结合,因此有一些事件可以起作用:
假设renderLayout()
用于您关心的所有操作,有两个事件(一个是通用的,一个是特定于路径的)which it dispatches:
Mage::dispatchEvent('controller_action_layout_render_before');
Mage::dispatchEvent('controller_action_layout_render_before_'.$this->getFullActionName());
在完成所有路由,调度,视图配置,块实例化和渲染之后,有一个最后沟渠事件,在发送响应之前由前端控制器调度: controller_front_send_response_before
。这个事件不适合你的需要,但它是开始这个答案的controller_front_init_before
事件的一个很好的书挡。
答案 1 :(得分:3)
http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/这会有所帮助。
app/code/core/Mage/Core/Controller/Varien/Action.php
此事件
controller_action_layout_load_before
被解雇
app/code/core/Mage/Core/Block/Abstract.php
事件
core_block_abstract_to_html_before
以上两个事件可能会有所帮助。
答案 2 :(得分:1)
我们可以使用observer使用controller_front_init_routers事件。在该observer方法中,您可以按如下方式获取请求对象。
$request = $observer->getEvent()->getData('front')->getRequest();
答案 3 :(得分:0)
我认为您正在寻找此活动controller_action_layout_render_before_RouteName_ControllerName_ActionName
您还可以在以下函数中记录Mage
类中任何页面加载时触发的所有事件
public static function dispatchEvent($name, array $data = array())
{
Mage::log($name);
Varien_Profiler::start('DISPATCH EVENT:'.$name);
$result = self::app()->dispatchEvent($name, $data);
Varien_Profiler::stop('DISPATCH EVENT:'.$name);
return $result;
}