Vale. Aquí está, la clase "Norma" (en mi framework, cada clase tiene el nombre de una constelación... algo debo hacer para no aburrirme) y abajo, una función que implemente esta clase para validar. Tomando los mismos prefijos que mencioné anteriormente.
Con ello se pueden hacer ambas validaciones sin esfuerzo alguno...
Código :
<?php
class Norma {
function __construct(&$campo,&$valor) {
$this->campo = $campo;
$this->valor = trim($valor);
$this->tipo = strtolower( $campo[0] );
$this->error = false;
}
function esObligatorio() {
$car = $this->campo[0];
if ( !ereg('[A-Z]',$car) || ($car == 'W') ) return false;
return true;
}
function vacio() {
if ( $this->valor != '' ) return false;
$this->error = 'Debe completar el campo "'.$this->formatoNombre().'"';
return true;
}
function natural() {
if( !ereg('[^0-9]',$this->valor) ) return true;
$this->error = 'El campo "'.$this->formatoNombre().'" solo puede tener numeros enteros sin signo';
return false;
}
function entero() {
if( ereg('^-?[0-9]+$',$this->valor) ) return true;
$this->error = 'El campo "'.$this->formatoNombre().'" solo puede tener numeros enteros';
return false;
}
function realPositivo() {
if( !ereg('[^0-9.]',$this->valor) ) return true;
$this->error = 'El campo "'.$this->formatoNombre().'" solo puede tener numeros sin signo';
return false;
}
function numeroReal() {
if( !ereg('[^0-9.-]',$this->valor) ) return true;
$this->error = 'El campo "'.$this->formatoNombre().'" solo puede tener numeros';
return false;
}
function soloTexto() {
if( ereg('^[a-z A-Z]+$',$this->valor) ) return true;
$this->error = 'El campo "'.$this->formatoNombre().'" solo puede tener texto';
return false;
}
function correo() {
if( ereg('(^[a-z][a-z0-9\-_.]+[@][a-z0-9\-_.]+[.][a-z]+$)',$this->valor) ) return true;
$this->error = 'el campo "'.$this->formatoNombre().'" debe ser un correo valido';
return false;
}
function estaSeleccionado() {
if ( ($this->valor != '0') && ($this->valor != '') ) return true;
$this->error = 'debe eligir un valor del combo "'.$this->formatoNombre().'"';
return false;
}
function formatoNombre() {
return ucfirst( str_replace('_',' ', substr($this->campo,1) ) );
}
}
?>
prefijos adicionales:
c - es para combos
p - para contraseñas
f - para archivos
Nota: se comprueba el campo "id" (que no puede faltar en ningun formulario) si id es igual a 0, quiere decir que se está agregando, sino que se está modificando (sólo uso un formulario para ambas cosas, cuestiones de pereza, supongo). Si se está modificando, archivos o contraseña son opcionales, aun cuando se hayan puesto como obligatorios.
Nota 2: aDatos es equivalente a POST
Código :
function validar() {
require_once(LIB.'norma.lib.php');
$actualizar = $this->aDatos['id'];
foreach($this->aDatos as $campo => $valor):
$campo = new Norma($campo,$valor);
switch( $campo->tipo ):
case 'i': break;
case 'c':
if ( $campo->esObligatorio() ) $campo->estaSeleccionado();
break;
case 'f':
case 'p':
if ( !$actualizar && $campo->esObligatorio ) $campo->vacio();
break;
default:
if ( !( $campo->esObligatorio() && $campo->vacio() ) )
switch ( $campo->tipo ):
case 't': $campo->soloTexto(); break;
case 'n': $campo->natural(); break;
case 'z': $campo->entero(); break;
case 'q': $campo->realPositivo(); break;
case 'r': $campo->numeroReal(); break;
case 'e': $campo->correo(); break;
endswitch;
endswitch;
if ( $campo->error ) $this->errores .= "<li>$campo->error</li>\n";
endforeach;
return ( $this->errores == '' ? true : false );
}
}
cualquier acotación la recibo con gusto. Un saludo