Foros del Web » Programando para Internet » PHP »

Aporte: Validación de Formularios

Estas en el tema de Aporte: Validación de Formularios en el foro de PHP en Foros del Web. Bueno hace realmente mucho que no aportaba con algo, así que aquí dejo una class que utilizo en mi framework para realizar el trabajo con ...
  #1 (permalink)  
Antiguo 28/03/2013, 14:40
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
De acuerdo Aporte: Validación de Formularios

Bueno hace realmente mucho que no aportaba con algo, así que aquí dejo una class que utilizo en mi framework para realizar el trabajo con los formularios.

La adapté para que no fuera necesario mi framework para su uso

Código PHP:
<?php
class Khaus_Form_Valid
{
    private 
$_vars;

    private 
$_errors;
    
    const 
VALIDATE_RUT 1;
    const 
VALIDATE_DATE 2;
    const 
VALIDATE_EMAIL 4;
    const 
VALIDATE_URL 8;

    
/**
     * Entrega como parametro el arreglo capturado del formulario
     * 
     * @example $form = new Khaus_Form_Valid($_POST);
     * 
     * @access public
     * @param array $method arreglo $_GET, $_POST, $_REQUEST
     * 
     */
    
public function __construct(array $method)
    {
        
$this->_vars = array();
        
$this->_errors = array();
        foreach (
$method as $key => $value) {
            
$this->_vars[$key] = $value;
        }
    }

    
/**
     * Valida los elementos del formulario llamando al atributo name
     * 
     * Entregando dos parametros, valida que el elemento del formulario concuerde
     * con las reglas establecidas y establece un mensaje de retorno en caso de 
     * que el valor sea incorrecto.
     * 
     * El primer parametro acepta:
     * - Pattern de PCRE
     * - Funciones
     * - Constantes de la class establecidas
     * 
     * @example:
     * $form = new Khaus_Form_Valid($_POST);
     * 
     * # Validando con PCRE
     * $form->nombre('/[a-z]{1,15}/i', 'El nombre debe tener entre 3 y 15 caracteres');
     * 
     * # Validando con funcion anonima
     * $form->edad(function($dato){
     *     return $dato < 18;     
     * }, 'No puedes ser menor de edad');
     * 
     * # Validando con constante establecida por la clase
     * $form->email(Khaus_Form_Valid::VALIDATE_EMAIL, 'El correo es invalido');
     * 
     * @param mixed $validation
     * @param string $mensaje de error
     * @throws Exception en caso de no existir la variable
     */
    
public function __call($name$arguments)
    {
        if (isset(
$this->_vars[$name])) {
            if (!isset(
$this->_errors[$name])) {
                list(
$validation$errorMessage) = $arguments;
                if (
is_string($validation)) {
                    if (!
preg_match($validation$this->_vars[$name])) {
                        
$this->_errors[$name] = $errorMessage;
                    }
                }
                if (
is_callable($validation)) {
                    if (!
$validation($this->_vars[$name])) {
                        
$this->_errors[$name] = $errorMessage;
                    }
                }
                if (
is_int($validation)) {
                    if ((
$validation self::VALIDATE_RUT) != 0) {
                        if (!
$this->_validateRUT($this->_vars[$name])) {
                            
$this->_errors[$name] = $errorMessage;
                        }
                    }
                    if ((
$validation self::VALIDATE_DATE) != 0) {
                        if (!
$this->_validateDate($this->_vars[$name])) {
                            
$this->_errors[$name] = $errorMessage;
                        }
                    }
                    if ((
$validation self::VALIDATE_EMAIL) != 0) {
                        if (!
$this->_validateEmail($this->_vars[$name])) {
                            
$this->_errors[$name] = $errorMessage;
                        }
                    }
                    if ((
$validation self::VALIDATE_URL) != 0) {
                        if (!
$this->_validateUrl($this->_vars[$name])) {
                            
$this->_errors[$name] = $errorMessage;
                        }
                    }
                }
            }
        } else {
            
$message sprintf('%s is not found in form data'$name);
            throw new 
Exception($message100);
        }
    }
    
    
/**
     * Revisa la existencia de los parametros
     * 
     * Utilizado por lo general para verificar que existan todos los elementos del form
     * @example
     * 
     * if ($form->exist('nombre', 'apellido') {
     *     // continuar con la validacion del formulario
     * } else {
     *     // do something else
     * }
     * 
     * @param string $name
     * @param string $_
     * @return boolean
     */
    
public function exist($name$_ '')
    {
        
$arguments $this->_arrayFlatten(func_get_args());
        foreach (
$arguments as $value) {
            if (!isset(
$this->_vars[$value])) {
                return 
false;
            }
        }
        return 
true;
    }
    
    
/**
     * Sanitiza los valores
     * 
     * En caso de entregarle parametros sanitiza los especificados,
     * en caso de que no se le entregue ninguno, los sanitiza todos.
     * 
     * @example
     * $form->valid('nombre', 'apellido');
     * 
     * @param string $name
     * @param string $_
     * @return Khaus_Form_Valid
     */
    
public function sanitize($name ''$_ '')
    {
        function 
clean($element)
        {
            
$element addslashes($element);
            
$element trim($element);
            return 
$element;
        }
        
$arguments $this->_arrayFlatten(func_get_args());
        if (empty(
$arguments)) {
            foreach (
$this->getFormData() as $key => $value) {
                
$this->_vars[$key] = clean($value);
            }
        } else {
            foreach (
$arguments as $value) {
                
$this->_vars[$value] = clean($this->_vars[$value]);
            }
        }
        return 
$this;
    }
    
    
/**
     * Retorna un booleano indicando si el formulario esta vacio o no
     * @example
     * 
     * if ($form->isEmpty()) {
     *     // no hay datos en el formulario
     * }
     * 
     * @return bool si el formulario esta vacio
     */
    
public function isEmpty()
    {
        return empty(
$this->_vars);
    }
    
    
/**
     * Retorna un arreglo con los valores del formulario
     * @return array
     */
    
public function getFormData()
    {
        return 
$this->_vars;
    }
    
    
/**
     * Retorna un booleano indicando si el formulario contiene errores
     * luego de realizar una validacion
     * 
     * @example
     * $form->email(Khaus_Form_Valid::VALIDATE_EMAIL, 'El email es invalido');
     * if ($form->isValid()) {
     *     // guardar datos
     * }
     * 
     * @return boolean
     */
    
public function isValid()
    {
        return empty(
$this->_errors);
    }

    public function 
getErrors()
    {
        return 
$this->_errors;
    }
    
    
/**
     * Obtiene un dato del formulario
     * 
     * @example
     * echo 'El nombre ' . $form->nombre . ' es demasiado raro';
     * 
     * @param string $name keyName del formulario
     * @return mixed valor del formulario
     * @throws Exception en caso de que no exista el valor
     */
    
public function __get($name)
    {
        if (isset(
$this->_vars[$name])) {
            return 
$this->_vars[$name];
        } else {
            
$message sprintf('%s is not found in form data'$name);
            throw new 
Exception($message110);
        }
    }
    
    private function 
_validateRUT($element)
    {
        
$rut str_replace(array('.''-'), ''$element);
        if (
preg_match('/^(\d{1,8})(\d|k|K)$/'$rut$group)){
            
$acum 1;
            
$rut $group[1];
            for (
$m 0$rut != 0$rut /= 10) {
                
$acum = ($acum $rut 10 * ($m++ % 6)) % 11;
            }
            return 
chr($acum $acum 47 75) == strtoupper($group[2]);
        }
    }
    
    private function 
_validateDate($element)
    {
        return 
strtotime($element);
    }
    
    private function 
_validateEmail($element)
    {
        return 
preg_match('/^[a-z0-9._-]+@(?:[a-z0-9-]+\.)+[a-z]{2,6}$/i'$element);
    }
    
    private function 
_validateUrl($element)
    {
        return 
preg_match('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6}).*\/?$/i'$element);
    }
    
    private function 
_arrayFlatten(array $array$toLower false)
    {
        
$newArray = array();
        
$array = new RecursiveArrayIterator($array);
        
$array = new RecursiveIteratorIterator($array);
        foreach (
$array as $key => $value) {
            
$newArray[] = $toLower strtolower($value) : $value;
        }
        return 
$newArray;
    }
}
Forma de uso (al menos la que le doy yo)

Código PHP:
<?php
$form 
Khaus_Form_Valid($_POST);
if (
$form->exist('nombre''edad''email')) {
    
$form->sanitize('nombre''email');
    
$form->nombre('/[a-z]{1,15}/i''El nombre debe tener entre 3 y 15 caracteres');
    
$form->edad(function($dato){
        return 
$dato 18;
    }, 
'No puedes ser menor de edad');
    
$form->email(Khaus_Form_Valid::VALIDATE_EMAIL'El correo es invalido');
    if (
$form->isValid()) {
        
// Guardo datos en DB
    
} else {
        
// yo proceso mis formularios por ajax asi que envio un print de JSON de los errores
        
echo json_encode($form->getErrors());
    }
}
PD: como punto aparte, la class se puede modificar como quieran, yo le puse algunas validaciones por defecto que quizá no les sirvan como el RUT que en este caso corresponde al algoritmo de la Cédula de Identidad de Chile.

Bueno y eso, la class está bastante documentada, pero si tienen alguna duda sólo pregunten dentro de este mismo tema.

PD2: no respondo dudas por MP

saludos
__________________
More about me...
~ @rhyudek1
~ Github
  #2 (permalink)  
Antiguo 28/03/2013, 20:05
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Aporte: Validación de Formularios

Habrá que revisar más a fondo tu aporte y problarlo, por ahora, no entiendo porqué el addslashes(), si es una preparación para guardar en base de datos, entonces sería mejor aplicar el escape adecuado, ya sea con las funciones de acuerdo al motor de base de datos y/o librería usada (mysql, mysqli, pdo, etc.).
__________________
- León, Guanajuato
- GV-Foto
  #3 (permalink)  
Antiguo 01/04/2013, 08:12
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 14 años, 6 meses
Puntos: 334
Respuesta: Aporte: Validación de Formularios

yo utilizo un escape dependiente de cada DB como dices pero dentro de mi framework, el problema es que lo hago haciendo uso del patrón activeRecord, y la verdad es que la intenté adaptar para un uso sin mi fw y quizá me apresuré un poco aksjdsa :') bueno todo es modificable a las necesidades que le pretenda dar cada uno.

saludos.
__________________
More about me...
~ @rhyudek1
~ Github

Etiquetas: form, formulario, validacion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 06:09.