【问题标题】:Magento Event On Any Page Load任何页面加载时的 Magento 事件
【发布时间】:2013-03-25 13:43:51
【问题描述】:

我想知道在magento中渲染到html之前是否每次加载页面时都会触发一次事件?

如果您想为不依赖于用户会话的半静态属性执行一些业务逻辑,这可能会很有用。

例如,我将使用它来将规范标签传递到 magento 的标头。

【问题讨论】:

    标签: magento


    【解决方案1】:

    几个与请求相关的事件被调度用于大多数页面/内容生成请求。以下是一些有用的处理顺序的部分列表,我希望其他人可以与其他人一起评论这篇文章。其中许多不适合您的需要(我在下面用粗体标出了您应该开始考虑的地方)。还有一些与块实例化相关的事件,尽管它们可以观察到您的目的,但对于每个块来说都是通用的,实际上并不合适。

    假设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 事件的一个很好的书挡。

    【讨论】:

    • 我使用了 controller_front_init_before,它似乎在每次页面加载时触发一次。我会做一些额外的测试并报告。
    • @ajameswolf 该事件非常早,你的块实例将不存在。
    • 是的,我意识到这还为时过早,也不允许访问布局对象。到目前为止,controller_action_layout_generate_blocks_after 工作得很好。该对象包含布局对象,因此我不必执行 Mage::app->getLayout 等操作。对于任何有兴趣的人,我还将发布一些代码,以便更好地理解我想要完成的工作。我确信这还有其他用途。现在我处于 SEO 模式,所以动态标题标签、描述、标题标签后缀/前缀、重定向.. 就在我的脑海中。
    • 公共函数测试($observer){ $_head = $observer->getLayout()->getBlock('head'); $_url_parts = parse_url($_SERVER['REQUEST_URI']); $_canonical_url = $_current_url = "http://".$_url_parts['host'].$_url_parts['path']; $_canonical_url = '我的网址与当前网址不同'; $_head->removeItem('link_rel', $_current_url); $_head->addLinkRel('canonical',$_canonical_url); // echo "
      "; // var_dump($observer->getLayout()->getBlock('head')->getData()); // echo "
      ";返回$观察者; }
    • controller_action_layout_render_before--- 这个事件解决了我的问题。这只会每页加载一次..我有相同的要求并使用了这个事件并且它有效..谢谢你@benmarks
    【解决方案2】:

    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
    

    以上两个事件可能会有所帮助。

    【讨论】:

    • 要添加到@benmarks,'core_block_abstract_to_html_before' 是不合适的,因为它在渲染之前为每个块调用它,所以它会在每个页面调用多次(次数=给定页面上的块计数)
    【解决方案3】:

    我想你正在寻找这个活动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;
        }
    

    【讨论】:

    • 这很有用,但是在此示例中,控制器名称不相关,因为无论哪个控制器正在处理请求,我都希望捕获事件。例如每个页面加载。
    【解决方案4】:

    我们可以通过观察者来使用 controller_front_init_routers 事件。在那个观察者方法中,你可以得到如下请求对象。

    $request = $observer->getEvent()->getData('front')->getRequest();

    【讨论】:

    • 我没有检查过这个但是谢谢。一旦你有这个能力,在 cmets 部分会更合适。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多