PHP - insertar datos y mostrar select mysql con javascript

 
Vista:
sin imagen de perfil
Val: 19
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Max (8 intervenciones) el 08/03/2021 23:55:39
Hola

Tengo 2 problemas y quisiera saber si ustedes me pudiesen dar alguna recomendacion u opinion para resolverlos. Les explico:

1.Tengo un formulario (php y mysql) que contiene inputs y una tabla dinámica (datatable) en donde el usuario va agregando filas según lo requiera. Estoy agregando las filas nuevas con javascript.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<form method="POST" name="form-work" action="guardar.php">
    <div class="form-group">
        <label>Fecha</label>
        <input type="date"
        oninvalid="this.setCustomValidity('Ingresar una fecha')"
        oninput="this.setCustomValidity('')"
        class="form-control"
        id="fecha"
        name="fecha"
        min="2021-01-01"
        max="2021-12-31"
        required>
    </div>
    <div class="form-group">
        <label>Nombre</label>
        <input type="text"
        oninvalid="this.setCustomValidity('Ingresar nombre')"
        oninput="this.setCustomValidity('')"
        class="form-control"
        id="nombre"
        name="nombre"
        placeholder="Escribir el nombre"
        required>
    </div>
    <div class="form-group">
        <label>Direccion</label>
        <input type="text"
        oninvalid="this.setCustomValidity('Ingresar dirección')"
        oninput="this.setCustomValidity('')"
        class="form-control"
        id="direccion"
        name="direccion"
        placeholder="Escribir la direccion"
        required>
    </div>
 
    <table width="22%" cellpadding="200px" cellspacing="200px">
        <td><input type="button" class="btn btn-success" value="Agregar fila" onclick="addRow('dataTable');checkNumRows();" /></td>
        <td><input type="button" id="btnBorrar" class="btn btn-danger" value="Eliminar fila(s)" onclick="deleteRow('dataTable');" onmouseover="checkNumRows();" /></td>
        <td><input type="button" value="Contar" onclick="cuentaTodo('dataTable');"></td>
    </table>
    <br>
    <table id="dataTable" class="table table-responsive table-hover table-bordered text-center">
        <tr>
            <th>Seleccionar</th>
            <th>Descripción</th>
            <th>Cantidad</th>
            <th>Precio Unit.</th>
            <th>Precio</th>
        </tr>
        <tr>
            <td><input type="checkbox" name="chk"/></td>
            <td>
            <select class="form-control" id="descripcion" name="descripcion">
            <option selected>Seleccione:</option>
                <?php require 'database_compra.php';
                $querySel = "SELECT * FROM tabla_compra";
                $resultSel = mysqli_query($conexion, $querySel);
                while ($selStock = mysqli_fetch_array($resultSel)) {
                    echo '<option value="'.$selStock["producto"].'">'.$selStock["producto"].'</option>';
                }?>
            </select>
            </td>
            <td><input type="number" class="form-control" id="cantidad" name="cantidad" value="1" min="1"></td>
            <td><input type="number" disabled="disabled" class="form-control" id="precio_unit" name="precio_unit" value=""></td>
            <td><input type="number" disabled="disabled" class="form-control" id="precio_cant" name="precio_cant" value=""></td>
        </tr>
    </table>
    <button type="submit" class="btn btn-primary">Guardar</button>
</form>

Mi primer problema es que necesito guardar todos los campos y la tabla con las filas agregadas como un solo registro para luego mostrar estos datos en otra pagina. Por lo que he investigado, podría hacerlo con JSON (encrypt y decrypt), me recomiendan usarlo o hay una solución mejor?.

2. En el formulario anterior, hay un <select> que lo estoy llenando con mysqli. En el primer registro si se muestra, ya que lo estoy haciendo directamente en el php file, pero como puedo hacer lo mismo cuando agrego otra fila por javascript. Yo se que php y javascript no pueden 'interactuar' directamente ya que son entornos totalmente distintos.

Aca dejo el codigo de como estoy creando cada fila

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function addRow(dataTable) {
 
   var table = document.getElementById("dataTable");
 
   var rowCount = table.rows.length;
   var row = table.insertRow(rowCount);
 
   var cell1 = row.insertCell(0);
   var element1 = document.createElement("input");
   element1.type = "checkbox";
   element1.setAttribute("name", "chk");
   cell1.appendChild(element1);
 
   var cell2 = row.insertCell(1);
   var element2 = document.createElement("select");
   var opt = document.createElement("option");
   element2.setAttribute('id', 'descripcion');
   element2.setAttribute('name', 'descripcion');
   element2.setAttribute('class', 'form-control');
   opt.appendChild(document.createTextNode('Seleccione:'));
   element2.appendChild(opt);
   var option = document.createElement("option");
   option.setAttribute('value', '.$selStock["producto"].');
   var t = document.createTextNode(".$selStock['producto'].");
   option.appendChild(t);
   document.getElementById("descripcion").appendChild(element2);
   cell2.appendChild(element2);
 
   var cell3 = row.insertCell(2);
   var element3 = document.createElement("input");
   element3.type = "number";
   element3.setAttribute('class', 'form-control');
   element3.setAttribute('id', 'cantidad');
   element3.setAttribute('name', 'cantidad');
   element3.setAttribute('value', '1');
   cell3.appendChild(element3);
 
   var cell4 = row.insertCell(3);
   var element4 = document.createElement("input");
   element4.type = "number";
   element4.setAttribute('class', 'form-control');
   element4.setAttribute('id', 'precio_unit');
   element4.setAttribute('name', 'precio_unit');
   element4.setAttribute('disabled', 'disabled');
   cell4.appendChild(element4);
 
   var cell5 = row.insertCell(4);
   var element5 = document.createElement("input");
   element5.type = "number";
   element5.setAttribute('class', 'form-control');
   element5.setAttribute('id', 'precio_cant');
   element5.setAttribute('name', 'precio_cant');
   element5.setAttribute('disabled', 'disabled');
   cell5.appendChild(element5);
 
}

El extracto del código anterior es solo una idea de lo que quiero hacer, yo se que esta mal.

1
2
3
4
5
var option = document.createElement("option");
   option.setAttribute('value', '.$selStock["producto"].');
   var t = document.createTextNode(".$selStock['producto'].");
   option.appendChild(t);
   document.getElementById("descripcion").appendChild(element2);

Quedo atento a cualquier respuesta

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Jefferson (203 intervenciones) el 09/03/2021 02:46:18
Hola amigo

En cuanto a tu primer problema, realmente tienes dos problemas

Uno estás usando una librería muy avanzada como lo es datatable que crea sus propias clases y elementos. Y de no saber manipular bien está librería (que por cierto no usa vanilla js si no jquery) en un futuro te va a cascar al tener muchos registros y quieras manipular datos.

Ojo no estoy diciendo que sea mala libreria, por el contrario es buenísima y la use hasta el cansancio cuando trabaje con JQuery.

Segundo problema del primero, va de la mano con la librería, te repito al hacer un recorrido para cargar todo a un Json (que dicho sea de paso eso de encrypt y decrypt no tiene lógica) quizás encode y decode. Al recorrer el Dom solo cogerá lo que pinté en pantalla el atributo pageLength que tú establezcas, por como te comenté la librería es muy compleja y solo hace recorridos con sus propias funciones. No con las nativas js.

Tu segundo problema solo pinta el primer select, porque simplemente le ordenas que así sea. Para lograr que lo pinté en la function addRow debes solicitarlo vía Ajax o Fetch y devolverlo en Json para finalmente cargarlo en todas las N filas que desees.

Javascript y Php claro que pueden interactuar, es ilógico pensar que ambos lenguajes son x distantes. Ambos traen herramientas poderosas para comunicarse entre si. Solo que debemos conocerlas.

Te recomiendo estudiar bastante todo lo que te he comentando. De hacerlo es muy sencillo teniendo los conocimientos necesarios. Incluso Datatable trae consigo herramientas para usar Ajax incorporado e ir llenando ese select que deseas.

Saludos amigo y suerte.

Si algo no entendiste hazlo saber y seguro estoy que cualquier forero de los mejores que están aquí te ayudarán.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 19
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Max (8 intervenciones) el 11/03/2021 07:18:45
Hola Jefferson

Muchas gracias por tu respuesta. No conocía esta librería y estoy aprendiendo a usarla (y además json) en un corto plazo de tiempo. Por lo que he averiguado, es bien compleja como igual me dices y mi cliente no me puede dar mas tiempo para aprender mas. Decidí usar esta librería por las características que posee (filtros y búsquedas en tiempo real)
Con respecto al primer problema, estoy estudiando mucho sobre como usar json en la datatable y me ha costado un poco como se realiza en proceso de envío de datos a la db.

Por lo que respecta al segundo problema, he revisado un post anterior que alguien estaba buscando la forma de ejecutar un archivo php en javascript (algo muy parecido lo que buscaba hacer también) y estoy tratando de adaptar tu respuesta en mi proyecto. También estoy intentando hacer esto con nodejs pero estoy esperando poder instalarlo en el servidor. Quisiera saber si tu o alguien me pudiera ayudar con el código

Acá expongo lo que tengo:

archivo php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<select class="form-control" id="descripcion" name="descripcion" onchange="listar_desc();">
    <option selected>Seleccione:</option>
    <?php include 'database_compra.php';
    $json = json_decode(file_get_contents('php://input'),true);
    if($json['datos']){
        $querySel = "SELECT * FROM tabla_stock ORDER BY id_producto";
        $resultSel = mysqli_query($conexion, $querySel);
        while ($selStock = mysqli_fetch_array($resultSel)) {
            array_push($selStock, array('value', $selStock[1]));
        }
    }
    echo json_encode($selStock,true);
    ?>
</select>

archivo js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
var cell2 = row.insertCell(1);
   var element2 = document.createElement("select");
   var opt = document.createElement("option");
   element2.setAttribute('id', 'descripcion');
   element2.setAttribute('name', 'descripcion');
   element2.setAttribute('class', 'form-control');
   opt.appendChild(document.createTextNode('Seleccione:'));
   element2.appendChild(opt);
 
   fetch('insertarCom.php', {
     method: 'POST',
     body: JSON.stringify({
       'datos': true
     }),
     headers: {
       'Content-Type': 'application/json'
     }
   })
   .then(res => res.json())
   .then(function(json) {
     for (let i in json) {
          var option = document.createElement("option");
       for (let j in json[i]) {
         //option.value = json[i].value;
         option.text = json[i].text;
         element2.appendChild(option);
       }
     }
   });
   cell2.appendChild(element2);

Estaría agradecido cualquier ayuda.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Jefferson (203 intervenciones) el 12/03/2021 02:47:45
Oye amigo

Me encantaría ayudarte, pero lo que deseas hacer no es que sea complejo, pero si es laborioso

Si te entiendo quieres crear una tabla dinámica que el usuario tenga elección de agregar N cantidad de filas.

Ahora bien por cada fila creada en alguna columna crear un select y que este hale su contenido de una tabla sql

También en esta fila que tenga un botón que al pulsarlo me recoja los datos de esa fila y los envié a otra página (que se yo para guardarla imagino)

Y por último un botón que al pulsarlo recoja todo lo que está en la tabla e incluyendo unos o varios input, que están por fuera en un form, para así poder enviarlos a otra página (imagino también para guardarlos)



Sin ánimos a desanimarte dile al cliente la verdad, pues no creo que lo aprendas de hoy para mañana.

Yo puedo hacerte un ejemplo de todo eso sin compromiso alguno y explicarte paso a paso. Pero justo ahora estoy full de trabajo y muy atrasado.

Si me das tiempo lo haré, a menos que el maestro Mauro se me adelante jejeje ...

Saludos amigo. Sinceramente deseo ayudarte algo me dice que le estás echando ganas

Bye
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 19
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Max (8 intervenciones) el 12/03/2021 22:54:44
Muchas gracias Jefferson. Ya hable con mi cliente y le explique que necesito mas tiempo. Te agradecería muchísimo si me pudieses ayudar con un ejemplo cuando puedas, me serviría mucho. .
Quedo atento
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 393
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Jefferson (203 intervenciones) el 13/03/2021 22:59:42
Hola Daniel

Finalmente tuve un espacio esta tarde

Extrae el archivo y estudia en detalle como se hace

Espero colaborar contigo y con la comunidad del foro

Saludos desde Venezuela

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-BmbxuPwQa2lc/FVzBcNJ7UAyJxM6wuqIj61tLrc4wSX0szH/Ev+nYRRuWlolflfl" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.6.0/dist/umd/popper.min.js" integrity="sha384-KsvD1yqQ1/1+IA7gi3P0tyJcT3vR+NdBTt13hSJ2lnve8agRGXTTyNaBYmCR/Nwi" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta2/dist/js/bootstrap.min.js" integrity="sha384-nsg8ua9HAw1y0W1btsyWgBklPnCUAFLuTMS2G72MMONqmOymq585AcH49TLBQObG" crossorigin="anonymous"></script>
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.3.0/font/bootstrap-icons.css">
</head>
 
<body>
 
    <!-- Bueno aca el body html, pura paja mas de lo mismo sabes hacerlo -->
 
  <div class="container">
    <form class="border border-secondary rounded p-4 mt-2 needs-validation" novalidate>
      <div class="row col md-12">
        <div class="col-md-6 mb-3">
          <label for="nombre" class="form-label">Nombre</label>
          <input type="text" class="form-control" id="nombre" name="nombre" required>
          <div class="valid-feedback">Correcto!</div>
          <div class="invalid-feedback">Incluya nombre</div>
        </div>
        <div class="col-md-6 mb-3">
          <label for="fecha" class="form-label">Fecha Compra</label>
          <input type="date" class="form-control" id="fecha" name="fecha" required>
          <div class="valid-feedback">Correcto!</div>
          <div class="invalid-feedback">Incluya fecha</div>
        </div>
        <div class="col-md-10 mb-3">
          <label for="direccion" class="form-label">Direccion</label>
          <textarea class="form-control" id="direccion" name="direccion" rows="3" required></textarea>
          <div class="valid-feedback">Correcto!</div>
          <div class="invalid-feedback">Incluya direccion</div>
        </div>
        <div class="col-md-2 mt-5">
          <button class="btn btn-primary" type="submit">Guardar</button>
        </div>
      </div>
    </form>
    <div class="table-responsive tabla mt-3">
      <h1 class="text-center text-primary text-uppercase">Cargue productos a la compra</h1>
      <table class="table table-bordered">
        <thead>
          <tr>
            <th scope="col" class="text-center">AGREGA</th>
            <th scope="col">PRODUCTO</th>
            <th scope="col">DESCRIPCION</th>
            <th scope="col" style="text-align:right;">CANTIDAD</th>
            <th scope="col" style="text-align:right;">PRECIO</th>
            <th scope=" col" style="text-align:right;">TOTAL</th>
            <th scope="col" class="text-center">BORRA</th>
          </tr>
        </thead>
        <tbody></tbody> <!-- aca dejo el tbody vacio solo comentado -->
        <tfoot>
          <tr>
            <th colspan="6" style="text-align:right;">TOTAL : <span class="total">0.00</span></th>
          </tr>
        </tfoot>
      </table>
    </div>
  </div>
 
  <script>
    // declaro constantes
    const tfoot = document.querySelector('tfoot'); //el foot de la tabla
    const table = document.querySelector('tbody');  //el tbody de la tabla
    const td_datos = []; //el array donde guardare lo que recoja del reccorido de la tabla
    var frm_datos; //el formdata para enviar a la pagina productos
 
    // esta instruccion lee el dom y justo al cargar ejecuta lo que se le indique
    document.addEventListener('DOMContentLoaded', function() {
      AddFila(); // la funcion para agregar filas a la tabla dinamica
    });
 
    function AddFila() {
      let num = table.rows.length + 1; //como ya declare la tabla arriba ahora enumero las filas que vaya creando
      var td = []; // en este array voy agregado columnas
      var row = table.insertRow(0); //inserto la fila
      for (var j = 0; j < 7; j++) {
        td[j] = row.insertCell(j); //en este bucle le indico cuantas columnas crear
      }
      //aca le voy dando cuerpo a las columnas o celdas
      //fijate que siguiendo el numero puedo decidir que clase darle, id, write, etc
      td[0].innerHTML = '<span onclick="AddFila();"><span class="icon"><i class="bi bi-plus-circle fs-5 text-primary" role="button"></i></span></span>';
      td[0].classList.add('text-center');
      //muy importante para que javascript no se lie al hacerle peticiones le agrego un id numerico
      // y aqui creo tu bendito select jeje
      td[1].innerHTML = '<select id="select_' + num + '" class="form-select" onchange="descripcion(this);"></select>';
      td[2].classList.add('descripcion');
      //fijate como hago uso del id numerico para indicarle a javascript donde debe atacar
      let select = document.querySelector('#select_' + num);
      //finalmente hago la peticion fecth a la pagina productos para extraer de ella los options
      fetch('productos.php', {
          method: 'POST',
          body: JSON.stringify({
            'solicitud': true
          }),
          headers: {
            'Content-Type': 'application/json' //el encabezado se lo envio como json y asi mismo debo recibirlo en php
          }
        })
        .then(res => res.json()) //le indico que deseo la promesa en formato json
        .then(function(json) { //finalmente php la devuelve
          for (let i in json) { //como viene en json la recorro para extraer su contenido
            var option = document.createElement("option"); //creo un elemento option
            for (let j in json[i]) {
              option.value = json[i].value; //como se la forma en que arme mi json en php, simplemente le indico el nombre del index
              option.text = json[i].text;
              select.appendChild(option); //finalmente se lo agrego al select con id numerico
            }
          }
        });
        //mas de lo mismo
      td[3].innerHTML = '<input class="cantidad form-control" style="text-align:right" type="number" onchange="calc(this);" id="cantidad_' + num + '" />';
      td[3].style.width = "200px";
      td[4].innerHTML = '<input class="precio form-control" style="text-align:right" type="number" onchange="calc(this);" id="precio_' + num + '" />';
      td[4].style.width = "200px";
      td[5].innerHTML = '0.00';
      td[5].classList.add('sub');
      td[5].style.textAlign = 'right';
      td[6].innerHTML = '<span onclick="borra(this);"><span class="icon"><i class="bi bi-trash fs-5 text-danger ml-3" role="button"></i></span></span>';
      td[6].classList.add('text-center');
    }
    //fijate que cuando select cambia llamo a esta funcion
    function descripcion(este) { // this es el elemento
      let node = este.parentNode.parentNode.childNodes; //conociendo el elemento armo toda la fila para organizarme e ir decidiendo donde actuar
      var descripcion;
      var precio;
      //hago lo mismo mediante fetch solicito informacion
      fetch('productos.php', {
          method: 'POST',
          body: JSON.stringify({
            'descripcion': este.value //aca le envio el valor del select para poder extraer su descripcion y precio
          }),
          headers: {
            'Content-Type': 'application/json'
          }
        })
        .then(res => res.json()) //igual que el anterior
        .then(function(json) {
          for (let i in json) { //recorro y guardo en variables lo que me traiga de vuelta
            for (let j in json[i]) {
              descripcion = json[i].descripcion;
              precio = json[i].precio;
            }
          }
        });
      setTimeout(() => {
      //debo crear un tiempo porque fecth es asincronico (osea no trabaja por bloques y si no hago tiempo, la siguiente instruccion pasa volando y crea un null)
        for (let i = 0; i < node.length; i++) { //como organice mi fila puedo actuar
          let ItemNode = node.item(i); //voy recorriendo uno a uno las columnas de la fila
          if (ItemNode.className == "descripcion") { //me detengo en esta clase
            ItemNode.innerHTML = descripcion; // y le pinto la descripcion
            ItemNode.nextSibling.nextSibling.lastChild.value = precio; //aprovecho y coloco en precio al input
            ItemNode.nextSibling.lastChild.focus(); // y le paso  el foco a cantidad
            //todo esto lo hacemos mediante parentNode y como te comente ordeno las fila en un solo nodo
            //y como conozco la estructura de mi tabla simplemente me muevo con las propiedades del nodo
          }
        }
      }, 100);
    }
   //esta funcion es identica a la anterior, la uso para calcular el total
    function calc(este) {
      let node = este.parentNode.parentNode.childNodes;
      var total;
      for (let i = 0; i < node.length; i++) {
        let ItemNode = node.item(i);
        if (ItemNode.className == "descripcion") {
          let precio = parseFloat(ItemNode.nextSibling.nextSibling.lastChild.value);
          let cantidad = parseFloat(ItemNode.nextSibling.lastChild.value);
          total = precio * cantidad;
        }
        if (ItemNode.className == "sub") {
          ItemNode.innerHTML = parseFloat(total).toFixed(2);
        }
      }
      suma_tfood();
    }
   // por aqui recorro la columna total y voy sumando lo que encuentre
    function suma_tfood() {
      let tfoot_sub = document.querySelector('.total');
      var suma = 0;
      document.querySelectorAll(".sub").forEach(function(el) {
        suma += Number(el.innerHTML);
      });
      tfoot_sub.innerHTML = parseFloat(suma).toFixed(2);
    }
    // con esta funcion borro la fila
    // fijate que igual creo un nodo para orientarme
    function borra(este) {
      let a = este.parentNode.parentNode.rowIndex;
      document.querySelector("table").deleteRow(a);
      suma_tfood();
      if (table.rows.length == 0) {
        AddFila()
      }
    }
 
    // tu dolor de cabeza el json
    // es muy sencillo
    function TableJson() {
      // deleteArray();  //por si acaso deseas borrar el json
      document.querySelectorAll("tbody tr").forEach(function(el) { //recorro toda la tabla de arriba a abajo
        let node = el.childNodes; //vuelvo a crear el nodo
        item = {}; //preparo el json
        for (let i = 0; i < node.length; i++) { //me hago un bucle para seleccionar que deseo grabar al json
          if (node.item(i).className == 'descripcion') {
            item['descripcion'] = node.item(i).innerHTML; //aca voy agregando a la variable lo que yo considero necesario
          }
          // como no todas las columnas tienen id, le indico a la condicional que solo deje pasar las que no sean indefinidas
          if (node.item(i).childNodes[0].id != undefined) {
            switch (explode(node.item(i).childNodes[0].id, '_', 0)) {
              case 'precio':
                item['precio'] = node.item(i).childNodes[0].value; //agrego
                break;
              case 'cantidad':
                item['cantidad'] = node.item(i).childNodes[0].value; //agrego
                break;
              case 'select':
                item['select'] = node.item(i).childNodes[0].value; //agrego
                break;
            }
          }
        }
        td_datos.push(item); //finalmente lo gurado el json en esa variable que mas tarde usare
      });
    }
 
    function explode(texto, caracter, parte) { //aca es una funcion para leer partes
      var extrae = texto.split(caracter);
      return extrae[parte].trim();
    }
 
    // function deleteArray(){
    //   for (var i = td_datos.length-1; i >= 0; i--) {
    //      td_datos.splice(i, 1);
    //   }
    // }
 
    (() => { //esto es para validar el form (bootstrap lo tiene)
      'use strict';
      const frm = document.querySelector('.needs-validation'); //aca me traigo todo el form
      const forms = document.querySelectorAll('.needs-validation'); //aca preparo para que recorra el form
      const boton = document.querySelector('.btn-primary'); //esto es una pendejera para que me cree el efecto spinner
      Array.prototype.slice.call(forms).forEach((form) => {
        form.addEventListener('submit', (e) => { //si no se cumple los datos del form detiene (bootstrap)
          if (!form.checkValidity()) {
            e.preventDefault();
            e.stopPropagation();
          } else {
            //al pasar le cambio el boton a spinner
            boton.innerHTML='Enviando...<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true"></span>';
            frm_datos = new FormData(frm); //agrego todo lo que este en el form a un formdata
            e.preventDefault();
            TableJson(); //llamo la funcion que me crea el Json
            // IMPORTANTE
            // fijate como le agrego a formdata el Json de la tabla
            frm_datos.append('td_datos', JSON.stringify(td_datos));
 
            fetch('productos.php', { //vualvo a fetch
                method: 'POST',
                body: frm_datos //fijate que le envio toda la variable formdata (hay va todo)
                //otra cosa ya no le digo que lo envio como json, si no como POST normal
              })
              .then(res => res.text()) //le indico que deseo recibir la promesa en texto
              .then(function(text) {
                if (text == 'ok') location.reload(); //si todo salio bien recargo la pagina
              });
          }
          form.classList.add('was-validated');
        }, false);
      });
    })();
    //te preguntaras porque aveces uso var y otras veces let
    //pues porque let se destruye al terminar su ejecucion en una funcion y puedo usar la misma variable en otra funcion
  </script>
</body>
 
</html>
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 19
Ha aumentado su posición en 6 puestos en PHP (en relación al último mes)
Gráfica de PHP

insertar datos y mostrar select mysql con javascript

Publicado por Max (8 intervenciones) el 16/03/2021 04:54:28
Hola Jefferson, Muchas gracias por tu ejemplo, de verdad gracias. Me ayudaste bastante como guía para resolver mi problema. Voy a estudiar bien el código que posteaste y te comento si llego a tener algunas preguntas.
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar