Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/08/2012, 22:32
Avatar de emprear
emprear
Colaborador
 
Fecha de Ingreso: junio-2007
Ubicación: me mudé
Mensajes: 8.388
Antigüedad: 16 años, 10 meses
Puntos: 1567
Respuesta: Actualizar ventana solo cuando hay cambios??

Hay una técnica específica para eso, llamada LongPolling, no sé si mi método se ajusta exactamente a eso, pero funciona, quizás se pueda optimizar. Desde ya que solo tiene sentido si la página en que se insertan los nuevos valores es diferente de la que se muestran los resultados, sino, simplemente llamas a la función ajax para recargar al hacer el insert

por un lado tenemos el index.php

Código HTML:
Ver original
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  2. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml">
  4. <title>titulo</title>
  5. <meta http-equiv="content-type" content="text/html; charset=utf-8" />
  6. <script type="text/javascript">
  7. //<![CDATA[
  8. var phpbd = 'select_empleados.php';
  9. var div_entradas = 'entradas';
  10. var control = 'control_cambios.php';
  11. var tiempo = 10000;
  12.  
  13. /*** no editar ***/
  14. // agrega un parámetro unico al archivo
  15. var t;
  16. function cargarAjax(url){
  17. var contenidoAjax = false;
  18. if(window.XMLHttpRequest) {
  19. contenidoAjax = new XMLHttpRequest();
  20. }else if(window.ActiveXObject) {
  21. contenidoAjax = new ActiveXObject("Microsoft.XMLHTTP");
  22. }else{
  23. alert('Su navegador no soporta Ajax');
  24. }
  25. contenidoAjax.onreadystatechange=function(){
  26. cargaPagina(contenidoAjax);
  27. }
  28. cacheParam=(url.indexOf("?")!=-1)? "&"+ new Date().getTime() : "?"+ new Date().getTime();
  29. contenidoAjax.open('GET', url+cacheParam, true);
  30. contenidoAjax.send(null);
  31. }
  32.    
  33. function cargaPagina(contenidoAjax){
  34. if(contenidoAjax.readyState == 4 && (contenidoAjax.status==200 || window.location.href.indexOf("http")==-1)){
  35.         if(contenidoAjax.responseText == 'si'){
  36.         actualizaCapa(phpbd,div_entradas);
  37.     }
  38. }
  39.  
  40. }      
  41.  
  42. function actualizaCapa(urlDatos,divDatos){
  43. var actualizaAjax = false;
  44. if(window.XMLHttpRequest) {
  45. actualizaAjax = new XMLHttpRequest();
  46. }else if(window.ActiveXObject) {
  47. actualizaAjax = new ActiveXObject("Microsoft.XMLHTTP");
  48. }else{
  49. alert('Su navegador no soporta Ajax');
  50. }
  51. actualizaAjax.onreadystatechange=function(){
  52. cargaDatos(actualizaAjax,divDatos);
  53. }
  54. cacheParam=(urlDatos.indexOf("?")!=-1)? "&"+ new Date().getTime() : "?"+ new Date().getTime();
  55. actualizaAjax.open('GET', urlDatos+cacheParam, true);
  56. actualizaAjax.send(null);
  57. }
  58.    
  59. function cargaDatos(actualizaAjax,divDatos){
  60. if(actualizaAjax.readyState == 4 && (actualizaAjax.status==200 || window.location.href.indexOf("http")==-1)){
  61. document.getElementById(divDatos).innerHTML = actualizaAjax.responseText;
  62. }
  63. }
  64.  
  65. window.onload = t =setInterval("cargarAjax('" +control+"')", tiempo);
  66. //]]>
  67. </head>
  68. <div id="entradas">
  69. <?php
  70. include('select_empleados.php');
  71. ?>
  72. </div>
  73. </body>
  74. </html>

Explico un poco, el javascript tiene las siguientes variables

Este es el php que muestra el contenido de la base de datos, y al cual por defecto se le hace un include dentro de un div
var phpbd = 'select_empleados.php';
El nombre del div en el que se muestran y actualizarán los resultados
var div_entradas = 'entradas';
El archivo php que va a controlar si hubo cambios o no
var control = 'control_cambios.php';
El tiempo en milisegundos cada cuanto se ejecutará el setInterval (creo que 10 seg. es razonable, si se pone un valor inferior hay que ver que el server responda bien)
var tiempo = 10000;

El javascript tiene 2 funciones Ajax, con algunas diferencias, la primera controla si hubo cambios, de haberlos, invoca a la segunda para que recargue el contenedor de resultados

los php, por un lado tenemos el php que recorre y muestra el contenido de la base de datos,
select_empleados.php

Código PHP:
Ver original
  1. <?php
  2. $sqlhostname = "localhost";
  3. $login = "root";
  4. $password = "";
  5. $base = "emprear";
  6.  
  7. $db_connect = mysql_connect($sqlhostname,$login,$password);
  8. $base_selection = mysql_select_db($base,$db_connect);
  9. $consulta = "SELECT * FROM empleados ORDER BY idempleado ASC";
  10. $req = mysql_query($consulta);
  11. while($row = mysql_fetch_array($req)){
  12.         extract($row);
  13.         echo"$idempleado<br />";
  14.     }
  15. file_put_contents('control-cambios.txt','no',LOCK_EX);
  16. ?>

no tiene nada fuera de lo comun, salvo que en la última linea utiliza file_put_contents(), para escribir en un archivo de texto control-cambios.txt el valor "no"

archivo control_cambios.php

Código PHP:
Ver original
  1. <?php
  2. $control_cambios = file_get_contents('control-cambios.txt');
  3. if($control_cambios == 'si'){
  4. echo 'si';
  5. }
  6. ?>

este archivo es el que llama la primera función de Ajax, lo que hace es leer el contenido del archivo de texto control-cambios.txt, y si su contenido es "si" enviar como responseText a Ajax el valor "si", y ponemos la condición:

Código Javascript:
Ver original
  1. if(contenidoAjax.responseText == 'si'){
  2. actualizaCapa(phpbd,div_entradas);
  3. }

con lo que llamamos a la segunda función, que carga el select_empleados.php (que como ya vimos escribe "no" en el archivo de texto.
Ahora, la clave del asunto, el archivo
insertar.php
Código PHP:
Ver original
  1. <?php
  2. $sqlhostname = "localhost";
  3. $login = "root";
  4. $password = "";
  5. $base = "emprear";
  6.  
  7. $db_connect = mysql_connect($sqlhostname,$login,$password);
  8. $base_selection = mysql_select_db($base,$db_connect);
  9. $idempleado = 'xxxx';
  10. $nombres = 'aaaa';
  11. $departamento = 'cccc';
  12. $sueldo = time();
  13. $consulta = "INSERT INTO empleados (idempleado,nombres,departamento,sueldo) VALUES ('$idempleado','$nombres','$departamento','$sueldo')";
  14. $req = mysql_query($consulta);
  15. echo "fila insertada";
  16. file_put_contents('control-cambios.txt', 'si', LOCK_EX);
  17. ?>
el mismo, tras insertar la fila, escribe nuevamente en el archivo de control, pero esta vez la palabra "si", con lo que se hará la revcarga del contenido.
Dependiendo de la configuración del server, el archivo control-cambios.txt necesir¡trá ser creado manualmente y tener permisos 0777.



Edito:
Hago una pequeña modificación ya que IE8/7 tieen problemas con
window.onload = t =setInterval("cargarAjax('" +control+"')", tiempo);
asi que simplemente la ultima linea de la script debe contener
setInterval("cargarAjax('" +control+"')", tiempo);
Saludos
__________________
La voz de las antenas va, sustituyendo a Dios.
Cuando finalice la mutación, nueva edad media habrá
S.R.

Última edición por emprear; 07/08/2012 a las 11:25