ActionOsForm, una forma fácil de actualizar una Base de datos con PHP

Hace tiempo, cuando iniciaban los Frameworks para el desarrollo rapido de aplicaciones, en los tiempos de luz de Struts, Ruby on Rails, CakePHP, etc etc, uno no podía concebir para desarrollos rápidos o no orientados a objetos, existiera una manera facil rapida y escalable de hacer CRUD en una base de datos con validación de los datos “on the fly“, la pregunta obligada era ¿como puedo acoplar toda mi lógica de negocio?, a un sistema MVC como lo es un framework, sin mover todo mi código y bien solo tocar las partes que pueden crecer, como son los datos pedidos por una aplicación, hay muchos sistemas pequeños que no usan la lógica de negocio separada en capas y estan acostumbrados a usar una sola capa, ya que esto fue la punta de lanza del por que PHP triunfo en internet, era accesible hacer un “hello world” en 3 segundos, no obstante esto desemboco en sistemas poco escalables y dificil de mantener, por esto decidi hacer esta clase que funciona en el modelo a una capa, pero que permite, validar datos con reglas REGEX, ActionOSForm, es una clase pensada en mejorar esto, ya es código viejo, pero puede servir para mostrar alguna técnica, de optimización y reducción del código que se escribe dia con dia.

Vamos a hacer un ejemplo practico del cambio de paradigma y como nos ayuda ActionOsForm.

Tenemos una Base de datos con esta estructura.

Nombre de Tabla: Maestros

Campos: id_maestro,nombre, apellidos, RFC, claveAccesso,nivelAcceso

Necesitamos un sistema de altas, bajas y modificaciones, para esta tabla, en una aplicación tradicional en PHP, crearíamos un formulario y mandariamos los datos por POST hacia una pagina que procesaria los datos de nuestro formulario. En una aplicación tradicional hariamos esto.

Formulario HTML

Registro Maestro

Este formulario con los nombres de campos llamados, nombre, apellidos, y RFC respectivamente, van a ser enviados a una pagina llamada procesar.php, nuestro archivo procesar, se va a encargar de recibir estos datos, y registrarlos en una base de datos, en este caso mySQL.

En nuestra aplicación tradicional usando las funciones habituales de insersión de datos con mysql, procederiamos de la siguiente manera, en nuestro archivo procesar, vamos por pasos.

1.- Recibir los datos del formulario.

//Recibiriamos los datos por medio de POST
$nombre = $_POST['nombre'];
$apellidos = $_POST['apellidos'];
$rfc = $_POST['rfc'];

2.- Validar el formulario:

Aquí viene una de las grandes ventajas de ActionOsForm, en este momento nuestro formulario se ve muy sencillo de validar, ya que solo son pocos datos, ¿pero que sucede si un dia de estos nos dicen que agreguemos 15 campos mas para los datos del Maestro, seria tedioso crear una comprobación por cada campo suponiendo, que una validación simple podria ser de esta manera.

if(trim($nombre)!="" && trim($apellidos)!="" && trim($rfc)!=""){
	//Proceder a insertar los datos
}

Sorprendente el tamaño del IF o la condición que se tendría que crear para actualizar los demas, campos, Pero ¿Que tal si cada campo necesita un tratamiento de validación especial? como el RFC, que como ustedes saben o algunos tal vez no, es una clave que nos identifica a los Mexicanos, imaginemos que dentro de estos campos viene, también una fecha, una CURP, o tal vez un numero de identificación que cumple con algún patrón especifico. Tal vez podríamos hacer algo como esto…

2.1: Validación mas especifica

function isRFC($cadena)
{
$cadena = trim($cadena);
if(ereg("[a-zA-Z]{4}([0-9]{6})([A-Z0-9]{3})?$",$cadena))
	{
	return true;
	}else
		{
		return false;
		}
}
function isCURP($cadena)
{
$cadena = trim(strtoupper($cadena));
if(ereg("[a-zA-Z]{4}([0-9]{6})([A-Z]{6})([0-9]{2})$",$cadena))
	{
	return true;
	}else
		{
		return false;
		}
}
if(trim($nombre)!="" && trim($apellidos)!="" && isRFC($rfc) && isCURP($rfc) && N....){
	//Proceder a insertar los datos
}

No obstante, imaginemos el escenario, para actualizar un sistema de este tipo, tendriamos que aumentar el if, o bien hacer un if else if, sin embargo esto se vuelve tedioso con el tiempo, cuando se necesitan agregar nuevos tipos de datos al sistema o mas campos por validar, esto es lo que nos viene a resolver y ayudar ActionOsForm, como lo veremos mas adelante esto nos da un mayor control, de los mensajes de error y la encapsulación del proceso.

3.- Inserción de en la DB

$con = mysql_connect("localhost","usuario","password");
$sqlStr = "INSERT INTO Maestros (nombre,apellidos,RFC) VALUES ('".$nombre."','".$apellidos."','".$RFC."')";
$consulta = mysql_query($sqlStr,$con);

Volvemos a la misma tarea tediosa a la hora de actualización, si nos pidieran agregar 15 campos a la inserción, tendriamos que modificar esta consulta y concatenar, realmente no tenemos tiempo para tareas tediosas, imaginemos, al momento de la actualización y el borrado, es hora de conocer ActionOsForm.

Archivo procesar.php Completo

//Recibiriamos los datos por medio de POST
$nombre = $_POST['nombre'];
$apellidos = $_POST['apellidos'];
$rfc = $_POST['rfc'];

function isRFC($cadena)
{
$cadena = trim($cadena);
if(ereg("[a-zA-Z]{4}([0-9]{6})([A-Z0-9]{3})?$",$cadena))
	{
	return true;
	}else
		{
		return false;
		}
}
function isCURP($cadena)
{
$cadena = trim(strtoupper($cadena));
if(ereg("[a-zA-Z]{4}([0-9]{6})([A-Z]{6})([0-9]{2})$",$cadena))
	{
	return true;
	}else
		{
		return false;
		}
}
if(trim($nombre)!="" && trim($apellidos)!="" && isRFC($rfc) && isCURP($rfc) && N....){
	//Proceder a insertar los datos
}

//validamos los datos
if(trim($nombre)!="" && trim($apellidos)!="" && trim($rfc)!=""){
	//Proceder a insertar los datos
    $con = mysql_connect("localhost","usuario","password");
	$sqlStr = "INSERT INTO Maestros (nombre,apellidos,RFC) VALUES ('".$nombre."','".$apellidos."','".$RFC."')";
	$consulta = mysql_query($sqlStr,$con);
}else{
	echo "Datos incorrectos";
}

5.- Hagamos lo mismo con ActionOsForm, Para usar esta clase solo hace falta incluirla y utilizar los metodos para validar e insertar los datos, y sin escribir ninguna consulta SQL, ni tampoco una expresión regular para validar los datos. Todo lo anterior se puede resumir con ActionOsForm, a este codigo.

include("WEB-INF/class/actionOsForm.php");
	$registro = new actionOsForm('Maestros');
		$registro->activeData($_POST);
		if($registro->validateForm())
			{
			$registro->doInsert();
				if($registro->getNumErrors()==0)
					{
					echo "Registro insertado y validado";
					}else{
					$registro->getErrors();
					}
			}else{
			$registro->getErrors();
			}

Ahora, ¿como funciona?, este pedazo de codigo, ya válido los datos, por su tipo de datos, y encapsulo el posible error para que si no pasa la validación todo el formulario, regresar un arreglo con los errores generados en la validación..

Explicación linea a linea:

En esta linea incluimos la clase que se hara todo el trabajo pesado

include("WEB-INF/class/actionOsForm.php");

Creamos un nuevo objeto ActionOsForm Pasándole como argumento al constructor, la tabla en la que insertara los datos.

$registro = new actionOsForm('Maestros');

Pasamos los datos enviados por el formulario al método que contendría todos nuestros datos, con su respectivo tipo de datos.

$registro->activeData($_POST);

Esta sentencia condicional se encarga de validar todo el formulario entero, ya sean, nombres, apellidos, fechas, RFC, CURP, telefono, codigo postal, numeros, y regresa TRUE, en caso de que todos los datos sean validos y esten listos para sen insertados en la base de datos, en caso contrario, regresa FALSE y guarda en un Array Todos los errores de validación que pudieran surgir durante el proceso.

if($registro->validateForm())

Si los datos son validos, llamamos al método doInsert, encargado de crear una consulta SQL adecuada para ingresar los datos en la DB

$registro->doInsert();

Si cualquiera de los dos métodos, regresa FALSE podemos obtener los errores de inserción con el método..

$registro->getErrors();

Hasta la próxima :D, ¿parece útil no?, ¿Por que escribir tediosas consultas SQL, o validar datos, con expresiones regulares, si ActionOsForm lo puede hacer por ti, el codigo mencionado arriba, puede servir para 1 o para 100 campos sin aumentar ni una linea de código.