Advertisement
  1. Code
  2. Magento

Eventos Personalizados en Magento Con el Patrón Observador.

Scroll to top
Read Time: 5 min

Spanish (Español) translation by Cristian Marroquin (you can also view the original English article)

Considerando el numero de frameworks de eCommerce disponibles en el mercado, Magento es uno de las opciones mas populares para las tiendas en linea de mediana-a-gran-escala. Su conjunto de características y su arquitectura ayuda a separarlo de muchos otras opciones que están disponibles al día de hoy.

También hay disponibles muchas extensiones de terceros para Magento, también es sencillo desarrollar la tuya propia. El proposito de este tutorial no es llevarte por el como hacer una extensión personalizada; pero, se asume que estas familiarizado con el proceso así como usar usar un patrón de diseño para implementar nuestro propio modulo personalizado.

Específicamente, vamos a ver el patrón de Evento-Observador. Para aquellos que no estén familiarizados, los observadores se registran ellos  mismos a un evento y esperan de modo tal que puedan ejecutar código en cualquier momento que un evento sea desencadenado.

Como mencione, este tutorial asume que estas familiarizado con como desarrollar módulos personalizados en Magento, porque vamos a crear un modulo que emplea ese patrón de diseño.

Configurando El Observador

Primero, vamos a necesitar declarar el observador para nuestro evento personalizado. Para ello, ingresa el siguiente código en el archivo config.xml de tu modulo exactamente en el elemento global.

Vamos a explicar el código momentáneamente.

1
<global>
2
  ..
3
  ..
4
  <events>
5
    <my_custom_event>
6
      <observers>
7
        <namespace_modulename_my_custom_event_observer>
8
          <type>singleton</type>
9
          <class>modulename/observer</class>
10
          <method>my_custom_method</method>
11
        </namespace_modulename_my_custom_event_observer>
12
      </observers>
13
    </my_custom_event>
14
  </events>
15
  ..
16
  ..
17
</global>

En el código de arriba, solo declaramos el observador para un evento llamado my_custom_event. Esto simplemente significa que donde sea que se dispare my_custom_event, el verá que el observador para este evento esta registrado en tu modulo y entonces ejecutará el código asociado al evento.

En nuestros caso, va a llamar el método my_custom_method definido en la clase Namespace_Modulename_Model_Observer.

Ahora, vamos a llevar esto un paso mas adelante. Notaste que en la etiqueta <events>, puedes definir eventos a los cuales quieres registrar los observadores. En nuestro caso, vamos a registrar el observador para el evento <my_custom_event> Puedes también definir múltiples observadores para el mismo evento. En tal caso, declara todos tus observadores dentro de la etiqueta <observers>.

Ahora, cada observador se envuelve con un único identificador. en nuestro ejemplo es <namespace_modulename_my_custom_event_observer>. Mas aún, necesitas especificar el nombre de la clase y el método que va a ser ejecutado. La etiqueta <class> especifica la ubicación de la clase en la forma que lo hace Magento.

En nuestro ejemplo, la clase sera Observer.php en la carpeta model del modulo modulename. El nombre del método es declarado en la etiqueta <method>. El valor de la etiqueta <type> es "singleton" lo cual significa que va a usar la misma instancia del objeto observador para cada llamada del evento.

Ahora, después de declarar nuestro observador, vamos a crear la clase del observador y el código del método relacionado. Crea un archivo Observer.php en la carpeta Model de tu modulo. Copia y pega el siguiente código en ese archivo.

1
<?php
2
class Namespace_Modulename_Model_Observer
3
{
4
  public function my_custom_method($observer) {
5
    $event = $observer->getEvent();
6
7
    // getter method to fetch cid value passed from the dispatcher

8
    $cid = $event->getCid();
9
    echo $cid;
10
    exit;
11
  }
12
}
13
?>

Aquí, solo hemos creado la case observador. En el método my_custom_method, vas a tener acceso al objeto observador y los datos pasados con el desde el despachador asi que puedes usarlo para hacer algo significativo.

En este ejemplo, solo vamos a recuperar el valor de la variable cid pasada desde el código del despachador que vamos  ver en un momento.

Por supuesto, necesitas modificar el modulename y el namespace de acuerdo con tu modulo personalizado en el archivo de la clase y la declaración XML. 

Despachando Nuestro Evento Personalizado

Como hemos declarado el observador en el modulo personalizado, la única cosa restante es despachar nuestro evento personalizado.

Vamos a ver como puedes usar el despachador de eventos de Magento desde tu modulo personalizado. Escribe el siguiente código en el método de tu controlador del cual te gustaría despachar el evento.  Habiendo dicho eso, también puedes disparar el evento desde otros lugares ademas del controlador.

1
<?php
2
..
3
$event_data_array  =  array('cid' => '123');
4
Mage::dispatchEvent('my_custom_event', $event_data_array);
5
..
6
?>
7

Como puedes ver es is bastante simple despachar el evento desde casi cualquier lugar en Magento. El primer argumento del método dispatchEvent es el nombre del evento y el segundo argumento es usado para pasar los datos a los observadores

Como pudiste haber notado anteriormente en la clase del observador, hemos usado el método get para acceder al valor de la variable cid

En muchos de los casos los datos del evento pasan al los observadores en modo de solo lectura. Mas específicamente, los observadores no pueden cambiar el valor de las variables pasadas por el método del despachador de eventos.  

Otorgando el Acceso de Escritura

Asumiendo que has despachado un evento personalizado en tu modulo, y que quieres que el observador sea capas de modificar los datos que paso el evento original. Visitemos de nuevo el código del despachador para lograr esto.

1
<?php
2
..
3
$event_data_array  =  array('cid' => '123');
4
$varien_object = new Varien_Object($event_data_array);
5
Mage::dispatchEvent('my_custom_event', array('varien_obj'=>$varien_object));
6
7
// should output '456' as we'll change the value in observer

8
echo $varien_object->getCid();
9
..
10
..
11
?>

Simplemente hemos usado el objeto especial de Magento Varien_Object y pasamos nuestros datos usándolo para asegurar que cualquier modificación a los datos sea preservada. 

También necesitas cambiar el código de la clase observador adecuadamente. Aquí esta la clase observador modificada.

1
<?php
2
class Namespace_Modulename_Model_Observer
3
{
4
  public function my_custom_method($observer) {
5
    $event = $observer->getEvent();
6
7
    // getter method to fetch varien object passed from the dispatcher

8
    $varien_object = $event->getVarienObj();
9
    $varien_object->setCid('456');
10
  }
11
}
12
?>

El único cambio significativo en el código es recuperar el objeto varien y usarlo para cambiar el valor de la variable arreglo cid.

Resumen

A pesar de que este es un tutorial relativamente simple, este muestra como podemos implementar el Patrón Evento-Observador fácilmente en el contexto de un modulo personalizado. En este punto, debería ser familiar para ti crear tus propios módulos personalizados usando el patrón Evento-Observador.

¡Por favor! no dudes en dejar tus preguntas y/o comentarios en la parte de abajo.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.