我想知道在magento中渲染到html之前是否每次加载页面时都会触发一次事件?
如果您想为不依赖于用户会话的半静态属性执行一些业务逻辑,这可能会很有用。
例如,我将使用它来将规范标签传递到 magento 的标头。
我想知道在magento中渲染到html之前是否每次加载页面时都会触发一次事件?
如果您想为不依赖于用户会话的半静态属性执行一些业务逻辑,这可能会很有用。
例如,我将使用它来将规范标签传递到 magento 的标头。
对于大多数页面/内容生成请求,有几个与请求相关的事件。以下是一些有用的处理顺序的部分列表,我希望其他人可以与其他人一起评论这篇文章。其中许多不适合您的需要(我在下面用粗体标出了您应该开始考虑的地方)。还有一些与块实例化相关的事件,尽管可以出于您的目的观察它们,但它们对每个块都是通用的,并且确实不合适。
第一个实际的单发事件是controller_front_init_before
. 此事件在前端控制器初始化中调度,以响应所有调度的请求。因为它是在调用动作控制器之前调度的,所以只有全局区域的观察者才能观察到这个事件。
假设请求通过路由器从前端控制器路由到动作控制器,在渲染之前可以观察到一些事件preDispatch()
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()
在您关心的所有操作中都使用了它,它会调度两个事件(一个通用事件和一个特定于路由的事件) :
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
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
以上两个事件可能会有所帮助。
我想你正在寻找这个活动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;
}
我们可以使用观察者来使用 controller_front_init_routers 事件。在该观察者方法中,您可以按如下方式获取请求对象。
$request = $observer->getEvent()->getData('front')->getRequest();