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'=>'ElMonto 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
)
)); ?>