Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] convertir cadena de texto en inputs de una tabla que muestra varios registros de BD

Estas en el tema de convertir cadena de texto en inputs de una tabla que muestra varios registros de BD en el foro de Javascript en Foros del Web. Buenos dias a todos Tengo una tabla que muestra varios registros de una BD en la cual incluyo un boton con la opcion de modificar ...
  #1 (permalink)  
Antiguo 15/02/2015, 02:53
Avatar de Carlos1975  
Fecha de Ingreso: mayo-2005
Mensajes: 29
Antigüedad: 19 años
Puntos: 0
Pregunta convertir cadena de texto en inputs de una tabla que muestra varios registros de BD

Buenos dias a todos

Tengo una tabla que muestra varios registros de una BD en la cual incluyo un boton con la opcion de modificar los registros mostrados.

Me gustaria que al darle al boton modificar, 2 de los registros mostrados se convirtieran en inputs y apareciera un botón para poder hacer un UPDATE en la BD

Se que se puede hacer con jquery y con javascript pero me pierdo un poco con estos lenguajes. Si me pudieran dar alguna ayuda seria de agradecer.

Código PHP:
Ver original
  1. <?php
  2.  
  3. include("mysql.php");
  4.  
  5. $idp = $_GET['producto'];
  6. $db = new MySQL();
  7. $listar = $db -> consulta("SELECT * FROM tbl_img_productos WHERE idProducto = ".$idp."");
  8.  
  9. if ($db -> num_rows($listar) > 0) {
  10.  
  11.         echo '<table class="display">';
  12.         echo '<thead><tr>';
  13.         echo '<td width="5%">Estado</td>';
  14.         echo '<td width="10%" align="center">Imagen</td>';
  15.         echo '<td width="30%">Nombre de la imagen</td>';
  16.         echo '<td width="30%">Titulo de la imagen</td>';
  17.         echo '<td width="15%">&nbsp;</td>';
  18.         echo '<td width="15%">&nbsp;</td>';
  19.         echo '</tr></thead>';
  20.    
  21.     while ($row = ($db -> fetch_array($listar))) {
  22.  
  23.         echo '<tbody><tr class="selected">';
  24.    
  25.     if ($row["status"] == 1) {
  26.         echo '<td align="center"><img src="img/ico/p_active.png" width="25" height="18"></td>';
  27.     } else {
  28.         echo '<td><img src="img/ico/p_inactive.png" width="25" height="18"></td>';
  29.     }
  30.    
  31.         echo '<td><a target="_blank" href="../img/p/'.$idp.'/'.$row['strIdentificador'].'"><img src="../img/p/'.$idp.'/'.$row['strIdentificador'].'" width="70" height="70"></a></td>';
  32.        
  33. ?>
  34.  
  35. <!--
  36.  
  37. A partir de aqui es donde muestro los 2 registros que quiero transformar en inputs  
  38.  
  39. -->
  40.  
  41.     <td id="datos"><?php echo $row['strNombreImagen'] ?></td>
  42.         <td id="datos"><?php echo $row['strTituloImagen'] ?></td>
  43.        
  44. <!--
  45.  
  46. Este es el boton que quiero que muestre los inputs y el nuevo boton para poder hacer el UPDATE en la BD
  47.  
  48. -->    
  49.        
  50.         <td align="center">
  51.             <div class="btn-group pull pull-right">
  52.                 <a href="actions/files_save_img.php?id=<?php echo $row["idImagen"] ?>&nombre=<?php echo $row['strNombreImagen'] ?>&titulo=<?php echo $row['strTituloImagen'] ?>&producto=<?php echo $idp ?>" class="btn btn-mini"><i class="icon-pencil"></i> &nbsp;Modificar</a>
  53.  
  54. <button class="btn btn-mini dropdown-toggle" data-toggle="dropdown"><i class="caret"></i>&nbsp;</button>            
  55. <ul class="dropdown-menu">
  56. <li><a href="" onclick="javascript:if(confirm('Está seguro que desea eliminar la imagen?')) document.location = 'actions/files_delete.php?id=<?php echo $row["idImagen"] ?>&producto=<?php echo $idp ?>'; return false;">
  57. <i class="icon-trash"></i> &nbsp;Eliminar</a></li>
  58. </ul>
  59.             </div>
  60.         </td>
  61.     </tr>
  62.    
  63. <?php
  64.  
  65.     }
  66.    
  67.     echo '</tbody></table>';
  68.    
  69. }


Gracias de antemano por su ayuda.
  #2 (permalink)  
Antiguo 15/02/2015, 12:55
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

En lugar de imprimir directamente los datos, puedes mostrarlos en cajas de texto y, a estas últimas, aplicarles la propiedad readOnly para que no puedan ser modificados.

Código PHP:
Ver original
  1. <td>
  2.     <input
  3.         type = "text"
  4.         value = "<?php echo $row['strNombreImagen']; ?>"
  5.         onclick = "modificar(this)"
  6.         onkeypress = "guardar(event, this)"
  7.         readOnly />
  8. </td>
  9. <td>
  10.     <input
  11.         type = "text"
  12.         value = "<?php echo $row['strTituloImagen']; ?>"
  13.         onclick = "modificar(this)"
  14.         onkeypress = "guardar(event, this)"
  15.         readOnly />
  16. </td>

Como verás, además del atributo readOnly, les asigné dos funciones que se ejecutarán en dos casos en particular. La primera, para cuando se le de un clic a la caja de texto (modificar()) y la segunda, para cuando se pulse una tecla mientras la caja de texto tenga el enfoque (guardar()). A la primera, le envío a la propia caja de texto como parámetro, mientras que a la segunda, le envío el objeto del evento y a la caja de texto.

Las funciones serían así:

Código Javascript:
Ver original
  1. function modificar(caja){
  2.     if (caja.readOnly){
  3.         caja.readOnly = false;
  4.     }
  5.     else{
  6.         caja.readOnly = true;
  7.     }
  8. }
  9.  
  10. function guardar(evento, caja){
  11.     var ajax = new XMLHttpRequest();
  12.  
  13.     if (evento.keyCode == 13){
  14.         ajax.open("GET", "tupagina.php?valor=" + caja.value, true);
  15.         ajax.onreadystatechange = function(){
  16.             if (ajax.readyState == 4 && ajax.status == 200){
  17.                 alert(ajax.responseText);
  18.             }
  19.         };
  20.         ajax.send();
  21.         caja.readOnly = true;
  22.     }
  23. }

En la primera función (modificar()), recibo a la caja de texto y evalúo el estado de su atributo readOnly; si este es true (colocando la expresión de esa manera en la condición, se evalúa si es true o false), le asigno false a dicho atributo para que se pueda escribir en la caja de texto, caso contrario, le vuelvo a asignar true.

En la segunda función (guardar()), recibo al objeto del evento y a la caja de texto. Primero, declaro a la variable ajax y le asigno un objeto XMLHttpRequest para poder realizar una petición asíncrona (Ajax), luego, evalúo el código interno de la tecla pulsada; si este es igual a 13, que es el código que corresponde a la tecla ENTER, envío el valor de la caja de texto hacia la página que deberá actualizar el dato en la base de datos.

Esta parte sería más o menos así:

Código PHP:
Ver original
  1. $valor = $_GET['valor'];
  2. if (mysqli_query($conexion, "UPDATE tabla SET campo = '$valor' WHERE {aquí va tu condición}"){
  3.     echo 'El dato ha sido actualizado';
  4. }
  5. else{
  6.     echo 'No se pudo actualizar el dato';
  7. }

Si te fijas, ya sea cuando se logre o no actualizar el dato en la base de datos, se imprime un mensaje; dicho mensaje será lo que se devolverá a la petición asíncrona y que recibirás en ajax.responseText, el cual muestro mediante un mensaje de alerta.

Finalmente, vuelvo a asignar true al atributo readOnly de la caja de texto, para que nuevamente solo se muestre el dato y no se lo pueda modificar hasta que se le vuelva a dar un clic a la caja de texto.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #3 (permalink)  
Antiguo 17/02/2015, 15:06
Avatar de Carlos1975  
Fecha de Ingreso: mayo-2005
Mensajes: 29
Antigüedad: 19 años
Puntos: 0
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

Gracias por tu respuesta la cual es bastante practica pero no es exactamente los que busco.

Yo muestro los datos por filas y en cada fila hay un boton (modificar) el cual debe mostrar los inputs de la fila correspondiente para luego poder enviar los datos a traves de otro boton (guardar) que tambien debe aparecer con los inputs.

Cambiar la cadena de texto por los inputs lo he desarrollado con toggle();

Código Javascript:
Ver original
  1. function mostrarInputs() {
  2.        
  3.     $('.mostrar').toggle();
  4.     $('.oculto').toggle();
  5.     e.preventDefault();
  6.  
  7. }

pero sigo sin poder sacar los inputs en la fila que corresponden, solo se muestra la última fila. Una vez conseguido esto ya paso los datos por GET a la hoja donde tengo el UPDATE.

Si hay alguna idea seria de agradecer.

Gracias de todas formas
  #4 (permalink)  
Antiguo 17/02/2015, 15:14
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

Pero date cuenta de que lo que te estoy proponiendo es más práctico y termina haciendo lo mismo: Modificando los datos y guardándolos en la base de datos.

Si hay algo que no te haya quedado claro, puedes preguntarme.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand
  #5 (permalink)  
Antiguo 18/02/2015, 01:23
Avatar de Carlos1975  
Fecha de Ingreso: mayo-2005
Mensajes: 29
Antigüedad: 19 años
Puntos: 0
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

Hola Alexis

Se que es más práctico usar este código pero prefiero usar las librerias Jquery y no volverme loco con Ajax. Demasiados lenguajes de programación y javascript y yo no somos demasiado amigos que digamos, aunque al final lo seremos

He probado tu código de esta forma:

Código Javascript:
Ver original
  1. function guardar(evento, caja) {
  2.     var ajax;
  3.     if (window.XMLHttpRequest) {
  4.         ajax = new XMLHttpRequest();
  5.     } else {
  6.         ajax = new ActiveXObject("Microsoft.XMLHTTP");
  7.     }
  8.    
  9.     if (evento.keyCode == 13) {
  10.         ajax.open("GET", "actions/files_save_img?valor=" + caja.value, true);
  11.         ajax.onreadystatechange = function() {
  12.             if (ajax.readyState == 4 && ajax.status == 200) {
  13.                 alert(ajax.responseText);
  14.             }
  15.         };
  16.     ajax.send();
  17.     caja.readOnly = true;
  18.     }
  19. }

No me funciona el objeto XMLHttpRequest, no se a que es debido.

Creo que lo que falla no es el código sino la forma de exponerlo ya que la tabla la muestro con un WHILE de PHP y creo que no realiza bien la funcion de guardar debido a ello, No se si estoy en lo cierto ya que me queda mucho por aprender.

De todas formas hago incapié en mostrar un boton de modificar y en mostrar los input con un boton de guardar. Este trabajo es para una administración de una tienda online y los clientes que la usen deben de tener bien claro lo que pueden o no hacer en ella.

Gracias por tus respuestas y tu ayuda, siempre de agradecer. Y encima rápidas, cosa que valoro bastante en este foro.

Si supieras otra manera de hacerlo con Jquery o simple javascript sería de gran ayuda

salu2

y gracias de nuevo
  #6 (permalink)  
Antiguo 18/02/2015, 08:41
Avatar de Carlos1975  
Fecha de Ingreso: mayo-2005
Mensajes: 29
Antigüedad: 19 años
Puntos: 0
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

Problema resuelto y al final con Ajax

Alexis te dejo que me eches la bronca

Dejo el codigo para los que lo necesiten, siempre son opciones para todos

Jquery + Ajax

Código Javascript:
Ver original
  1. $(document).ready( function() {
  2.        
  3.     $('input').blur( function() {
  4.         var field  = $(this);
  5.         var parent = field.parent().attr('id');
  6.        
  7.         if ($('#' + parent).find(".ok").length) {
  8.             $('#' + parent + ' .ok').remove();
  9.             $('#' + parent + ' .loader').remove();
  10.             $('#' + parent).append('<div class="loader"><img src="img/ico/loader.gif"/></div>').fadeIn('slow');
  11.         } else {
  12.             $('#' + parent).append('<div class="loader"><img src="img/ico/loader.gif"/></div>').fadeIn('slow');
  13.         }
  14.        
  15.         var dataString = 'field=' + $(this).attr('name') + '&value=' + $(this).val();
  16.         $.ajax({
  17.             type: "POST",
  18.             url:  "actions/files_save_img.php",
  19.             data: dataString,
  20.             success: function(data) {
  21.                 field.val(data);
  22.                 $('#' + parent + ' .loader').fadeOut( function() {
  23.                     $('#' + parent).append('<div class="ok"><img src="img/ico/ok.png"/></div>').fadeIn('slow');
  24.                 });
  25.             }
  26.         });
  27.     });
  28. });

Y el codigo de los inputs

Código HTML:
Ver original
  1. <td id="N<?php echo $row["idImagen"] ?>" class="input">
  2.     <input type="text" id="strNombreImagen" name="strNombreImagen" value="<?php echo $row["strNombreImagen"] ?>">
  3. </td>
  4. <td id="T<?php echo $row["idImagen"] ?>" class="input">
  5.     <input type="text" id="strTituloImagen" name="strTituloImagen" value="<?php echo $row["strTituloImagen"] ?>"><?php echo $row["idImagen"] ?>
  6. </td>

el archivo UPDATE en PHP, sin terminar todavia.

Código PHP:
Ver original
  1. require_once('../../bd/connect.php');
  2.  
  3. sleep(1);
  4. $columna = $_POST['field'];
  5. $valor = $_POST['value'];
  6.  
  7. $updateSQL = sprintf("UPDATE tbl_img_productos SET '".$columna."' = '".$valor."' WHERE idImagen = $idImagen");

Saludos y gracias de nuevo
  #7 (permalink)  
Antiguo 18/02/2015, 11:33
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 12 años, 5 meses
Puntos: 977
Respuesta: convertir cadena de texto en inputs de una tabla que muestra varios regist

Cita:
Iniciado por Carlos1975 Ver Mensaje
No me funciona el objeto XMLHttpRequest, no se a que es debido.
Debes de ser un poco más específico cuando dices que "no me funciona". Podrías ver en la consola qué devuelve la respuesta de esta manera:

Código Javascript:
Ver original
  1. if (ajax.readyState == 4 && ajax.status == 200) {
  2.     console.log(ajax.responseText);
  3. }

Cita:
Iniciado por Carlos1975 Ver Mensaje
Creo que lo que falla no es el código sino la forma de exponerlo ya que la tabla la muestro con un WHILE de PHP y creo que no realiza bien la funcion de guardar debido a ello, No se si estoy en lo cierto ya que me queda mucho por aprender.
En realidad, eso no tiene nada que ver. Si tus <input> tienen la forma que te mostré, deberían de guardar los datos sin problema alguno, de hecho, hice una pequeña prueba localmente y funcionó. Quizá no estás recibiendo correctamente al dato en el archivo PHP o algo está ocurriendo ahí que no devuelve la respuesta. Para averiguar eso, debes de depurar el código y como estás realizando una petición asíncrona (Ajax), debes de trabajar con la consola del navegador.

Cita:
Iniciado por Carlos1975 Ver Mensaje
De todas formas hago incapié en mostrar un boton de modificar y en mostrar los input con un boton de guardar. Este trabajo es para una administración de una tienda online y los clientes que la usen deben de tener bien claro lo que pueden o no hacer en ella.
Por ese lado podría tener más sentido el hacer uso de todo eso, aunque con unos años trabajando en este negocio, he aprendido que los clientes quieren que todo sea simple y rápido, es decir, si van a ingresar o editar, por ejemplo, 400 registros, quieren que la interfaz les permita hacerlo de una manera rápida, para no perder tiempo. Por eso te lo puse de esa manera, para que todo lo haga en un mismo elemento y con tan solo un clic y pulsar la tecla ENTER una vez.

Cita:
Iniciado por Carlos1975 Ver Mensaje
Se que es más práctico usar este código pero prefiero usar las librerias Jquery y no volverme loco con Ajax. Demasiados lenguajes de programación y javascript y yo no somos demasiado amigos...
Te entiendo, pero la manera correcta de empezar en esto es primero aprender acerca de los lenguajes de programación y luego sobre sus librerías. En realidad, trabajar con Ajax utilizando código JavaScript nativo, no es complicado, son solo unas cuantas líneas que, a diferencia de usar una librería, evitarán que tengas la necesidad de cargar miles de bytes de código para utilizar unos cuantos métodos, los cuales podrían ser reemplazados por unas líneas de código nativo. Tómalo como un consejo.

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: bd, cadena, input, inputs, muestra, php, registros, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:36.