lunes, 19 de septiembre de 2011

Extensión de Yii Framework mediante componentes

Una de las formas de extender Yii Framework es mediante los componentes. Los componentes son clases reutilizables, que podemos incluir en nuestra aplicación y que nos van a permitir agregar nuevas funcionalidades a Yii Framework.

Basándome en el artículo oficial de la web acerca de los componentes, he elaborado este artículo donde os explicaré la formas básicas de crear un componente y usarle en nuestras aplicaciones Yii. Es curioso que leyendo la guía en la web oficial del framework, la parte dedicada a componentes no está traducida al español, así que con este artículo, complementaré este información para los hispanohablantes :-)

Como nota final decir que en este artículo no me voy a limitar a traducir el artículo oficial de la web, si  no que lo orientaré a como construir un componente y usarlo. No obstante los conceptos básicos de lo que es un componente en Yii Framework están en ese  artículo, así que no haré mucho incapé en ello.

Componentes

Comencemos por el principio. Un componente en Yii es una instancia de la clase CComponent o de alguna de sus clases derivadas. La clase base CComponent nos va a dar las propiedades y eventos básicos del componente que vamos a crear. Por tanto todos los componentes, directa o indirectamente van a derivar de esta clase.

Propiedades de los componentes

Como todas las clases, los componentes podrán tener propiedades. Con como las propiedades de una clase, de hecho se pueden definir como propiedades públicas. No obstante la mejor manera de definir propiedades en un componente, es primero definir la propiedad como privada y después definir métodos para obtener y establecer la propiedad.

Un ejemplo: tenemos un componente Rectángulo que queremos que tenga una propiedad llamada ancho, que especifique el ancho del rectángulo. Lo definiremos de la siguiente manera:

class Rectangulo extends CComponet
{
  private $_ancho = 0;
  
  public function getAncho()
  {
    return $_ancho;
  }

  public function setAncho($ancho)
  {
    $this->_ancho = $ancho;
  }
}

De esta manera tendremos bien definidos nuestros métodos get y set. Si solo hubiésemos definido la propiedad getAncho(), la propiedad ancho del componente sería de solo lectura. Como en el ejemplo hemos definido tanto el método get, como el set, la propiedad se puede leer y escribir.

Eventos en los componentes

Otra de las características importantes de los componentes que nos ofrece Yii Framework son los eventos. Los eventos son propiedades especiales, que pueden tomar métodos llamados even handlers (controladores de eventos), como valores. Asignando un método a un evento lo que haremos es que cuando el evento sea ejecutado, automáticamente se ejecutará su método asociado.

Los eventos en los componentes, van precedidos por on. Así si queremos definir un evento para cuando nuestro componente se cargue usaremos onLoad() como nombre de la función de evento.

Veamos un ejemplo, volviendo a nuestra clase rectángulo:

class Rectangulo extends CComponet
{
   public fuction onLoad($event)
   {
$this->_ancho = 10;
      $this->raiseEvent('onLoaded', $event);
   }
}

El parámetro $event será un objeto de la clase CEvent o una de sus clases derivadas que va a contener como mínimo información acerca de quien ha lanzado el evento. Nuestro ejemplo lo que hará es establecer el ancho del rectángulo a 10 cuando se cargue el componente y posteriormente, retransmite el evento a la función de callback que hayamos configurado.

¿Como configuramos la función de callback?. Bien esto se hace desde fuera de nuestro componente, es decir desde la clase donde vayamos a usar el componente. Llamaremos a esta clase clase cliente. Normalmente esta clase será un controlador de nuestra aplicación. En él podemos poner nuestra función de callback y asociarlo al componente de la siguiente manera:

$rectangulo->array($this,'callbackLoad')

Y la signatura de nuestra función de callback deberá ser la siguiente:

public function callbackLoad($event)
{
   // Acciones para cuando se carga el componente.
}

Con esto tenemos definido el esqueleto de la gestión de eventos para un componente de Yii Framework.

Un último tema. Los componentes que creemos, tienen que estar en el directorio protected/components de nuestra aplicación. De esta manera el motor de Yii Framework, cargará automaticamente todas las clases que tengamos en este directorio y podremos usarlos en cualquier parte de la aplicación.

Si tenéis cualquier tema que comentarme, no dudéis en dejar un comentario, o escribirme un correo.