Realizar validaciones sobre los datos recibidos por el usuario mediante un formulario es fundamental garantizar la integridad y la calidad de los datos solicitados; para esto es que se utilizan las validaciones de formularios indicando cuales campos son de caracter obligatorio y que estructura tiene que tener; las validaciones son particularmente importante en situaciones en las que se depende de estos datos, ya que los errores pueden ser costosos o incluso peligrosos ya que mediante los formularios no validados se pueden realizar procesos de inyección de SQL entre otros tipos de ataques.
Validar formularios en CodeIgniter es muy fácil; tan solo debemos conocer qué es lo que queremos validar; cuales son las reglas que vamos a incorporar; por ejemplo, si tenemos el siguiente formulario:
<div class="form-group">
<label>Nombre</label>
<input type="text" value="<?php echo $name ?>" class="form-control" placeholder="Nombre" name="name" required>
<?php echo form_error('name', '<div class="text-danger">', '</div>') ?>
</div>
<div class="form-group has-feedback">
<label>Apellido</label>
<input type="text" value="<?php echo $surname ?>" class="form-control" placeholder="Apellido" name="surname" required>
<?php echo form_error('surname', '<div class="text-danger">', '</div>') ?>
</div>
<div class="form-group has-feedback">
<label>Teléfono</label>
<input type="text" value="<?php echo $phone1 ?>" class="form-control" placeholder="Teléfono" name="phone1" required>
<?php echo form_error('phone1', '<div class="text-danger">', '</div>') ?>
</div>
<div class="form-group has-feedback">
<label>Teléfono 2</label>
<input type="text" value="<?php echo $phone2 ?>" class="form-control" placeholder="Teléfono 2" name="phone2" required>
<?php echo form_error('phone2', '<div class="text-danger">', '</div>') ?>
</div>
Nos interesa que todos los campos estén presentes a excepción del teléfono 2 que es completamente opcional, nos interesa colocar diversas longitudes máximas y mínimas en nuestro formulario y además también nos interesa que algunos campos como la edad solo permita tipos de datos enteros; todo esto y mucho más lo podemos hacer en CodeIgniter mediante la validación de formularios; entre los más importantes tenemos:
Regla | Parámetros | Descripción | Ejemplo |
---|---|---|---|
required | No | Retorna verdadero o falso si el elemento está vacío. | |
min_length | Si | Retorna FALSE si el elemento del formulario tiene una longitud más corta que la definida en el parámetro. | min_length[3] |
max_length | Si | Retorna FALSE si el elemento del formulario tiene una longitud más larga que la definida en el parámetro. | max_length[12] |
exact_length | Si | Retorna FALSE si el elemento del formulario tiene una longitud distinta a la definida en el parámetro. | exact_length[8] |
valid_email | No | Retorna FALSE si el elemento de formulario no tiene un email válido. | |
numeric | No | Retorna FALSE si el elemento de formulario contiene algún otro elemento que no sea un número. | |
integer | No | Retorna FALSE si el elemento de formulario no es un número entero |
Como puedes ver, tenemos reglas de validaciones para muchos casos, tipos de datos, emails, decimales, requeridos y cantidades máximas y mínimas para las longitudes de los String; estos son los que considero más importantes, pero puedes tener todas las reglas de validación desde la documentación oficial.
Entonces, para colocar reglas de validación en el formulario anterior debemos hacer lo siguiente:
$this->form_validation->set_rules('name', 'Nombre', 'max_length[100]|required');
$this->form_validation->set_rules('surname', 'Apellido', 'max_length[100]|required');
$this->form_validation->set_rules('phone1', 'Número de celular', 'min_length[9]|max_length[9]|required');
$this->form_validation->set_rules('phone2', 'Número de celular', 'min_length[9]|max_length[9]);
Como puedes ver, agregamos múltiples reglas de validación separadas por pipes (|); además de esto, fíjese que el teléfono 2 no se le aplica el tipo de validación "required" porque es completamente opcional; luego al momento de enviar el POST (también puede ser GET, simplemente cambia POST por GET):
if ($this->form_validation->run()) {
// datos a guardar
$save = array(
'name' => $this->input->post("name"),
'surname' => $this->input->post("surname")
);
}
Aquí simplemente cuando detectamos que el formulário es un Post y es válido simplemente componemos un array para luego guardarlo en base de datos; pero tu puedes hacer lo que tu quieras con la data validada.
Reglas personalizadas para el formulario en CodeIgniter
Puede ser que quieras crear tus propias reglas de validación personalizadas para CodeIgniter; para eso simplemente tienes que crear una función en tu clase controlador y evaluar su condición; lo importante es que retorne o verdadero o falso:
function validate_passwd($password) {
// At least one digit required
// $regex = '(?=.*\d)';
// At least one lower case letter required
$regex = '(?=.*[a-z])';
// At least one upper case letter required
// $regex .= '(?=.*[A-Z])';
// No space, tab, or other whitespace chars allowed
$regex .= '(?!.*\s)';
// No backslash, apostrophe or quote chars are allowed
$regex .= '(?!.*[\\\\\'"])';
if (preg_match('/^' . $regex . '.*$/', $password)) {
return TRUE;
}
return FALSE;
}
Y luego la agregas tus reglas de validación colocando la función creada anteriormente con el prefijo callback_
:
$crud->set_rules('passwd', 'Contraseña', 'min_length[8]|required|max_length[12]|callback_validate_passwd_admin');
Luego ve a tu archivo de lenguajes ubicado en application\language\english\form_validation_lang.php
y configuras el mensaje de error de tu nueva regla:
$lang['validate_same_passwd'] = "La contraseña debe ser igual a la almacenada en el sistema.";
Aquí estamos tomando como ejemplo que estás empleando el inglés como idioma por defecto en tu proyecto, pero si varías el idioma simplemente varías la carpeta.
Mensajes personalizados para las reglas de validación:
En el archivo anterior podemos definir los mensajes en caso de que queramos personalizar los mismos; pero también podemos hacerlo desde el controlador:
$this->form_validation->set_message('min_length', '{field} must have at least {param} characters.');
Mostrar errores del formulario
FInalmente, para mostrar los errores del formulario podemos emplear:
<?php echo form_error(name, '<div class="text-danger">', '</div>') ?>
Este elemento generalmente se coloca en la vista del formulario, al lado del elemento de formulario a la cual aplicamos la regla de validación que para este ejemplo es uno llamado name
.
Mostrar todos los errores del formulario de una
Muchas veces es útil mostrar los errores juntos, todos los errores del formulario desde un solo lugar desde una sola función, para eso existe la siguiente función:
validation_errors()
También puedes definir el elemento que contendrá dicho error que por defecto es simplemente una línea de texto, puedes colocarla en un alert de Bootstrap por ejemplo:
validation_errors('<div class="alert alert-danger" role="alert">', '</div>')
Ejemplo completo de un elemento de formulario en Bootstrap 5:
<div class="form-group">
<?php
echo form_label('Título', 'name');
?>
<?php
$text_input = array(
'name' => 'name',
'minlength' => 10,
'maxlength' => 100,
'required' => 'required',
'id' => 'name',
'value' => $name,
'class' => 'form-control input-lg',
);
echo form_input($text_input);
?>
<?php echo form_error('name', '<div class="text-danger">', '</div>') ?>
</div>
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter