Mostrando entradas con la etiqueta Yii Framework. Mostrar todas las entradas
Mostrando entradas con la etiqueta Yii Framework. Mostrar todas las entradas

jueves, 29 de septiembre de 2011

Creación de un widget basado en CPortlet con Yii Framework.

En un post anterior, estabamos comentando como Yii Framework puede ser extendido mediante componentes. Veiamos como los componentes extienden de uan clase base llamada CComponent y nos servían para crear nuevas clases integradas con el Framework.

Siguiendo con el tema de los componenetes y la extensibilidad en Yii Framework ahora veremos que existen otro tipo de componentes llamados Widgets con los que también podemos extender el framerow. La útilidad de los widgets es que nos permiten construir nuevos elementos visuales para nuestro sitio web. Los Widgets es la forma de extender la parte visual de Yii Framework.

Si quisieramos crear un widget completamente nuevo, la clase que creemos debe extender de CWidget . Esta clase es un componente contenedora de presentación, que permite visualizar datos del modelo. Sin embargo rara vez necesitaremos extender o crear un Widget desde cero. Lo más fácil es extender unos de los widgets que nos proporciona Yii y adaptarlo a nuestras necesidades y eso es lo que veremos a continuación.

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.

jueves, 11 de agosto de 2011

Yii Framework: Uso de CDefaultValueValidator en el modelo

Una de las bondades de Yii Framework es la posibilidad de realizar validaciones de los datos de una base de datos, desde el modelo, sobrescribiendo el método rules() de la clase ActiveRecord. En este post os explico como usar estas validaciones para poner un valor por defecto, en un campo de una base de datos.

Escenario

Necesitamos poner un valor por defecto en un campo de la base de datos. Cuando el usuario no rellene el valor del campo en el formulario, a la hora de actualizar o dar de alta un nuevo registro, el ActiveRecord automáticamente debe insertar el valor por defecto en la base de datos.

Descripción de la solución

La solución pasa por poner en el método rules() de nuestra tabla, un validador de tipo CDefaultValueValidator que nos permite especificar un valor por defecto para el campo de manera dinámica. Tiene dos atributos para especificar:
  • setOnEmpty: valor booleano. Si es true entonces el valor predeterminado se establece sólo cuando el valor del atributo es una cadena nula o vacía. En caso de que sea false, se establece siempre. 
  • value: el valor por defecto a establecer.
Cada validador tiene un alias para hacer referencia al validador en el método rules() del ActiveRecord. En nuestro caso el alias de CDefaultValueValidator es 'default'.

Ejemplo: en el siguiente ejemplo hay un campo que se llama 'leido' en el ActiveRecord, el cual queremos que
como valor por defecto sera cero.

public function rules()
{
	return array(
		array('leido','default','value' => 0),
	);
}

domingo, 31 de julio de 2011

Como configurar RBAC con Yii Framework

En este articulo voy a resumir de manera concisa, los pasos a seguir para configurar RBAC (Role Base Access Control) en nuestra aplicación. Gracias a este sistema, podremos integrar en nuestra aplicación un control de acceso basado en los roles que tengan los usuarios de la aplicación.

Así en las clases controladoras solo tendremos que especificar que rol, tiene permisos para ejecutar una acción y solamente ejecutarán esa acción aquellos usuarios que tengan el rol especificado.

Pasos a seguir

En este punto asumiremos que tenéis el entorno de desarrollo montado y una aplicación Yii Framework generada (puede ser mediante la herramienta yiic ). También que la aplicación está configurada para acceder a una base de datos MySql.

En esta definición de pasos, nos vamos a centrar solo en roles. Si leeis la  Guia RBAC de Yii Framework, veréis que Yii nos permite una granularidad más fina que simples roles. Nos permite definir tareas, con un conjunto de operaciones a realizar, para completar una tarea.

Nosotros, solo vamos a configurar tres roles: administrador, usuario normal, invitado.

Paso1: Configurar la aplicacion para activar RBAC sobre una base de datos

El primer paso será activar RBAC. Para ello modificamos el archivo main.php que se encuentra en el directorio protected/config del proyecto.

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
    ),

Esto nos permitira decir a Yii que utilice como manager de autorización la clase CDbAuthManager. Este manager es un autorizador que guarda la información de autorización en base de datos. En nuestro caso en la base de datos MySql de la aplicación.

Paso 2: Creación de las tablas RBAC

El siguiente paso es crear la tablas en la base de datos. Para ello ejecutamos el scrip schema.sql que se encuentra en el directorio web/auth del directorio donde tengamos el framework Yii. El scrip es el siguiente:

/**
 * Database schema required by CDbAuthManager.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @link http://www.yiiframework.com/
 * @copyright Copyright &copy; 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 * @since 1.0
 */
 
drop table if exists AuthAssignment;
drop table if exists AuthItemChild;
drop table if exists AuthItem;
 
create table AuthItem
(
   name                 varchar(64) not null,
   type                 integer not null,
   description          text,
   bizrule              text,
   data                 text,
   primary key (name)
);
 
create table AuthItemChild
(
   parent               varchar(64) not null,
   child                varchar(64) not null,
   primary key (parent,child),
   foreign key (parent) references AuthItem (name) on delete cascade on update cascade,
   foreign key (child) references AuthItem (name) on delete cascade on update cascade
);
 
create table AuthAssignment
(
   itemname             varchar(64) not null,
   userid               varchar(64) not null,
   bizrule              text,
   data                 text,
   primary key (itemname,userid),
   foreign key (itemname) references AuthItem (name) on delete cascade on update cascade
);

Los nombres de las tablas RBAC, se pueden cambiar, teniendo en cuenta que también habrá que cambiar los nombres a la hora de crear el manager de autenticación. Para ello deberemos añadir tres parámetros más, indicando los nombres de las tres tablas así:

'authManager'=>array(
        'class'=>'CDbAuthManager',
        'connectionID'=>'db',
        'itemTable'=>'AuthItem', // Tabla que contiene los elementos de autorizacion
        'itemChildTable'=>'AuthItemChild', // Tabla que contiene los elementos padre-hijo
        'assignmentTable'=>'AuthAssignment', // Tabla que contiene la signacion usuario-autorizacion
    
),

No es objeto de este artículo, comentar el proceso de autorización del RBAC de Yii. Para saber más acerca del significado de las tablas podéis condultar la Guia RBAC de Yii Framework (en inglés).

Paso 3: Poblar las tablas con los roles que necesitemos.

Para ello definimos un método en el controlador que nos permita, dar de alta los roles a través del AuthManager. Usamos CAuthManager::createRole() para crear cada uno de los roles. Esta función nos permite especificar un script de código PHP que se ejecutará cuando el sistema compruebe el rol.

function actionCrearRoles()
{
$auth=Yii::app()->authManager;
  $bizRule='return !Yii::app()->user->isGuest;';
  $auth->createRole('authenticated', 'authenticated user', $bizRule);
 
  $bizRule='return Yii::app()->user->isGuest;';
  $auth->createRole('guest', 'guest user', $bizRule);
}

En el ejemplo hemos creado dos roles: el rol de usuario autenticado, y el rol de invitado.

Paso 4 : Comprobación de roles

Para comprobar los roles de usuario simplemente tenemos que llamar al método checkAccess en los lugares de la aplicación donde queramos comprobar permisos, de la siguiente manera:

if(Yii::app()->user->checkAccess('guest'))
{
    // codigo para el usuario invitado
}

viernes, 29 de julio de 2011

Yii Framework: Creacion de combo desplegable

Explico la creación de una combo desplegable para un formulario sencillo con Yii Framework.


El escenario


Necesitamos llenar un desplegable de un formuario de introducción ó actualización de datos con datos de un modelo. En este escenario consideramos que los datos del modelo a obtener son distintos del modelo para el que estamos obteniendo los datos. 
Pasos de la solución
 Ejemplo




<?php 
 $estadosArray = CHtml::listData(Estado::model()->findAll(),'id','estado');
 echo $form->DropDownList($model,'estado',$estadosArray);
?>


En el ejemplo usamos Estado::model() para acceder al modelo y llamamos a la función que obtiene los datos de la base de datos. En nuestro caso findAll(), y después hay que especificar el nombre del campo clave, y del campo del modelo que se va a mostrar en el desplegable. 

Una vez hecho esto, a la hora de construir el DropDownList, debemos especificar el modelo actual, y el campo del modelo al que se asocia el resultado de lo que haya elegido en el campo desplegable.