Magento Observer目的地

时间:2012-11-28 19:33:58

标签: magento observers

我已经写了2个Magento观察员,他们都做了我想要的,除了他们在错误的页面上结束。换句话说,他们编写日志文件,修改数据库,并与其他服务器通信,但他们将页面修改为页面路由。例如,我有一个观察者,我在登录时使用它修改数据库,写入cookie并写入日志,但它将登录后的页面更改为

http://www.my-web-site.com/index.php/customer/login/post/

然后给我一个404错误。如果我点击“Ctrl”+“r”,那么我就登录了

http://www.my-web-site.com/index.php/customer/account/index/

这是正确的。如果我将app / code / local / my_module / my_model / etc / config.xml更改为 app / code / local / my_module / my_model / etc / config.xml.1(换句话说取出观察者),然后Magento路由到正确的页面,

我认为我需要在config.xml中使用路由器信息。我当前的config.xml是:

<?xml version="1.0" encoding="UTF-8"?>
<!-- The root node for Magento module configuration -->
<config>

  <!-- The module's node contains basic information about each Magento module -->
  <modules>

    <!-- This must exactly match the namespace and module's folder
      names, with directory separators replaced by underscores -->
    <MyCompany_LogIn>

      <!-- The version of our module, starting at 0.0.0 -->
      <version>0.0.0</version>

    </MyCompany_LogIn>
  </modules>

  <!-- Configure our module's behavior in the global scope -->
    <global>

        <!-- Defining models -->
        <models>

        <!-- Unique identifier in the model's node.
             By convention, we put the module's name in lowercase. -->
        <mycompany_login>

            <!-- The path to our models directory, 
             with directory separators replaced by underscores -->
          <class>MyCompany_LogIn_Model</class>

        </mycompany_login>
        </models>
    </global>

  <frontend>

    <!-- Defining an event observer -->
      <events>

        <!-- The code of the event we want to observe -->
        <customer_login>

            <!-- Defining an observer for this event -->
          <observers>

            <!-- Unique identifier within the catalog_product_save_after node.
                 By convention, we write the module's name in lowercase. -->
            <mycompany_login>

                <!-- The model to be instantiated -->
              <class>mycompany_login/observer</class>

              <!-- The method of the class to be called -->
              <method>wrtLogInCookie</method>

              <!-- The type of class to instantiate -->
              <type>singleton</type>

            </mycompany_login>
            </observers>
        </customer_login>
      </events>
  </frontend>
</config>    

我猜Magento内部的登录使用了一个观察者,我正在干扰它。

除此之外,我猜我也可以在PHP Observer代码中完成类似的事情。我的观察者是:

<?php

  /**
  * Our class name should follow the directory structure of
  * our Observer.php model, starting from the namespace,
  * replacing directory separators with underscores.
  * i.e. /www/app/code/local/MyCompany/LogIn/Model/Observer.php
  */

  class MyCompany_LogIn_Model_Observer extends Varien_Event_Observer
    {
    /**
    * Magento passes a Varien_Event_Observer object as
    * the first parameter of dispatched events.
    */
    public function wrtLogInCookie(Varien_Event_Observer $observer)
    {
      // Retrieve the product being updated from the event observer
      $customer = $observer->getEvent()->getCustomer();

      $email = $customer->getEmail();
      Mage::log('The E-mail is: ' . $email);

      $ran_nmbr = rand(); 
      Mage::log('The random number is: ' . $ran_nmbr);

      $crnt_dat = date("m-d-Y::H:i:s");
      Mage::log('The date is: ' . $crnt_dat);

      return $this;
    }
    }
?>

我已经阅读过关于路由器的内容,但文章讨论了在执行扩展之前登陆某些页面的问题。如您所见,我需要在执行扩展后登陆正确的页面。

在PHP观察者中,我也尝试过重定向。例如,

Mage::app()->getResponse()->setRedirect(Mage::getUrl('customer/account/login'));

也许我需要一个完整的URL地址或其他东西。我确信这很容易解决,但我的无知似乎跟着我。如果您对此有所了解,请提供帮助。

2 个答案:

答案 0 :(得分:1)

不幸的是,它并不像简单的修复那么简单。您看,如果我们在app/code/core/Mage/Customer/controllers/AccountController.php中查看loginPostAction(),我们会看到customer/session单例触发customer_login调用。但是,导致此操作的原因是,在调用控制器之后,控制器调用$this->_loginPostRedirect(),因此您所做的所有重新路由工作都将被覆盖。

如何修复:

在说完并非那么简单之后,我碰巧看到了一个我们可以利用的作弊:

$session = Mage::getSingleton('customer/session');
$session->setBeforeAuthUrl($forwardToUrl);

答案 1 :(得分:1)

你是对的。你遇到的问题是Magento的重定向机制与“最后一个说些什么”一起赢得了哲学。如果您查看

中的标准登录代码
app/code/core/Mage/Customer/controllers/AccountController.php

您会看到loginPostAction方法以

调用结束
$this->_loginPostRedirect();

(最终)最终会调用一些看起来像这样的代码

$this->getResponse()->setRedirect($url);

这可能是导致您出现问题的代码,或者可能是其他内容。一般问题是对响应对象的setRedirect方法的最终调用将获胜。

我通常的解决方案是在我想要执行重定向时设置某种全局标志(类上的静态变量,设置为Mage::register的标志),然后为{{1创建一个额外的观察者}}。在这个观察者中,我寻找我设置的全局标志,如果我找到它,在那里设置重定向。

这处理了99%的重定向情况,应该处理你的。这不起作用的时间是一些管理员登录案例,以及URL重写。

管理员登录包含一些使用Magento响应对象的重定向代码

controller_action_postdispatch

如果此重定向导致您出现问题,请在Magento之前为#File: app/code/core/Mage/Admin/Model/Session.php ... header('Location: ' . $requestUri); exit; ... 创建一个使用PHP标头重定向的侦听器。

同样,如果Magento使用重写对象,则可能会运行以下代码

admin_session_user_login_success

(也就是说,重写代码很少会出现问题,因为在标准的Magento操作中控制器调度之前运行)