2014-10-01 48 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

相关问题