2011-09-22 18 views
12

Tengo un controlador de Magento de la siguiente manera:Añadir eventos para antes/después de una acción de un controlador en Magento

#File: ./app/local/FilFact/Test/IndexController 
class FilFact_Test_IndexController extends Mage_Core_Controller_Front_Action{ 
    public function indexAction(){ 
     $this->_testConfig(); 
    } 
} 

tengo que añadir dos eventos para:
beforeindex action
afterindex action

¿Cómo podría hacer eso?

+0

Desea proporcionar los dos eventos para que otros módulos puedan engancharse a ellos, ¿verdad? – Simon

+0

Sí, y uso una forma como: Agregue la instrucción: 'Mage :: dispatchEvent ('test_index_index_before_action', $ data);' dentro de la acción de índice. Pero no es bueno La respuesta a continuación es mejor. – vietean

Respuesta

36

Esto es simple ya que la clase base Mage_Core_Controller_Varien_Action proporciona eventos de pre/post dispatch.

Si usted abre la clase Mage_Core_Controller_Varien_Action se encuentran dos métodos: preDispatch() y postDispatch()

Estos método de realizar algunas tareas y lo más importante disparar tres eventos.

controller_action_(pre|post)dispatch 
controller_action_(pre|post)dispatch_{{routeName}} 
controller_action_(pre|post)dispatch_{{fullActionName}} 

El fullActionName es el nombre de la ruta, el nombre del controlador, y el nombre de acción separados por '_' y minúsculas. (Ver Mage_Core_Controller_Varien_Action::getFullActionName para la referencia)

/app/code/local/FilFact/Test/etc/config.xml

<?xml version="1.0"?> 
<config> 
    <modules> 
     <FilFact_Test> 
      <version>1.0.0</version> 
     <FilFact_Test> 
    </modules> 
    <global> 
     <models> 
      <FilFact_Test> 
       <class>FilFact_Test_Model</class> 
      </FilFact_Test> 
     </models> 
    </global> 
    <frontend> 
     <routers> 
      <filfact> 
       <use>standard</use> 
       <args> 
        <module>FilFact_Test</module> 
        <frontName>filfact</frontName> 
       </args> 
      </filfact> 
     </routers> 
     <events> 
      <controller_action_predispatch_filfact_index_index> 
       <observers> 
        <FilFact_Test> 
         <class>FilFact_Test/Observer</class> 
         <method>indexPreDispatch</method> 
        </FilFact_Test> 
       </observers> 
      </controller_action_predispatch_filfact_index_index> 
      <controller_action_postdispatch_filfact_index_index> 
       <observers> 
        <FilFact_Test> 
         <class>FilFact_Test/Observer</class> 
         <method>indexPostDispatch</method> 
        </FilFact_Test> 
       </observers> 
      </controller_action_postdispatch_filfact_index_index> 
     </events> 
    </frontend> 
</config> 

/app/code/local/FilFact/Test/Model/Observer.php

<?php 
class FilFact_Test_Model_Observer 
{ 
    public function indexPreDispatch(Varien_Event_Observer $observer) 
    { 
     // TODO: Your code 
    } 

    public function indexPostDispatch(Varien_Event_Observer $observer) 
    { 
     // TODO: Your code 
    } 
} 
+1

Lo intentaré. :) Me encanta tu respuesta. – vietean

+0

Genial. Yo trabajo para mi Pero no sé cómo funciona? ^^ – vietean

+3

Voy a actualizar la respuesta para incluir y explicación. –

Cuestiones relacionadas