Ver Mensaje Individual
  #5 (permalink)  
Antiguo 09/10/2014, 14:47
Avatar de cascanfer56
cascanfer56
 
Fecha de Ingreso: octubre-2014
Mensajes: 9
Antigüedad: 9 años, 6 meses
Puntos: 0
Respuesta: Ideas con tabla generada PHP por una consulta a base de datos.

Cita:
Iniciado por NSD Ver Mensaje
Lo que debes hacer es usar ajax, en la misma [URL="http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp"]w3c esta su especificacion[/URL].

Siguiendo con el ejemplo dado, podrias hacer algo asi:
Código Javascript:
Ver original
  1. function cambiarEstado(accion, codigo)
  2. {
  3.     var xmlhttp = new XMLHttpRequest();
  4.     xmlhttp.open("POST", "actualizador.php", true);
  5.     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  6.     xmlhttp.onreadystatechange = function()
  7.     {
  8.         if (xmlhttp.readyState == 4 && xmlhttp.status==200)
  9.         {
  10.             if(xmlhttp.responseText == "ok")
  11.             {
  12.                 alert("El cambio se realizo correctamente");
  13.             }
  14.             else
  15.             {
  16.                 alert(xmlhttp.responseText);
  17.             }
  18.         }
  19.     }
  20.     xmlhttp.send("accion="+accion+"&codigo="+codigo);
  21. }
  22.  
  23. function accionar_pendiente()
  24. {
  25.     var codigo = this.parentNode.parentNode.dataset.codigo;
  26.     cambiarEstado("pendiente", codigo);
  27. }
  28.    
  29. function accionar_confirmado()
  30. {
  31.     var codigo = this.parentNode.parentNode.dataset.codigo;
  32.     cambiarEstado("confirmado", codigo);
  33. }
  34.    
  35. function accionar_rechazado()
  36. {
  37.     var codigo = this.parentNode.parentNode.dataset.codigo;
  38.     cambiarEstado("rechazado", codigo);
  39. }

Y luego en tu archivo actualizador.php
Código PHP:
Ver original
  1. <?php  
  2.     require '../ModeloControlador/conexion.php';
  3.     switch($_POST["accion"])
  4.     {
  5.         case "pendiente" :
  6.         case "confirmado" :
  7.         case "rechazado" :
  8.             $con->query("UPDATE productos SET estado = '$_POST[accion]' WHERE codigo = ".$con->quote($_POST["codigo"])." LIMIT 1;");
  9.             if($con->affected_rows)
  10.                 $status = "ok";
  11.             else
  12.                 $status = "No se actualizo ningun producto.";          
  13.         break;
  14.         default :
  15.             $status = "Estado invalido";
  16.         break;
  17.     }        
  18.    
  19.     die($status);

Si bien el codigo podria optimizarse un poco no se que es lo que contiene el objeto $con por ejemplo, te servira a modo de guia como para orientarte pero no lo tomes como la unica solucion.

Saludos.
La verdad es que para ser sincero el script AJAX me sonaba a chino, pero bueno con la ayuda de la buena w3 y dedicándole unas horitas lo he acabado entendiendo todo bastante bien, obviamente jamás se me hubiera ocurrido a mi porque como dije antes de AJAX poco.
Sin embargo tras adaptar tu código y arreglar algunas cosas que no encajaban con mi idea(básicamente he quitado la función de "localizado" ya que la idea era que el cliente pueda confirmar y rechazar solamente) no acabo de entender por que no funciona aparentemente todo está todo bien, no ocurren errores de servidor; pero aun así no se modifica la base de datos, salta todo el rato "ningún elemento modificado" si no te importa echarle un vistazo al código a ver si encuentras algo que se me haya pasado.
Muuuuchas gracias! por la ayuda y la paciencia :)

Código Javascript:
Ver original
  1. function cambiarEstado(accion, idProd)
  2. {
  3.     var xmlhttp = new XMLHttpRequest();
  4.     xmlhttp.open("POST", "../ModeloControlador/pedidoConfir.php", true);
  5.     xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  6.     xmlhttp.onreadystatechange = function()
  7.     {
  8.         if (xmlhttp.readyState == 4 && xmlhttp.status==200)
  9.         {
  10.             if(xmlhttp.responseText == "ok")
  11.             {
  12.                 alert("El cambio se realizo correctamente");
  13.             }
  14.             else
  15.             {
  16.                 alert(xmlhttp.responseText);
  17.             }
  18.         }
  19.     }
  20.     xmlhttp.send("accion="+accion+"&id="+idProd);
  21. }
  22.  
  23. function accionar_confirmado()
  24. {
  25.     var idProd = this.parentNode.parentNode.dataset.idProductos;
  26.     cambiarEstado("confirmado", idProd);
  27. }
  28.    
  29. function accionar_rechazado()
  30. {
  31.     var idProd= this.parentNode.parentNode.dataset.idProductos;
  32.     cambiarEstado("rechazado", idProd);
  33. }
  34.    var elements;
  35.        
  36.     elements = document.querySelectorAll('.accionar.confirmado');
  37.     for (var i = 0; i < elements.length; i++)
  38.         elements[i].addEventListener("click", accionar_confirmado, false);
  39.        
  40.     elements = document.querySelectorAll('.accionar.rechazado');
  41.     for (var i = 0; i < elements.length; i++)
  42.         elements[i].addEventListener("click", accionar_rechazado, false);
  43. </script>

El script php que modifica la base de datos
Código PHP:
<?php
require 'conexion.php';
switch (
$_POST["accion"])
{
        case 
"rechazado":
        case 
"confirmado":
            
$con->query("UPDATE productos SET estado = '$_POST[accion]' WHERE idProductos = ".$con->quote($_POST["idProd"])." LIMIT 1;");
            if(
$con->affected_rows)
                
$status "ok";
            else
                
$status "No se actualizo ningun producto.";           
        break;
        default :
            
$status "Estado invalido";
        break;
    }         
    
    die(
$status);                      
header ("location: ../ModeloControlador/pedidos.php");
En cuanto a la tabla generada con el php embebido es lo mismo de antes, no he modificado nada simplemente he quitado los enlaces que ya no tenían sentido para que el cliente solo pueda confirmar y rechazar en caso de estar el pedido "localizado" y las etiquetas de "a" puesto que ya no hacen falta por que la función la llama AJAX.

Un saludo!!