martes, 6 de mayo de 2014

Validación de formularios

Muchas veces necesitamos validar los datos ingresados en un formulario antes de que sean grabados en la base de datos.

Para ello, en el modelo de nuestras tablas, tenemos el método o función pública rules().
Ésta función es llamada automáticamente por Yii antes de grabar los datos del formulario al utilizar $model->save().

Para el caso de nuestra tabla Persona,


podemos tener algo como lo siguiente:

public function rules()
{
// NOTE: you should only define rules for those attributes that
// will receive user inputs.
return array(
array('identificacion, nombres, apellidos, sexo, estado_civil_id, fecha_nacimiento', 'required'),
array('estado_civil_id', 'numerical', 'integerOnly'=>true),
array('identificacion', 'length', 'max'=>25),
array('nombres, apellidos', 'length', 'max'=>100),
array('sexo', 'length', 'max'=>10),
array('descripcion', 'safe'),
// The following rule is used by search().
// @todo Please remove those attributes that should not be searched.
array('id, identificacion, nombres, apellidos, sexo, estado_civil_id, fecha_nacimiento, descripcion', 'safe', 'on'=>'search'),
);
}

Como podemos ver, la función recibe un arreglo con cada una de las reglas, y cada una de estas reglas es a la vez un arreglo. Entre algunas de las reglas utilizadas podemos mencionar:

Validar que un campo sea obligatorio
array('identificacion, nombres, apellidos, sexo, estado_civil_id, fecha_nacimiento', 'required'),

Validar que un campo sea numérico
array('precio', 'numerical'),

Validar que un campo sea numérico y entero
array('estado_civil_id', 'numerical', 'integerOnly'=>true),

Validar que un campo de texto tenga una longitud mínima
array('identificacion', 'length', 'min'=>20),

Validar que un campo de texto tenga una longitud máxima
array('identificacion', 'length', 'max'=>25),

Validar que un campo de texto tenga una longitud mínima y máxima
array('identificacion', 'length', 'min'=>20, 'max'=>25),

Validar que un campo de texto tenga una longitud exacta
array('codigo', 'length', 'is'=>3),

Validar que un campo numérico tenga un valor mínimo
array('numero', 'numerical', 'min'=>1),

Validar que un campo numérico tenga un valor máximo
array('numero', 'numerical', 'max'=>999),

Validar que un campo tenga una dirección de correo válida
array('correo', 'email'),

Validar que un campo tenga una dirección web válida
array('pagina_web', 'url'),

Validar que un campo sea único
array('identificacion', 'unique'),

Validar que un campo sea único bajo cierta condición
array('campo', 'unique', 
'criteria'=>array('condition'=>'condicion') ),

Comparar un campo con un valor determinado
array('nombre_del_campo', 'compare', 'compareValue'=>'valor_de_comparacion', 'operator'=>'operador'),

array('codigo', 'compare', 'compareValue'=>'000', 'operator'=>'!='),


Comparar dos campos del formulario entre si
array('campo_a_comparar', 'compare', 'compareAttribute'=>'campo_referencial', 'operator'=>'operador', 'message'=>'mensaje_personalizado'),

Validar que dos campos sean iguales (por ejemplo, cuando se crea una clave y hay que ingresarla 2 veces)
array('clave_2', 'compare', 'compareAttribute'=>'clave_1', 'operator'=>'=', 'message'=>'Debe repetir la clave exactamente igual'),

Asignar un valor por defecto si el campo no tiene valor o está vacío
array('campo', 'default', 'setOnEmpty'=>'valor_por_defecto'),

array('fecha_final', 'default', 'setOnEmpty'=>'null'),

Por ejemplo, en MySQL es útil con los campos de fechas, ya que la base de datos guarda por defecto el valor '0000-00-00' y lo que realmente queremos es un valor nulo o vacío.


Validar que un campo sea un archivo, sea de ciertas extensiones, tenga un tamaño máximo y sea obligatorio
array('farchivo', 'file', 
'types'=>'pdf, doc, docx, jpg, jpeg, png, gif',
'maxSize'=>1024*1024*3,
'tooLarge'=>'El archivo no puede exceder los 3MB.',
'allowEmpty'=>false),

Validaciones personalizadas

También es posible escribir nuestras propias reglas de validación.
Para ello, debemos escribir de la forma:
array('campo', 'validacionPersonalizada'),

y en el mismo archivo del modelo, creamos nuestra propia función, algo similar a:
public function validacionPersonalizada()
{
    if (no_pasa_nuestras_validaciones)
        $this->addError('campo', 'Mensaje de error personalizado.');
}




También te puede interesar:
Formulario de ingreso de datos
Todas las entradas sobre Formularios en Yii

No hay comentarios.:

Publicar un comentario