Ver Mensaje Individual
  #3 (permalink)  
Antiguo 16/11/2008, 12:29
yoguuu
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 4 meses
Puntos: 2
Respuesta: Alternativa Variables variables y $this

Cita:
Estimado:

Primero no entiendo para qué necesitas hacer todo esto.
Gracias por la respuesta primero de todo. Si, reconozco que el post puede ser un poco ambiguo, no había dormido. La cuestión es que quería hacer una clase para validar inputs (validar formularios). Pues es un engorro cuando tienes que hacer algo y validar a mano. Para ello de momento hice esto:

Código PHP:
class InputValidator {
    
    private 
$_method;
    private 
$_errorList = array();
    
    public function 
__construct($method NULL) {
        
$this->unsetErrorList();   // Limpia el array de errores
        
if(isset($method)) {
            
$this->_method $method;
        }
    }
    
    public function 
setMethod($method){
        
$this->_method $method;
    }
    
    public function 
getMethod(){
        return 
$this->method;
    }
    
/* Como no supe crear una variable dinámica en función del valor
de $this->method hice este metodo provisional que discrimina entre 
POST o GET explicitamente y devuelve la variable de cada caso... 

Lo que pretendía era, un metodo que en función de pasarle el nombre
de la clave de 'x' tipo superglobal, este generase la variable y retornase su valor.
De esta forma ganaría en genericidad y flexibilidad. Pienso.

*/
    
public function getNameValue($field) {
        if (
$this->_method == "POST") {
            return 
$_POST[$field];
        }
        if (
$this->_method == "GET") {
            return 
$_GET[$field];
        }
    }
// Un filtro isEmpty
    
public function isEmpty($field$msg) {
        
$value $this->getNameValue($field);  // En cada filtro obtendría el valor del campo, sin importar de donde viene no solo get o post
        
if (trim($value) == "") {
            
$this->_errorList[] = array("field" => $field"value" => $value"msg" => $msg);
            return 
false;
        } else {
            return 
true;
        }
    }

// Retorna el array de errores para ser manejado...
    
public function getErrorList()    {
        return 
$this->_errorList;
    }

// Comprueba el nº de errores
    
public function isError() {
        if (
sizeof($this->_errorList) > 0) {
            return 
true;
        } else {
            return 
false;
        }
    }

// resetea la lista de errores
    
public function unsetErrorList(){
        
$this->_errorList = array();
                
// También...    unset($this->_errorList);
    
}

Luego para usarlo sería básicamente algo así:

Código PHP:
<?php

$iv 
= new InputValidator();
$iv->setMethod("GET");
$iv->isEmpty('user''El campo "Usuario" no puede estar vacío.');

if (
$iv->isError()){
    echo 
"Hay errores <BR />";

    
$errors $iv->getErrorList();

    echo 
"<ul>";
    foreach (
$errors as $e) {
        echo 
"<li>" $e['field'] . "<BR />" $e['value'] .  "<BR />" $e['msg'];
    } 
    echo 
"</ul>";    
} else {
    echo 
"No hay errores";
}


?>
Y aunque al usar la clase solo defines un metodo (setMethod("x"))... si puedo hacer directamente la función que obtiene los valores para que soporte otros tipos de input, es lo que preferiría hacer. Por que los filtros podría hacerlos indistintamente. Me interesaba hacerlo así por no tener que incluir el tipo de input en la firma de los metodos de filtro. De esta forma lo trabajaría de forma interna. Simplicando el uso.

Cita:
Segundo, tanto problema con un array de sistema?

Si es un array, recórrelo y punto, ahí tienes todos los elementos para cargarlos dinámicamente, no necesitas "variables variables".
¿ Con array de sistema te refieres a las SUPERGLOBALES ? Como digo, sabría discriminar explicitamente entre un tipo o otro de superglobal, por simple control de flujo, pero... no cargarlo dinámicamente. Mi creatividad no me da... :S

Cita:
Y si no quieres diferenciar entre GET y POST, usa REQUEST.
Lo tengo en mente, pero no sé si me interesa tratar todos los input como un solo tipo... No quiero perder la identidad de que tipo de input viene... si post, get, session etc...

Última edición por yoguuu; 16/11/2008 a las 12:44