2014-05-23 64 views
1

我一直在試圖在我爲Magento構建的模塊中重載Mage_Customer_AccountController類,但由於某種原因,它不工作,即使類正在實例化,我的方法也沒有被調用。Magento - 過載控制器類

在我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方法沒有按不運行,而是從Mage_Customer_AccountController運行loginAction方法。

什麼我實際上要完成的是從將用戶重定向回/customer/account/login停止AccountController他們登出由於該模塊關係到一個外部API /服務,處理用戶之後。我嘗試使用在controller_action_predispatch_customer_account_logout上觸發的觀察者在將用戶重定向到登錄前的任何頁面之前執行一些註銷管理,但在重定向到外部服務之前將AccountController步驟重新導向,並將其自己的重定向發送到/customer/account/login

如果任何人有更好的方法來做這件事我建議大家都耳熟能詳。

編輯:看來我的問題在別處,因爲我認爲被調用的原始動作方法根本沒有被調用。相反,在Magento某處發佈重定向到/customer/account/login上述觀察者方法運行後(觀察者嘗試設置重定向,但這會被忽略(並且是的,我已檢查,我用於重定向的URL是最絕對不是/customer/account/login))。

+0

爲了這個例子的目的,它是'Mymodule',但顯然我在發佈前做了搜索和替換。 – mludd

+0

如果在本地代碼池中覆蓋它,你應該有'controllers/Customer/AccountController.php'。當你調用這個動作'custom/account/login'時,只有你的'public function loginAction()'將被調用 – Slimshadddyyy

+0

@Slimshadddyyy:你是什麼意思?我在我的'config.xml'中指定Magento應該在'controllers/Override /'中尋找我的類。 – mludd

回答

1

您可以嘗試捕捉事件:

customer_logout

此事件在方法logoutMage_Customer_Model_Session類解僱,並提供customer對象調用保護方法_logout一個刪除會話cookie之前。

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(); 
    } 


    } 
+0

這段代碼和我的唯一區別是'AccountController.php'的位置,並且這段代碼運行'die()',然後運行原始方法。我遇到的問題是我的操作方法根本沒有被調用。 – mludd

+0

這是我開始想知道的事情之後,現在我已經注意到,雖然我認爲'logoutAction'被稱爲它不是,但我很明顯得到302重定向後我在'controller_action_predispatch_customer_account_logout'上觸發的觀察者方法運行。這種方法最後一件事是設置一個重定向,但這個重定向被忽略,而我被重定向到'/ customer/account/login'。 – mludd