Magento - 覆盖控制器类

时间:2014-05-23 12:25:38

标签: php oop magento

我一直试图在为Magento建造的模块中超载Mage_Customer_AccountController课程,但由于某种原因它不起作用,我的方法并不存在即使正在实例化类,也会调用它。

etc/config.xml我得到了:

[...]
<frontend>
    <routers>
        <customer>
            <args>
                <modules>
                    <mycompany_mymodule before="Mage_Customer">Mycompany_Mymodule_Override</mycompany_mymodule>
                </modules>
            </args>
        </customer>
    </routers>
</frontend>
[...]

controllers/Override/AccountController.php我有:

<?php
require_once('Mage/Customer/controllers/AccountController.php');
class Mycompany_Mymodule_Override_AccountController extends Mage_Customer_AccountController {
    /**
     * This runs if uncommented
     */
    //public function __construct() {
    //    Mage::log("THIS GETS LOGGED");
    //}

    /**
     * This should be replacing the default loginAction but doesn't run.
     */
    public function loginAction() {
        Mage::log('THIS DOES NOT GET LOGGED');
    }
}
?>

我觉得特别的是上面的构造函数如果没有注释,但loginAction方法没有运行,而是运行loginAction方法,则显然会运行。

实际尝试完成的任务是阻止Mage_Customer_AccountController用户在注销后将用户重定向回AccountController,因为此模块与外部绑定处理用户的API /服务。我尝试使用在/customer/account/login上触发的观察者进行一些注销内务处理,然后将用户重定向回到他们在注销之前所处的任何页面,但在重定向到外部服务之前执行了controller_action_predispatch_customer_account_logout步骤将自己的重定向发布到AccountController

如果有人对更好的方法提出建议我全心全意。

编辑:看来我的问题出在其他地方,因为我假设的原始操作方法被称为根本没有被调用。相反,在上面提到的观察者方法运行之后,Magento中的某个地方正在向/customer/account/login发出重定向(观察者试图设置重定向,但这会被忽略(是的,我已经检查过,URL I&#39} ; m用于重定向绝对不是/customer/account/login))。

2 个答案:

答案 0 :(得分:1)

您可以尝试捕捉活动:

customer_logout

此事件在类logout中的方法Mage_Customer_Model_Session中触发,它在调用受保护的方法customer之前提供_logout对象,删除会话cookie。

答案 1 :(得分:0)

您的config.xml文件

...   
 <frontend>
        <routers>
            <customer>
                <args>
                    <modules>
                        <company_modulename before="Mage_Customer">Company_Modulename</company_modulename>
                    </modules>
                </args>
            </customer>
        </routers>
    </frontend>
...

创建一个控制器类: 应用程序/代码/ [codePool] /Company/Modulename/controllers/AccountController.php 使用以下代码:

    require_once 'Mage/Customer/controllers/AccountController.php';
    class Company_Modulename_AccountController extends Mage_Customer_AccountController
    {
        public function indexAction()
    {
        die('overriden');
        parent::indexAction();
    }


   }