En CLH, en nuestro afán de cubrir hasta los últimos posibles detalles en cada temática, hemos hablado en varias ocasiones de los formularios Web. Ya sea estilizándolos, validándolos por Javascript, añadiendo Calendarios o incluso haciéndolos, esto se debe a lo que siempre remarcamos, que es su importancia dentro de un sitio que pretenda interactuar con sus visitantes.
Pues bien, hoy añadimos una nueva página a las numerosas lecciones al respecto. En esta ocasión, les enseñaremos a añadir campos al formulario de forma dinámica, para permitirle a un usuario en particular definir cuantos datos de un tipo quiere ingresar.
El detalle, como siempre, después del salto.
Antes de partir, una pequeña explicación:
Lo que haremos, será añadir una pequeña funcionalidad a nuestro formulario, para que mediante un botón, el usuario pueda añadir más campos para ingresar un tipo de dato en particular y así definir la cantidad que estime conveniente. Esto lo haremos mediante un formulario en HTML y un código en Javascript, además de un poco de PHP para procesar el formulario.
Es una muy buena pregunta, que tiene una respuesta así de buena. Cuando hacemos un formulario, en algunas ocasiones nos presentamos con la problemática de que para una información en particular, el número de datos a ingresar puede ser relativo.
Por ej: Si le queremos preguntar al usuario el nombre de sus hermanos o familiares, ¿Cómo definimos cuantos tendrán?. Claro, podríamos irnos a la segura y poner 10 o 15 campos, pero si el usuario solo tiene 1 hermano, estaríamos manejando una gran cantidad de datos innecesariamente.
Por esto es mejor darle el control al usuario y permitirle añadir más campos para el mismo dato según estime conveniente.
Con eso claro, vamos, manos a la obra:
1.- Lo primero que haremos, será crear nuestro formulario con los datos que querremos que el usuario ingrese. Si tienen dudas sobre como hacerlo, les recomendamos leer este tutorial donde hemos cubierto el proceso por completo.
2.- Una vez que hemos creado nuestro formulario debemos hacer los ajustes para preparar nuestros campos dinámicos. Para eso nos dirigimos a donde están este campo (dentro de la celda, o entre las etiquetas td y /td si hemos insertado una tabla dentro del formulario, lo que es recomendable) y ahí lo que haremos será crear otra tabla en donde dejaremos los campos dinámicos. Así nos aseguraremos que sin importar cuantos campos se agreguen, ni el formulario ni la tabla principal pierdan la forma, así que dentro de la celda, agregaremos el código correspondiente. En este caso, como demostramos con un formulario para agregar nuevos usuarios añadiremos:
Nombre | Sitio Web | Correo Electrónico |
Lo que hemos hecho aquí es simplemente añadir una fila con 3 celdas, en las que se indica el nombre de un usuario, su sitio Web y su correo. Ojo que solo agregamos las celdas con los títulos. Los campos de texto los agregaremos en el siguiente paso para ver como lo hacemos dinámicamente.
3.- A continuación, en una nueva fila de la tabla principal que está en el formulario, agregaremos y alinearemos a la derecha un botón para agregar nuevas filas:
Nombre | Sitio Web | Correo Electrónico |
Con esto, hemos creado una celda alineada a la derecha y hemos añadido un botón al cual se le ha asignado un atributo onClick, es decir, cuando se pulse este botón, se ejecutará una acción, en este caso, llamará a una función agregarUsuario() en Javascript que ya definiremos.
4.- Como describimos en el paso anterior, haremos una llamada a una función en Javascript que se encargará de añadir un campo cada vez que pulsemos el botón. Así que entre las etiquetas head y /head, agregaremos el siguiente código. La explicación, como siempre, en negrita, cursiva y entre /* y */:
5.- Y listo. Ahora podemos agregar campos dinámicamente y enviarlos a través del formulario, almacenando los datos en arrays, lo cual hará más sencillo de procesar y rescatar después mediante PHP o algún otro lenguaje dinámico, para manipular esos datos y hacer con ellos lo que necesitemos, como insertar en una BD o simplemente desplegar por pantalla.
Actualización: Agregamos esto debido a las preguntas que nos han dejado en los comentarios, para quienes les pueda servir:
Para recoger los datos que envíen en ese formulario, deben considerar que los estamos enviando en arreglos (nombre[posicion], web[posicion] y correo[posicion]), por lo que al momento de rescatar sus datos en la página de destino (ya sea en POST o GET), deben recorrer estos arreglos y procesar cada dato.
¿Cómo recorrerlos? Esta es una manera muy básica de hacerlo (ejemplo en PHP, con un formulario enviado por POST. En GET es similar):
/* Aquí la conexión a la BD */ $nombre = $_POST['nombre']; $web = $_POST['web']; $correo = $_POST['correo']; $i = 0; foreach($nombre as $n) { mysql_query('INSERT INTO usuarios(usuario_nombre, usuario_web, usuario_correo) VALUES("'.$n.'", "'.$web[$i].'", "'.$correo[$i].'")'); $i++; }
Recuerden que esto es una forma múy básica de hacerlo, a eso es necesario agregarle comprobaciones u optimizaciones que puedan servirles, pero ya es una base para partir.
Como siempre, les recordamos que este tutorial ha sido:
Esperamos que haya sido de utilidad para Uds.
Cualquier duda que tengan, los invitamos a dejarnos un comentario en el área habilitada a continuación.
Muchas gracias por leer y será hasta una próxima oportunidad.
4:31:37 pm
Estimado,
muy buen código , todo bien explicado, bueno me da un tanto de vergüenza hacer esta consulta xD.. No hay caso que pueda obtener el nombre del fila para poder enviar via metodo post a otro archivo php y recibirla en este…. seria de bastante ayuda si puedes explicarme como hacerlo gracias.
5:45:37 pm
hola estoy programando en Symfony y quisiera agregar en una parte de mi aplicacion una lista de productos de manera dinamica como se muestra aqui el problema es que el codigo trate de adaptarlo Y NO FUNCIONA podrian ayudarme por favoR? se les agradezco…
12:02:49 pm
el problema que me da con tu codigo es que el nombre que les da a los elementos html siempre es el mismo no importa cuantos textbox agregue siempre se llaman direccion[1] asi me aparecen
10:01:12 pm
quetal, soy nuevo en estoy de la programacion web, alguien me podria pasar el codigo para subir los datos a la base de datos, con el formulario dinamicamente por favor
11:39:54 pm
me podrias ayudar con la insersion??? me ha servido de mucho tu codigo, estoy haciendo mi practica y no se mucho de como pasarle las variables a mi clase insertar para guardarlas en la base de datos de antemano gracias
5:02:06 am
Hola Xabadu, he usado tu código y me funciona perfectamente , lo he usado para hacer un formulario de pedido que tiene que rellenar el cliente y a mi me llegara como email.
Mi problema: he metido este código en una hoja php a la que he llamado pedido (en esa parte no hay problema), pero luego he creado otra hoja php para darle la acción de que me lo envíe por email y solo consigo que me envíe los campos de textos que no tienen este efecto javascript, necesitaría que me ayudaras a poner la acción que me falta para poder enviarlo por email. te dejo aquí el código que uso para el email:
10:16:17 am
Buen codigo Xabadu, me sirvio mucho.
Tengo ahora un problema.: Suponemos que hay 2 casillas que se llaman cantidad y precio. Al perder el enfoque en precio llamo a la funcion calcular pero no consigo la operación.
TU CODIGO AÑADIENDO INBLUR
nuevaCelda.innerHTML=” “;
FUNCION CALCULAR
function calcular(posicionCampo){
var cantidad1 = new Number(document.form1.cantidad[posicionCampo].value);
var precio1 = new Number(document.form1.precio[posicionCampo].value);
resultado = eval(cantidad1 * precio1);
document.form1.total[posicionCampo].value = resultado;
}
¿Puedes echarme una mano por favor?. Mil gracias
10:30:35 am
NO DEBI DE COPIAR BIEN:
nuevaCelda.innerHTML=””;
10:31:16 am
nuevaCelda.innerHTML=””;
10:33:04 am
QUITO LAS COMILLAS
nuevaCelda.innerHTML= ;