Envio de datos de formulario (II). Tagboard con AJAX
Bien en esta segunda entrega del bloque ‘Envío de datos con formulario‘ vamos a ir un pasito más allá. Si en el anterior post solamente enviamos unos datos por formulario y se mostraban en la misma página sin interactuar con nada más, en este lo que vamos a hacer va a ser mandar los datos del formulario, guardarlos en una BBDD, recuperar todos los datos y mostrarlos en la misma página.
Lo primero que debemos de hacer es construir un html con un div id=”comentarios” y un formulario.
... <div id="comentarios"> </div> <div id="enviacomentario"> <form name="tagboard" method="post" onsubmit="cargarContenido(); return false" /> <label>Tu nick: <input id="nick" type="text" alt="Nick" name="Nick"/></label><br /> <label>Tu email: <input id="email" type="text" alt="Email" name="Email"/></label><br /> <label>Tu mensaje: <textarea id="mensaje" name="Mensaje" title="Mensaje" rows="5" wrap="virtual"></textarea></label><br /> <input id="submit" type="submit" alt="Enviar" name="Enviar"/> </div> ...
En el div “comentarios” es donde se visualizarán los datos de la BBDD devueltos por el PHP.
Como segundo punto crearemos un archivo Javascript en el que tendremos 2 funciones: cargarContenido(); y mostrarContenido();. El archivo javascript se llamará functions.js
cargarContenido();
function cargarContenido(){
var comentarios;
var nick, email, mensaje;
comentarios = document.getElementById('comentarios');
nick = document.getElementById('nick').value;
email = document.getElementById('email').value;
mensaje = document.getElementById('mensaje').value;
ajax = nuevoAjax();
ajax.open('POST', 'guardaComment.php',true);
ajax.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
ajax.send('nick='+nick+'&email='+email+'&mensaje='+mensaje)
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
comentarios.innerHTML = ajax.responseText;
}
}
}
Bueno creo que este código no hace falta explicarlo, es básicamente el mismo código que el post ‘Envio de datos por formulario (I)’.
mostrarContenido();
function mostrarContenido(){
comentarios = document.getElementById('comentarios');
ajax = nuevoAjax();
ajax.open('POST', 'guardaComment.php', true);
ajax.setRequestHeader('Content-Type', 'text/plain');
ajax.send('leer=true');
ajax.onreadystatechange=function() {
if (ajax.readyState==4) {
comentarios.innerHTML = ajax.responseText;
}
}
}
Bien…y cual es la diferencia entre este código y el anterior. Podríamos decir que ninguna, pero el detalle está en que en esta función no necesitamos leer ningún dato del formulario, solamente mostrar los datos de la BBDD. Esta función se ejecutará en el html al cargarlo.
<body onload='mostrarContenido();'>
La tercera parte es el script PHP que se encargará de recibir los datos, insertarlos en la BBDD y hacer la pertinente consulta.
< ?
//----- Establece la conexión con la BBDD -----//
$hostname_ajaxBBDD = 'tuhost';
$database_ajaxBBDD = 'tubbdd';
$usuario_ajaxBBDD = 'user';
$password_ajaxBBDD = 'pass';
$ajaxBBDD = mysql_pconnect($hostname_ajaxBBDD, $usuario_ajaxBBDD, $password_ajaxBBDD) or trigger_error(mysql_error(), E_USER_ERROR);
mysql_select_db($database_ajaxBBDD, $ajaxBBDD);
//---------------------------------------------//
if($_REQUEST['nick']){
$nick = $_REQUEST['nick'];
$email = $_REQUEST['email'];
$mensaje = $_REQUEST['mensaje'];
$query_Insert = 'Insert into tagboard_prueba values(null,''.$nick.'', ''.$email.'', ''.$mensaje.'')';
mysql_query($query_Insert, $ajaxBBDD);
}
echo '
<table>';
$query_Recordset = 'Select idtag, nick, email, mensaje from tagboard_prueba order by idtag desc';
$Recordset = mysql_query($query_Recordset, $ajaxBBDD) or die (mysql_error());
$totalRows_Recordset = mysql_num_rows($Recordset);
for($i=1;$i< =$totalRows_Recordset;$i++){
$row_Recordset = mysql_fetch_array($Recordset);
echo '<tr>
<td>Nick: </td>
<td>'.$row_Recordset['nick'].'</td>
</tr>
<tr>
<td>Email: </td>
<td>'.$row_Recordset['email'].'</td>
</tr>
<tr>
<td>Mensaje: </td>
<td>'.$row_Recordset['mensaje'].'</td>
</tr>
<tr>
<td colspan='2'><hr /></td>
</tr>';
}
echo '</table>';
?>
Explicamos el PHP por encima. Lo primero es establecer la conexión con la BBDD, luego comprobamos si le pasamos un parámetro que sea ‘nick’. Esto nos sirve para limitar si se está llamado desde la funcion ‘cargarContenido();’ o ‘mostrarContenido();’ ya que la primera función envía como parámetro el ‘nick’. Si no se recibe el parámetro ‘nick’ es porque deseamos obtener los datos de la BBDD sin insertar nada.
En cualquiera de los casos, al obtener los datos de la BBDD se ‘imprimen’ mediante echo. Posteriormente la función javascript se encargará de mostrarlo en el div ‘comentarios’ gracias al
comentarios.innerHTML = ajax.responseText;
Y eso es todo. Podeis ver un ejemplo funcionando online: [Tagboard con AJAX]
tagboard.html (1,34 Kb)
ajax.js (0,42 Kb)
functions.js (1 Kb)
guardaComment.php (1,24 Kb)
styles.css (0,83 Kb) [Opcional. Por si queremos darle estilos al formulario]
Muchas gracias por el Post, estoy aprendiendo a utilizar la metodologia AJAX en desarrollo en particular con PHP, desarrollo hace mucho y he podido hacer algunas pruebas bastante interesantes con lo que he aprendido hasta ahora (lo cual no es mucho). Pero me asalta una duda, a mi parecer, bastante logica. Imagina que tengo un sistema con 50 formularios y que quiero implementar con AJAX. Como se puede desarrollar alguna funcion o clase o programa o lo que sea con lo cual la toma de parametros desde un Formulario para ser enviado a una pagina a traves de AJAX sea mas automatico o generico?, ya te imaginas desarrollar N funciones para cada formulario?? en tu experiencia te ha tocado ver este caso?? , en mi caso en php desarrolle una funcion que toma los valores desde un post (funcion en PHP) pero en Javascript existe algo asi?? de antemano muchas gracias por vuestra ayuda.
Saludos desde Chile
Joel Espinoza
Hola Joel!
Pues lo cierto es que nunca me he topado con ese problema, pero ahora que lo dices lo he estado pensando….y sí se podía crear una función aunque deberíamos de tener en cuenta si los formularios van a tener todos los mismos campos o cada formulario campos distintos.
Para el primer caso sería mucho más fácil ya que solo tendríamos que crear una función que recibiera como parámetros la direccion de la pagina PHP así como los valores del formulario ordenados.
En el segundo caso quizá deberíamos de añadir un campo extra a la función que indicara el nombre o id de formulario (un campo que fuera único para cada formulario).
pagina.html
…
<form id=’1′ … >
</form>
…
archivo.js
function enviarForm(pagina,idformulario){
switch (idformulario){
case ‘1′:
//Aquí el código correspondiente a enviar el formulario con id 1
break;
case ‘2′:
//Aquí el código correspondiente a enviar el formulario con id 2
break;
…
}
}
prueba de php
espero que este código me sea útil; a ustedes amigos de la web…
poco enrredadp…pero igual gracias…
veamos
En respuesta a Joel :
puedes recorrer el formulario
contenedor.style.visivility=’hidden’
contenedor.innerHTML='’
for(a=0; a.name+”=”+frm.elements<a>.value
else
contenedor.innerHTML=contenedor.innerHTML + ” &” frm.elements<a>.name+”=”+frm.elements</a><a>.value
/* aqui Envias los datos en contenedor.innerHTML con tu objeto ajax
y despues … !
*/
contenedor.innerHTML=’Formulario Enviado’
contenedor.style.visivility=’visible’
————————–
Eso lo puedes poner en una funcion por ejemplo:
Envia( idcapaderesultado(seria el contenedor) , frm1 )
Bueno talves tenga algunos errores el script
Pero espero hayas comprendido la idea</>