我在Magento安装中遇到了一个问题,我一直很难跟踪。每当客户进入“我的帐户”页面并单击“地址簿”链接时,它会将其发送到默认的404 CMS页面。我在Google周围搜索并发现了一些类似的问题,但它们并不完全相同。但是,提供的一个解决方案是自定义登录重定向模块。
所以我开始逐个禁用所有自定义模块,看看是否能解决问题,结果发现禁用我们的自定义帐户控制器可以解决问题。我试图通过在重写方法中使用Mage :: log()进一步跟踪这一点,以查看它们是否在尝试访问/ customer / address /时被调用,但日志中没有显示任何内容。
我留下的唯一线索是我的控制器配置存在问题。这是我设置的config.xml:
<?xml version="1.0"?>
<config>
<modules>
<mymodule_login>
<version>0.1.0</version>
</mymodule_login>
</modules>
<frontend>
<routers>
<mymodule_login>
<use>standard</use>
<args>
<module>MyModule_Login</module>
<frontName>customer</frontName>
</args>
</mymodule_login>
</routers>
</frontend>
<global>
<rewrite>
<mymodule_login>
<from><![CDATA[#^/account/#]]></from>
<to>/customer/account/</to>
</mymodule_login>
</rewrite>
<blocks>
<customer>
<rewrite>
<register-login>MyModule_Login_Block_View</register-login>
</rewrite>
</customer>
<login>
<class>RegisterLogin</class>
</login>
</blocks>
</global>
</config>
我认为从#^ / account /#到/ customer / account /的重写可能有问题,但我不太了解Magento重写以确定是否准确。我覆盖的方法是:loginPostAction,_ loginPostRedirect和_welcomeCustomer。
答案 0 :(得分:0)
Dick Laurent是对的 - 这是我的配置。我所做的只是添加一个覆盖Mage_Customer_AddressController的第二个控制器,现在它工作正常。问题是我的前端名称是“客户”所以它期望在我的自定义模块中找到相应的控制器,当它转到URL / customer / address /时。
答案 1 :(得分:0)
我必须覆盖Mage_Customer_AccountController,但是你不能只覆盖一个控制器,你必须覆盖整个模块。
所以这就是你在这种情况下如何解决的问题。您创建引用父项的文件。
注意:将{Namespace}替换为您的自定义命名空间。
这是我的config.xml :(在文件夹app / code / local / {Namespace} / Customer / etc中)
<?xml version="1.0"?>
<config>
<modules>
<{Namespace}_Customer>
<version>0.1.0</version>
</{Namespace}_Customer>
</modules>
<frontend>
<routers>
<customer>
<use>standard</use>
<args>
<module before="Mage_Customer">{Namespace}_Customer</module>
<frontName>customer</frontName>
</args>
</customer>
</routers>
</frontend>
</config>
现在重写Mage_Customer_AccountController :(在文件夹app / code / local / {Namespace} / Customer / controllers中)
<?php
require_once ('Mage/Customer/controllers/AccountController.php');
class {Namespace}_Customer_AccountController extends Mage_Customer_AccountController
{
protected function _loginPostRedirect()
{
$session = $this->_getSession();
if($session->getBeforeAuthUrl() == Mage::getUrl('checkout/onepage/index')){
$session->setBeforeAuthUrl(Mage::getUrl('checkout/cart'));
$this->_redirectUrl($session->getBeforeAuthUrl(true));
return;
}
return parent::_loginPostRedirect();
}
}
通过结帐登录后,客户会将其重定向回购物车页面。我们这样做了,因为如果前一个会话中的商品中有一个商品,Magento会将最近的购物车商品与之前会话中的商品结合起来,然后在不告诉客户的情况下继续付款。因此,为避免客户投诉,我们只需将其重定向回购物车,以便客户可以看到这种情况发生。
现在因为我们要覆盖整个模块,我们必须创建引用父代的上述文件。 Mage_Customer下的另外两个控制器是Mage_Customer_AddressController和Mage_Customer_ReviewController。您的Magento实例可能会随着版本的变化而变化,因此请务必检查位于(app / code / core / Mage / Customer / controllers)的
这里我们引用Mage_Customer_AddressController的父级:(在文件夹app / code / local / {Namespace} / Customer / controllers中)
<?php
require_once ('Mage/Customer/controllers/AddressController.php');
class {Namespace}_Customer_AddressController extends Mage_Customer_AddressController
{
}
同样适用于Mage_Customer_ReviewController :(同一文件位置)
<?php
require_once ('Mage/Customer/controllers/ReviewController.php');
class {Namespace}_Customer_ReviewController extends Mage_Customer_ReviewController
{
}
如果没有这些文件,Magento根本无法找到控制器并抛出404.
最后,在名为{Namespace} _Customer.xml的app / etc / modules下创建一个文件以启用覆盖,地址簿不应再为404。