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'),
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.'); } } } }
array('numero_doc_ciudadano+documentos_id_documento', 'application.extensions.uniqueMultiColumnValidator'), //Descargar la extensión uniqueMultiColumnValidator y ponerlo en la carpeta extensions
array('ciudadanos_id_ciudadano','exist','attributeName'=>'id_ciudadano','className'=>'Ciudadanos','allowEmpty'=>false),
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
<?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 ) )); ?>