我已经写了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地址或其他东西。我确信这很容易解决,但我的无知似乎跟着我。如果您对此有所了解,请提供帮助。
答案 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操作中在控制器调度之前运行)