2014-05-23 3 views
1

Magento 용으로 빌드하고있는 모듈에 Mage_Customer_AccountController 클래스를 오버로드하려고 시도했지만 어떤 이유로 작동하지 않고 클래스가 인스턴스화 되어도 내 메서드가 호출되지 않습니다.Magento - 오버로드 컨트롤러 클래스

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

을 그리고 controllers/Override/AccountController.php에서 내가 가진 : 내 etc/config.xml에서

내가있어

<?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에서 실행됩니다.

내가 실제로달성하기 위해 노력하고있어 그들이 사용자를 처리하는 외부 API/서비스로이 모듈의 관계 때문에 로그 아웃 한 후 다시 /customer/account/login 사용자를 리디렉션에서 AccountController을 중지하는 것입니다. 로그 아웃하기 전에 어떤 페이지로든 사용자를 리디렉션하기 전에 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

이 이벤트 클래스 Mage_Customer_Model_Session의 방법 logout에서 해고되고, 그것이 customer 객체를 제공 직전에 호출 보호 된 세션 쿠키를 삭제하는 방법 _logout.

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

관련 문제