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.

En busca de la mejor torta ahogada

Eran las 4 am cuando Aldo, Ehe y yo seguiamos en vivo trabajando para sacar la intranet de Union Fenosa y yo también creando un pequeño mapa mental para la presentación que daria al Grupo Aeroportuario del Pacífico , después de una larga charla por iChat mientras trabajábamos yo sabía que tenia que irme a las 5 am directo al aeropuerto de la Ciudad de México por suerte InterJet ya inicio operaciones en este aeropuerto y ya no tengo que hacer un super drama para llegar al aeropuerto de Toluca.

Dicho me meti a bañar y corriendo me vesti, dieron las 5 en punto y ya estaba mi primo Ulises quien fue el elegido para llevarme, ya que tiene un taxi y asi no sufriría en encontrar uno que no me cobre un ojo de la cara ya que no falta eso aqui en Neza donde si progresas.

Platicamos en el camino acerca de este viaje y de mi idea Loca de comprar un auto, el camino fue muy rapido llegamos en 25 minutos al aeropuerto lo suficiente para estar a tiempo de que pasen toda la revisión donde te hacen que te quites el cinturón y se caigan los pantalones, asi mismo que segun no lleves cosas peligrosas y no se que patrañas, en fin lo bueno que no me detuvieron por llevar mi toronja para comer cuando me diera hambre, el vuelo salio tarde no se por que, pero no podia dormir, no sabria con que me enfrentaria llegando a Guadalajara, y que pasaría con la presentación y capacitación que daria a los usuarios del CMS de GAP, (Grupo Aeroportuario del Pacífico).

Despues de un largo viaje pude ver las nubes grises que azotan la ciudad, sin embargo el cielo se veia tan radiante y vivo como nunca lo había visto, tal vez era que deliraba un poco de no haber dormido nada casi durante toda la semana que habìa pasado trabajando para sacar los pendientes.

Llegando al aeropuerto me encontré con un clima calido-templado, el clima era perfecto, muy rico y agradable a pesar de que estaba chispeando el clima era un paraiso andante.

Eran las 8:10 llegamos tarde al destino prometido por que el avion se retraso mucho. Pero eso no importaba lo verdaderamente relevante era, ¿que voy a decir en GAP?, ¿que es lo que desean entender con mas claridad?, ¿con que tipo de usuarios me ire a topar?, ¿sera suficiente el manual que hice la semana pasada?, me conteste, NO LO SE, deje que las cosas tomaran su rumbo y tome el Taxi que me llevaria al WTC, ya lo tome e iba en camino cuando llamo Aldo diciendo que a que hora lo ayudaria a terminar el Index y unas locuras de la Intranet de FENOSA, le dije “Deja que llegue al starbucks y ahi me conecto, trabajamos y sacamos esto adelante” y me dijo “va que va”, despues me di cuenta que se gasto mi crédito por el Roaming.. “maldito telcel”, y me quede sin comunicación.

Eran las 10:00 am, y era la hora prometida para la capacitación en GAP, segui caminando por la Av. Mariano Otero, directo al destino.

Ya despues de un par de horas decidi emprender el camino directo hacia el centro de Guadalajara, tome un Taxi de esos amarillos y le pregunte al señor, ¿me podria llevar al centro? y me dice, ok vato vamonos para allá empezo la platica clasicá de un taxi y llegamos al centro, pero antes de eso el Taxista se ofrecio a llevarme a algunas opciones de Hotel, y me decia que si entre mis posibilidades estaba pagar alrededor de 600 Pesos, que por que como el me veia, no se le hacia como para que me quedara en un hotel lleno de piojos y demás, je.

Llegamos a un hotel que la fachada no se me hacia nada lujoso, pero pues estaba pasable,  y dije, pues no se ve tan mal, decidi entrar para ver si me convencía y si si me convecio, total decidi quedarme y me despedi del taxista que antes de eso habriamos acordado que mañana me recogeria en el mismo lugar, para llevarme de regreso al aeropuerto. Entre a la habitación, deje mis cosas y decidi emprender la busqueda por la mejor torta ahogada de Guadalajara.

Después de caminar un rato por el centro de Guadalajara, al rededor de 5 horas llegue al destino prometido, las al Sears del centro, sin embargo al llegar a la parte de atras de la tienda no encontre ningun puesto de Tortas ahoagadas, ni si quiera un local, regrese triste y frustrado y decidi dormir, ya que al siguiente día emprendería un nuevo viaje en la busqueda de la Torta ahogada, despues de recorrer nuevamente el centro decidi acercarme a un modulo de información a turistas y preguntar por las dichosas tortas, a lo que la Persona encargada del kiosco me dijo. “Claro vato las Tortas de atras del sears” y yo dije – Pero si ya estuve ayer ahí y no hay nada, y me comento es que acaban muy temprano al rededor de las 2 PM. Entonces decidi ir para allá nuevamente y listo, e aquí el lugar.