2014-10-01 34 views
3

我需要觀察控制器方法如何在magento中的Observer中獲取控制器方法?

我的觀察:

public function observer() 
{ 
//need controller action here 
} 

我的控制器:

public function adminAction() 
    { 
    //my action 
    } 

我的問題

  1. 這是可以調用控制器方法觀察員Magento的。
  2. 如果是,請解釋如何? 如果沒有,那麼是否有任何方法通過觀察者來控制器操作?

回答

1

是的,你可以在動態事件監聽:

controller_action_predispatch_' . $this->getFullActionName()

controller_action_postdispatch_' . $this->getFullActionName()

您可以找到這些事件的派遣app/code/core/Mage/Core/Controller/Varien/Action.php

$this->getFullActionName()返回由形成一個字符串的方法routeName_controllerName_actionName因此,假設你的routeName是myadminroute,你的controllerName是mycontroller和你的行動是admin(如您的代碼),你可以聽的事件:

controller_action_predispatch_myadminroute_mycontroller_admin

controller_action_postdispatch_myadminroute_mycontroller_admin

如果你是在管理方面,你可以聽上:

controller_action_predispatch_adminhtml_myadminroute_mycontroller_admin

controller_action_postdispatch_adminhtml_myadminroute_mycontroller_admin

在您的觀察者類中,您可以檢索動作控制[R這樣做:

$observer->getControllerAction()

例子:

假如你是在管理區:

<config> 
    ... 
    <models> 
     <my_model_prefix> 
      <class>MyNamespace_MyModule_Model</class> 
     </my_model_prefix> 
    </models> 
    ... 
    <events> 
     <controller_action_predispatch_adminhtml_myadminroute_mycontroller_admin> 
      <observers> 
       <my_event_unique_tag> 
        <type>singleton</type> 
        <class>my_model_prefix/observer</class> 
        <method>myObserverMethod</method> 
       </my_event_unique_tag> 
      </observers> 
     </controller_action_predispatch_adminhtml_myadminroute_mycontroller_admin> 
    </events> 
    ... 
</config> 

在​​3210:

class MyNamespace_MyModule_Model_Observer 
{ 
    public function myObserverMethod($observer) 
    { 
     $controller = $observer->getControllerAction(); 
     // do some stuff 
    } 
} 
+0

感謝您的回覆,我需要您的支持,您能否以我的觀察員如何實現這一點爲例來向我解釋這一點。 – 2014-10-02 06:04:26

+0

我已經添加了一個例子,希望這有助於:) – 2014-10-02 14:07:52

4

你可以在任何地方實例化一個控制器

$controller = Mage::getControllerInstance(
    'The_Controller_Class', 
    Mage::app()->getRequest(), 
    Mage::app()->getResponse()); 

要告訴我們,如果這是最好的方法,我需要更多地瞭解你的使用情況,但它可能不是。如果你想顯示不同的網頁,不會重新導向,看看Mage_Core_Controller_Varien_Action::_forward()

/** 
* Throw control to different action (control and module if was specified). 
* 
* @param string $action 
* @param string|null $controller 
* @param string|null $module 
* @param array|null $params 
*/ 
protected function _forward($action, $controller = null, $module = null, array $params = null) 
{ 
    $request = $this->getRequest(); 

    $request->initForward(); 

    if (isset($params)) { 
     $request->setParams($params); 
    } 

    if (isset($controller)) { 
     $request->setControllerName($controller); 

     // Module should only be reset if controller has been specified 
     if (isset($module)) { 
      $request->setModuleName($module); 
     } 
    } 

    $request->setActionName($action) 
     ->setDispatched(false); 
} 

很不幸,這是受保護的,因此只能從控制器內使用。但是你可以從其他地方做同樣的事情。什麼是發生在這裏:

  1. 的原始請求(通過Mage::app()->getRequest()可用)進行備份:$request->initForward()
  2. 請求對象,然後獲取一個不同的控制器操作和參數修改。
  3. 請求的「分派」標誌被設置爲false。這樣,在當前控制器動作完成後,前端控制器將再次用現在改變的參數分派請求。

如果您的觀察者附加到分派前發生的事件,那麼更改請求參數就足夠了。

+0

$控制器=法師:: getControllerInstance( '索引','Mbyte_Pushnot ification/Adminhtml_SqliteupdateController」, 'Pushnotification'); 我收到以下錯誤: 警告:包括()[function.include]:打開'Mbyte/Pushnotification/Adminhtml/SqliteupdateController.php'失敗 – 2014-10-02 06:01:38

+0

這是哪個Magento版本? 'getControllerInstance'的第一個參數應該是實際的類名,比如'Mbyte_Pushnotification_Adminhtml_SqliteupdateController',沒有'/'。 – 2014-10-02 06:49:56

+0

Magento版本:1.8.0.0 – 2014-10-02 06:59:12

相關問題