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.
12:56:45 pm
Debo decirte que quite el codigo que pone nombres con indices a los campos ej: nombre[1], para dejarlo de la siguiente manera: nombre[], esto para no estar checando cual posicion fue eliminada o agregada, y asi se agregan todas en un arreglo, pero no funciona al recorrerlo en PHP como previamente te comenté que pudiera hacer, o como haria para dejar con posiciones pero een el caso de agregar 10 campos y borrar el no. 8, saber cuales fueron los que se enviaran
2:13:07 pm
@Eliel: En los próximos días publicaremos una nueva versión de este tutorial, ahora en jQuery, el cual es mucho más simple de implementar y modificar. Este a decir verdad, está un poco desactualizado, así que ojo con ese nuevo.
Saludos!
4:52:11 pm
hola, que tal, tengo un problema con el array, no sé como sacar los datos.. utilizando el código anteriormente posteado no me funciona:
$primer_nombre=$_POST[“nombre[posicion]“];
lo pongo de la siguiente manera:
$primer_nombre=$_POST[“nombre“];
y lo unico que sale dice: Array
me pudieran orientar por favor.. soy nuevo en esto.. gracias!
Excelente sitio!
10:28:15 am
@Arturo:
Te falta el índice correspondiente a la posición. $_POST[‘nombre’] es un array, cada posición (desde cero al máximo que se insertó) contiene un registro, por lo que debes acceder como $_POST[“nombre[0]”]; para el primero y así sucesivamente.
Saludos!
11:15:22 am
/* no logro q me reciba las variables por el post aparece que nombre[0] no existe este es mi codigo creo q debe ser algo de error logico pero no supe que fue , agradeceria bastante si me pudieran colaborar tambien lo hize con nombre[1] y tampoco*/
<?php require_once(‘../Connections/conexion_usuarios.php’);
if (!function_exists(“GetSQLValueString”)) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = “”, $theNotDefinedValue = “”)
{
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
$theValue = function_exists(“mysql_real_escape_string”) ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
switch ($theType) {
case “text”:
$theValue = ($theValue != “”) ? “‘” . $theValue . “‘” : “NULL”;
break;
case “long”:
case “int”:
$theValue = ($theValue != “”) ? intval($theValue) : “NULL”;
break;
case “double”:
$theValue = ($theValue != “”) ? “‘” . doubleval($theValue) . “‘” : “NULL”;
break;
case “date”:
$theValue = ($theValue != “”) ? “‘” . $theValue . “‘” : “NULL”;
break;
case “defined”:
$theValue = ($theValue != “”) ? $theDefinedValue : $theNotDefinedValue;
break;
}
return $theValue;
}
}
$editFormAction = $_SERVER[‘PHP_SELF’];
if (isset($_SERVER[‘QUERY_STRING’])) {
$editFormAction .= “?” . htmlentities($_SERVER[‘QUERY_STRING’]);
}
if ((isset($_POST[“MM_insert”])) && ($_POST[“MM_insert”] == “form1”)) {
$insertSQL = sprintf(“INSERT INTO pruebaentrada (nombre,web,correo) VALUES (%s, %s, %s)”,
GetSQLValueString($_POST[‘nombre[0]’], “text”),
GetSQLValueString($_POST[‘web[0]’], “text”),
GetSQLValueString($_POST[‘correo[0]’], “text”));
mysql_select_db($database_conexion_usuarios, $conexion_usuarios);
$Result1 = mysql_query($insertSQL, $conexion_usuarios) or die(mysql_error());
}
?>
<html>
<head>
<script language=”javascript” type=”text/javascript”>
var posicionCampo=1;
function agregarUsuario(){
nuevaFila = document.getElementById(“tablaUsuarios”).insertRow(-1);
nuevaFila.id=posicionCampo;
nuevaCelda=nuevaFila.insertCell(-1);
nuevaCelda.innerHTML=”<td><input type=’text’ size=’15’ name=’nombre[“+posicionCampo+”]’ ></td>”;
nuevaCelda=nuevaFila.insertCell(-1);
nuevaCelda.innerHTML=”<td> <input type=’text’ size=’10’ name=’web[“+posicionCampo+”]’ ></td>”;
nuevaCelda=nuevaFila.insertCell(-1);
nuevaCelda.innerHTML=”<td> <input type=’text’ size=’10’ name=’correo[“+posicionCampo+”]’ ></td>”;
nuevaCelda=nuevaFila.insertCell(-1);
nuevaCelda.innerHTML=”<td><input type=’button’ value=’Eliminar’ onclick=’eliminarUsuario(this)’></td>”;
posicionCampo++;
}
function eliminarUsuario(obj){
var oTr = obj;
while(oTr.nodeName.toLowerCase()!=’tr’){
oTr=oTr.parentNode;
}
var root = oTr.parentNode;
root.removeChild(oTr);
}
</script>
<title>Documento sin título</title>
</head>
<body>
<form id=”form1″ name=”form1″ method=”POST” action=”<?php echo $editFormAction; ?>”>
<table id=”tablaUsuarios”>
<tr>
<td width=”175″>Nombre</td>
<td width=”175″>Sitio Web</td>
<td width=”100″>Correo</td>
<td width=”100″>Acciones</td>
</tr>
<td align=”right”>
<input type=”button” onClick=”agregarUsuario()”
value=”Añadir usuario” >
</td>
</table>
<div align=”center”>
<input type=”button” value=”Enviar” onclick=”mostrarCombo1()”/>
<input type=”hidden” name=”MM_insert” value=”form1″ />
</div>
<script language=”javascript”>
function mostrarCombo1()
{
//ESPACIO PARA VALIDACIONES
document.form1.submit();
}
</script>
</form>
</body>
</html>
11:19:52 am
segun he leido se hace con un for para que recorra el arreglo pero tengo entendido que al menos me deberia tomar el primero de la forma nombre[0] y ni asi me lo toma me aparece que ” nombre[0] no existe” .
12:23:22 pm
Compadre veo que todos tienen el mismo problema…el array viene vacio?
Yo lo hice y tampoco he podido rescatar los valores del array. ¿Faltará algo?
Ojala que en vez de subir un nuevo tutorial puedas decir como usar ESTE ya que muchos ya lo implementamos y lo tenemos ahi a medias :s
Gracias de antemano
3:39:59 am
Estimado.
Podrias colocar el ejemplo completo funcionando, parar mirar, tengo el mismo problema que los demás.
Quizas es alguna incompatibilidad de algo.
cristian@diw.cl
Te dejo mi correo, te agradeceria que me enviaras el codigo funcionando.
o si a alguien mas le ha funcionado le agradeceria que me lo enviaran porfa.
Muchas gracias.,
Cristian.
6:26:28 pm
Buen post, me encanto… sigan asi muchachos!
2:49:07 pm
hola buen aporte,,pero que pasa cuando en un campo o un chekbox o un select,,los valores sean obtenidos desde una tabla (con codigo php)?
osea qe si le doy al boton añadir aparce la fila y en el campo web(por ejemplo) tenga una lista con varios valores,,,
gracias