Validaciones en Yii

| 2013-04-28 | No hay comentarios »

Un tema más que importante en toda aplicación es que tenga validaciones para evitar que el usuario ingrese cualquier dato por ejemplo a una base de datos, también es importante por cuestiones de seguridad.

Por suerte Yii framework nos provee validaciones de forma automática y también podemos crear nuestras propias validaciones muy fácilmente.

Si queremos validar campos lo hacemos en el método rules() del modelo en cuestión:


public function rules()
 {
 }

La validación para hacer campos obligatorios:

array('id_proveedor, fecha_compra, user, id_tipo_documento, total', 'required'),

También puedes especificar que el valor sea numero, incluso entero:

array('id_tipo_documento', 'numerical', 'integerOnly'=>true),
 array('igv, total, descuento_total', 'numerical'),

Para cadenas podemos restringir la longitud:

array('name','length','min'=>6, 'max'=>40),
array('id_proveedor, id_tipo_pago', 'length', 'max'=>10),

Para los correos electrónicos:

array('email_usuario', 'email'),

Para enlaces:

array('link', 'url'),

Para comparar dos campos del mismo formulario es así:

array('monto_1','compare','compareAttribute'=>'monto_2','operator'=>'<=','message'=>'El Monto 1 debe ser un numero menor o igual al monto 2'),
Para comparar cualquier cosa, en este caso fechas:
array('fecha_ini_lic','compare','compareValue'=>date('Y-m-d'),'operator'=>'=='), //Esto compara que la fecha de inicio de licitación sea igual a la fecha actual
 array('fecha_fin_lic','compare','compareValue'=>date('Y-m-d'),'operator'=>'>'),  //Esto compara que la fecha de finalización de licitación sea mayor a la fecha actual
array('fecha_nac_ciudadano','compare','compareValue'=>date('Y-m-d'),'operator'=>'<='), //Esto compara que la fecha de nacimiento sea menor o igual a la fecha actual

Si queremos validar que un campo sea único en la base de datos colocamos lo siguiente:

array('campo', 'unique', 'attributeName'=>'NombreModelo.dato'),

Para crear una validación propia:

array('total','ComprobarFondos'),

El campo total buscará la siguiente función dentro del modelo:


public function ComprobarFondos($attribute,$params) {
 if(!empty($this->attributes['total']) && !empty($this->attributes['id_tipo_documento'])) {
 if($this->attributes['id_tipo_documento']==1)
 {
 $id_subsidio=CabSubsidio::getUltimoSubsidio();
 if($id_subsidio!=null)
 {
 $cabSubsidio=CabSubsidio::model()->findByPk($id_subsidio);
 if($cabSubsidio->monto_actual_subsidio < $this->attributes['total'])
 {
 $this->addError($attribute,'No hay fondos suficientes para realizar la operacion.');
 }
 }
 else
 {
 $this->addError($attribute,'No hay fondos suficientes para realizar la operacion.');
 }
 }
 }
 }

Para comprobar combinaciones de campos (que sean únicos) utilizar:
array('numero_doc_ciudadano+documentos_id_documento', 'application.extensions.uniqueMultiColumnValidator'), //Descargar la extensión uniqueMultiColumnValidator y ponerlo en la carpeta extensions
Para saber si existe un id por ejemplo:
array('ciudadanos_id_ciudadano','exist','attributeName'=>'id_ciudadano','className'=>'Ciudadanos','allowEmpty'=>false),
Si tenemos varios campos que son FK (y permiten valores nulos) y queremos por ejemplo  guardar información solamente en uno de esos campos, utilizamos lo siguiente:
array('cab_ordendecompra_id_oden_de_compra,pagos_id_pago,depositos_id_deposito', 'ext.EmptyNullValidator'), ////Descargar la extensión EmptyNullValidator  y ponerlo en la carpeta extensions
Existen muchos otros tipos de validaciones, para ver todas las validaciones que trae Yii ir al siguiente link
———————————————————————————————————————————————————-
Agregado:
Yii por defecto crea el _form.php (está en views) para que las validaciones se hagan del lado del servidor al dar click en Crear o Actualizar en nuestro formulario, si queremos habilitar la validación del lado del cliente también utilizando JavaScript debemos de modificar el comienzo _form.php:

 <?php $form=$this->beginWidget('CActiveForm', array(
 'id'=>'productos-form', //Esto solo lo utilizo en este ejemplo
 'enableAjaxValidation'=>false, //Para habilitar validación AJAX (lado del servidor en tiempo real) poner en true, false significa deshabilitado

/*Atención:

Para habilitar la validación AJAX no basta con cambiar el false con true, también se debe hacer unas modificaciones en el controlador (Controllers/Productos.php):

Se debe descomentar la siguiente linea: // $this->performAjaxValidation($model); en las acciones Crear (actionCreate) y Actualizar (actionUpdate).

*/
 'enableClientValidation'=>true, //Para habilitar la validación del lado del cliente poner en true, false significa deshabilitado
 'clientOptions'=>array(
 'validateOnSubmit'=>true,   //Para habilitar la validación del lado del servidor poner en true, false significa deshabilitado
 )
)); ?>

Acerca del autor: Rodrigo Paszniuk

Ingeniero Informático, amante de la tecnología, la música, el ciclismo y aprender cosas nuevas.

Posts Relacionados

  • Reportes gráficos en Yii
  • Backup en Yii
  • Manual intermedio de Yii framework (PHP)
  • Maestro-Detalle / Factura Compra en Yii – Parte II



SEGUÍNOS EN FACEBOOK


GITHUB