自定义帐户控制器导致404通讯簿

时间:2011-06-09 15:31:00

标签: magento

我在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。

2 个答案:

答案 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。