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($message, 100);
}
}
/**
* 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($message, 110);
}
}
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 * (9 - $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;
}
}
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());
}
}
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