Simplifique el manejo de formularios a lo grande

¡Ahorre tiempo, reduzca los problemas de mantenimiento, simplifique su código y hágalo todo mientras se siente como un genio! En este tutorial, aprenda cómo usar variables variables, matrices de búsqueda y un poco de programación inteligente para simplificar el manejo de formularios de una manera grande.


Variables variables, métodos y propiedades

Antes de que podamos profundizar en el uso de una matriz de búsqueda, es importante comprender primero el concepto detrás de las variables.

¿Qué son las variables variables??

Variable variable es un término que describe el uso de una variable para declarar otra variable.

En la forma más simple, una variable podría verse como:

 $ foo = 'Un valor!'; // Declarar un valor inicial $ bar = 'foo'; // Espera, ¿qué está pasando? echo $$ bar; // ¡Santo cielo! Esa salida 'Un valor!'

¿Por qué debería importarte??

Cuando nos fijamos en una prueba de concepto como el ejemplo anterior, el uso de variables variables parece bastante tonto y demasiado complicado. Sin embargo, existen razones sólidas y prácticas para usarlas en algunos casos..

Ejemplos prácticos

El uso responsable de variables variables puede reducir drásticamente la cantidad de código que debe repetirse, por ejemplo, convirtiendo una matriz asociativa en un objeto con valores desinfectados.

Ejemplo sin variables variables

$ comment = new stdClass (); // Crear un objeto $ comentario-> nombre = sanitize_value ($ array ['nombre']); $ comentario-> email = sanitize_values ​​($ array ['email']); $ comentario-> url = sanitize_values ​​($ array ['url']); $ comment-> comment_text = sanitize_values ​​($ array ['comment_text']);

Ejemplo con variables variables

$ comment = new stdClass (); // Crear un nuevo objeto para cada ($ array como $ key => $ val) $ comment -> $ key = sanitize_values ​​($ val); 

¿Ves cuanto más simple era eso? Y os podéis imaginar cuál es el ejemplo. sin las variables variables se verían como si la matriz tuviera algo como 50 o 100 valores.

NOTA: Soy consciente de que también podrías usar array_map () y emitir explícitamente la matriz como un objeto para lograr lo mismo. Ese no es el punto. Aquí estamos ilustrando un concepto. Seguir la corriente.


El problema con el procesamiento de formularios

Hacer que el procesamiento de formularios sea sencillo.

Ahora que sabe cómo usar variables variables, podemos pasar a la carne y las papas de este artículo, que es la idea de que incorporar una matriz de búsqueda en lugar de varios archivos de controladores o una declaración de cambio puede ahorrarle mucho mantenimiento adicional. Código repetido, y dolor de cabeza en general..

Para ilustrar nuestro concepto, vamos a utilizar la idea de procesamiento de formularios. Este es un aspecto esencial de la programación web, y También puede ser una de las áreas más tediosas de cualquier proyecto..

Sin embargo, después de reevaluar sus hábitos de codificación, puede hacer que el procesamiento de formularios sea muy fácil.

Con frecuencia, se crea un archivo individual para cada formulario que se va a procesar o se usa una instrucción de cambio. En esta sección, veremos cómo se pueden implementar ambas soluciones y luego examinaremos una solución utilizando variables variables y cómo puede mejorar sus proyectos..

Un ejemplo de trabajo con múltiples archivos de procesamiento de formularios

Un método que se usa con frecuencia para manejar el envío de formularios es crear un archivo completamente nuevo para manejar los datos de cada formulario por separado..

Tome, por ejemplo, estos tres formularios que actualizan una cuenta de usuario con un nombre nuevo, un nuevo correo electrónico o ambos:

Formulario 1

Formulario 2

Formulario 3

Cada uno de estos formularios apunta a un archivo de procesamiento diferente. Entonces, ¿cómo se ve cada uno de estos archivos??

Formulario de procesamiento 1 (activo / inc / ex1-form1.php)

save_name (); // Para este ejemplo, simplemente envíe algunos datos sobre el envío del formulario echo "
Archivo de procesamiento: ", $ _SERVER ['PHP_SELF']," \ n \ nMétodo de salida:\ n ", $ salida,"
\ n ", '

Regresa

'; else die ('Envío de formulario no válido');

Formulario de procesamiento 2 (activo / inc / ex1-form2.php)

save_email (); // Para este ejemplo, simplemente envíe algunos datos sobre el envío del formulario echo "
Archivo de procesamiento: ", $ _SERVER ['PHP_SELF']," \ n \ nMétodo de salida:\ n ", $ salida,"
\ n ", '

Regresa

'; else die ('Envío de formulario no válido');

Formulario de procesamiento 3 (activo / inc / ex1-form3.php)

save_both (); // Para este ejemplo, simplemente envíe algunos datos sobre el envío del formulario echo "
Archivo de procesamiento: ", $ _SERVER ['PHP_SELF']," \ n \ nMétodo de salida:\ n ", $ salida,"
\ n ", '

Regresa

'; else die ('Envío de formulario no válido');

Como puede ver claramente, los archivos de ejemplo anteriores están duplicando una tonelada de código. Amplíe esto a 15 formularios en un sitio, y encontrará rápidamente que el mantenimiento podría convertirse en una pesadilla..

La clase de cuenta

Como puede ver, los archivos de procesamiento están creando una instancia de la clase CopterLabs_Account. Esta será una clase muy simple que genera información sobre el envío de un formulario..

Aquí está el código para la clase (asset / inc / class.coperlabs_account.inc.php):

 * @opyright 2011 Copter Labs * @license http://www.opensource.org/licenses/mit-license.html * @license http://www.gnu.org/licenses/gpl-3.0.txt * / class CopterLabs_Account public $ name = NULL, $ email = NULL; función pública save_name () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); devuelve "Método:". __METHOD__. "\ nNombre:". $ este-> nombre. "\norte";  función pública save_email () $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); devuelve "Método:". __METHOD__. "\ nEmail:". $ esto-> correo electrónico. "\norte";  public function save_both () $ this-> name = htmlentities ($ _ POST ['name'], ENT_QUOTES); $ this-> email = htmlentities ($ _ POST ['email'], ENT_QUOTES); devuelve "Método:". __METHOD__. "\ nNombre:". $ este-> nombre. "\ nEmail:". $ esto-> correo electrónico. "\norte"; 

Puede probar este código en el Ejemplo 1 en la página de demostración..

Un ejemplo de trabajo con un solo archivo de procesamiento y una declaración de cambio

Otra solución popular para el procesamiento de formularios es consolidar todos los scripts de procesamiento en un archivo y determinar qué hacer con los datos mediante una instrucción de cambio..

El enfoque de cambio comúnmente emplea un truco en el que se agrega una entrada oculta a la forma que contiene una acción que se debe realizar al momento de la presentación. Esta
La acción se usa para determinar qué hacer con el formulario..

Aquí están las mismas tres formas, desde arriba, con acciones agregadas, todas apuntando a un único archivo de procesamiento:

Formulario 1

Formulario 2

Formulario 3

Y el nuevo archivo de procesamiento se ve como: (activo / inc / ex2-switch.php)

save_name (); descanso; // Caso de manejo de formulario 2 'update-email': $ output = $ account_obj-> save_email (); descanso; // Caso de manejo del formulario 3 'update-both': $ output = $ account_obj-> save_both (); descanso; // Si no se encuentra una acción válida, algo no es correcto por defecto: die ('Acción no compatible.');  // Para este ejemplo, simplemente envíe algunos datos sobre el envío del formulario echo "
Archivo de procesamiento: ", $ _SERVER ['PHP_SELF']," \ nAction: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMétodo de salida:\ n ", $ salida,"
\ n ", '

Vuelve al ejemplo 2.

'; else die ('Envío de formulario no válido');

Puede ver esto en acción visitando el Ejemplo 2 en la página de demostración. Esta es una mejora marcada en el uso de múltiples formularios, pero puede ver que todavía estamos duplicando algunos códigos..

Además de eso, es una preferencia personal mía para evitar cambiar Declaraciones siempre que pueda. Esto se debe al hecho de que cambiar utiliza comparaciones sueltas ('una cuerda' se activará caso 0 porque una cadena evalúa a 0 si lo conviertes a un entero) y es extremadamente Fácil de convertir en código espagueti..


Arreglando el Problema: Arreglos de Búsqueda y Variables Variables

Como hemos visto hasta ahora, ambas soluciones anteriores tienen sus inconvenientes y requieren un código duplicado. Imagínese si hubiera una docena o más formularios en el sitio - no es bonito.

Para abordar este problema, podemos utilizar un concepto llamado matriz de búsqueda, que mapea las acciones pasadas desde el formulario a un método llamado en el objeto.

Sí, podría establecer la acción como el nombre del método, pero eso permite que un envío de formulario falso llame a cualquier método público. Hacer que la matriz sea un par clave-valor es un pequeño paso para agregar un poco más de control sin mucho trabajo adicional.

Un ejemplo de trabajo con un solo archivo de procesamiento y una matriz de búsqueda

Usando nuestro conocimiento de las variables desde el comienzo de este tutorial, modifiquemos nuestra demostración para usar una matriz de búsqueda.

Modifique los tres formularios para que apunten a un nuevo archivo de controlador:

Formulario 1

Formulario 2

Formulario 3

A continuación, arme el archivo de procesamiento que manejará los envíos de formularios (activo / inc / ex3-lookup-array.php):

 'save_name', 'update-email' => 'save_email', 'update-both' => 'save_both'); // Asegúrese de que exista la clave de matriz si (array_key_exists ($ action, $ lookup_array)) // Usando variables variables, llame al método apropiado y almacene la salida $ output = $ account_obj -> $ lookup_array [$ action] ();  else die ('Acción no compatible.');  // Para este ejemplo, simplemente envíe algunos datos sobre el envío del formulario echo "
Archivo de procesamiento: ", $ _SERVER ['PHP_SELF']," \ nAction: ", htmlentities ($ _ POST ['action'], ENT_QUOTES)," \ n \ nMétodo de salida:\ n ", $ salida,"
\ n ", '

Vuelve al ejemplo 3.

'; else die ('Envío de formulario no válido');

Verifique esto en la página de demostración probando los formularios en el Ejemplo 3.

Ya que establecemos la acción como la clave en la matriz, usamos array_key_exists () Para asegurarse de que la acción es válida. Luego, usamos el valor que corresponde a la acción como el nombre del método. Observe que agregamos los paréntesis después del valor para asegurarnos de que se ejecute como un método.

La adición de la matriz de búsqueda mantiene el código conciso, simple y claro (una vez que se obtiene el bloqueo de las variables).


Resumen

Usados ​​responsablemente, las matrices de búsqueda pueden hacer que sus scripts sean mucho más fáciles de actualizar y mantener cuando los combina con variables variables.

¿Cómo cree que puede integrar matrices de búsqueda y variables en sus proyectos para facilitar el mantenimiento? Házmelo saber en los comentarios!