JavaScript - Boton de formulario en ventana modal de Bootstrap y ajax no funciona

 
Vista:
sin imagen de perfil

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Toni (4 intervenciones) el 23/02/2023 21:26:53
Hola! Estoy implemntando un CRUD y todo funciona perfectamente. Puedo añadir usuarios a través de un botón que abre una ventana modal. Sin embargo, no puedo editarlos ni eliminarlos porque al pulsar el botón de editar / eliminar no se abre la ventana modal. No entiendo por qué. Podéis ayudarme? Envío el código de 2 archivos: el index.php y el script.js que realiza las acciones.


Index.php



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
<!DOCTYPE html>
<html>
<head>
    <title>CRUD con PHP, MySQL, Bootstrap, JavaScript y AJAX</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
 
<div class="container">
    <h2>CRUD con PHP, MySQL, Bootstrap, JavaScript y AJAX</h2>
    <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addUserModal">
        Agregar Usuario
    </button>
    <br><br>
    <table class="table">
        <thead>
            <tr>
                <th>ID</th>
                <th>Nombre</th>
                <th>Correo Electrónico</th>
                <th>Teléfono</th>
                <th>Acciones</th>
            </tr>
        </thead>
        <tbody id="users">
        </tbody>
    </table>
</div>
 
<!-- Ventana modal para agregar usuario -->
<div class="modal" id="addUserModal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Agregar Usuario</h4>
<button type="button" class="close" data-dismiss="modal">×</button>
</div>
<div class="modal-body">
<form id="addUserForm">
<div class="form-group">
<label for="name">Nombre:</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Correo Electrónico:</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="form-group">
<label for="phone">Teléfono:</label>
<input type="tel" class="form-control" id="phone" name="phone" required>
</div>
<button type="submit" class="btn btn-primary">Agregar</button>
</form>
</div>
</div>
</div>
 
</div>
<!-- Ventana modal para editar usuario -->
<div class="modal" id="editUserModal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Editar Usuario</h4>
                <button type="button" class="close" data-dismiss="modal">×</button>
            </div>
            <div class="modal-body">
                <form id="editUserForm">
                    <input type="hidden" id="editId" name="id">
                    <div class="form-group">
                        <label for="editName">Nombre:</label>
                        <input type="text" class="form-control" id="editName" name="name" required>
                    </div>
                    <div class="form-group">
                        <label for="editEmail">Correo Electrónico:</label>
                        <input type="email" class="form-control" id="editEmail" name="email" required>
                    </div>
                    <div class="form-group">
                        <label for="editPhone">Teléfono:</label>
                        <input type="tel" class="form-control" id="editPhone" name="phone" required>
                    </div>
                    <button type="submit" class="btn btn-primary">Guardar Cambios</button>
                </form>
            </div>
        </div>
    </div>
</div>
<!-- Ventana modal para eliminar usuario -->
<div class="modal" id="deleteUserModal">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Eliminar Usuario</h4>
                <button type="button" class="close" data-dismiss="modal">×</button>
            </div>
            <div class="modal-body">
                <p>¿Está seguro que desea eliminar a este usuario?</p>
                <form id="deleteUserForm">
                    <input type="hidden" id="deleteUserId" name="id">
                    <button type="submit" class="btn btn-danger">Eliminar</button>
                </form>
            </div>
        </div>
    </div>
</div>
<script src="script.js"></script>
</body>
</html>


script.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
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
$(document).ready(function() {
 
    // Función para obtener la lista de usuarios
    function getUsers() {
        $.ajax({
            url: 'getUsers.php',
            type: 'get',
            success: function(response) {
                $('#users').html(response);
            }
        });
    }
    getUsers();
 
    // Función para agregar usuario
    $('#addUserForm').submit(function(e) {
        e.preventDefault();
        $.ajax({
            url: 'addUser.php',
            type: 'post',
            data: $('#addUserForm').serialize(),
            success: function(response) {
                $('#addUserModal').modal('hide');
                $('#addUserForm')[0].reset();
                getUsers();
            }
        });
    });
 
    // Función para obtener datos de usuario
    $(document).on('click', '.editBtn', function() {
        var id = $(this).attr('data-id');
        $.ajax({
            url: 'getUser.php',
            type: 'post',
            data: {id: id},
            success: function(response) {
                var data = JSON.parse(response);
                $('#editId').val(data.id);
                $('#editName').val(data.name);
                $('#editEmail').val(data.email);
                $('#editPhone').val(data.phone);
            }
        });
    });
 
    // Función para editar usuario
    $('#editUserForm').submit(function(e) {
        e.preventDefault();
        $.ajax({
            url: 'editUser.php',
            type: 'post',
            data: $('#editUserForm').serialize(),
            success: function(response) {
                $('#editUserModal').modal('hide');
                $('#editUserForm')[0].reset();
                getUsers();
            }
        });
    });
 
    // Función para eliminar usuario
    $(document).on('click', '.deleteBtn', function() {
        var id = $(this).attr('data-id');
        if (confirm('¿Estás seguro de que deseas eliminar este usuario?')) {
            $.ajax({
                url: 'deleteUser.php',
                type: 'post',
                data: {id: id},
                success: function(response) {
                    getUsers();
                }
            });
        }
    });
 
});


Tiene algo que ver las nuevas clases de Bootstrap data-bs-toggle ?? No estoy en la versión 5 de bootstrap, por lo que no lo entiendo qué ocurre

Gracias
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Jefferson (22 intervenciones) el 24/02/2023 01:21:05
Hola

Tu mismo te estás respondiendo

No abre el modal porque no existe la línea de código que lo abra

1
$('#Modal').modal('show');

Comentas
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Toni (4 intervenciones) el 24/02/2023 08:36:36
Tienes razón, Jefferson! Gracias

Olvide incluir el archivo getUsers.php con el código donde figuran los botones de editar y eliminar que permiten abrir la bentana modal. Y efectivamente ahora se abre. El problema es que en editar no carga la información con la id del usuario. ¿Alguna ayuda?


getUsers.php


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
<?php
    include "config.php";
 
    $sql = "SELECT * FROM users";
    $result = mysqli_query($con, $sql);
 
    if (mysqli_num_rows($result) > 0) {
        while ($row = mysqli_fetch_assoc($result)) {
            echo '<tr>';
			echo '<td>' . $row["id"] . '</td>';
            echo '<td>' . $row["name"] . '</td>';
            echo '<td>' . $row["email"] . '</td>';
            echo '<td>' . $row["phone"] . '</td>';
            echo '<td>';
            echo '<button type="button" class="btn btn-primary btn-sm" data-toggle="modal" data-target="#editUserModal"
onclick="editUserModa(' . $row["id"] . ')">Editar</button>';
            echo ' ';
            echo '<button type="button" class="btn btn-danger btn-sm" data-toggle="modal" data-target="#deleteUserModal" onclick="deleteUserModal(' . $row["id"] . ')">Eliminar</button>';
            echo '</td>';
            echo '</tr>';
        }
    } else {
        echo '<tr><td colspan="4">No hay registros de usuarios.</td></tr>';
    }
 
    mysqli_close($con);
?>
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Jefferson (22 intervenciones) el 24/02/2023 15:28:17
Hola nuevamente.

Creo que andas un poco desorientado en el tema CRUD.

Deja te preparo un ejemplo algo ilustrativo para que comprendas.

Por cierto ya no uso jquery pues javascript moderno es igual de potente
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Toni (4 intervenciones) el 24/02/2023 15:32:27
Vaya, muchas gracias!! Estoy aprendiendo ;)
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Jefferson (22 intervenciones) el 24/02/2023 16:36:24
Crea un archivo index.php y pega el siguiente código

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
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CRUD DYNAMIC TABLE USERS</title>
 
    <!-- obviamente llamamos al cdn de bootstrap -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"
    integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
 
    <!-- referenciamos unas pequeñas libreria mias para datatable y notify -->
    <script src="https://unpkg.com/datatable-bootstrap-js@1.0.1/bootstrap_datatable.js" defer></script>
    <script src="https://unpkg.com/notify-jjjtaccess@1.0.1/notify_jefferson.v1.min.js" defer></script>
 
 
    <style>
        @import url('https://fonts.googleapis.com/css2?family=Maven+Pro&display=swap');
 
        body {
            font-family: 'Maven Pro', sans-serif;
        }
    </style>
 
</head>
 
<body>
    <section class="container mt-3">
        <h3 class="text-center p-2 mt-1 mb-5">CRUD DYNAMIC TABLE USERS</h3>
 
        <!-- para la tabla html creamos un div y asignamos un id -->
        <div id="users"></div>
 
        <!-- creamos un modal unico    -->
        <div class="modal" id="myModal" style="background-color: rgba(0, 0, 0, 0.4);" tabindex="-1">
            <div class="modal-dialog">
                <div class="modal-content">
                    <div class="modal-header">
                        <h5 class="modal-title"></h5>
                        <button type="button" class="btn-close x-close"></button>
                    </div>
                    <div class="modal-body">
                        <form id="frm">
                            <input id="id" name="id" class="d-none">
                            <div class="form-floating mb-3">
                                <input class="form-control" id="name" name="name" placeholder="name">
                                <label for="name">name</label>
                            </div>
                            <div class="row">
                                <div class="col">
                                    <div class="form-floating mb-3">
                                        <input class="form-control" id="email" name="email" placeholder="email">
                                        <label for="email">email</label>
                                    </div>
                                </div>
                                <div class="col">
                                    <div class="form-floating mb-3">
                                        <input class="form-control" id="phone" name="phone" placeholder="phone">
                                        <label for="phone">phone</label>
                                    </div>
                                </div>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary x-close">Close</button>
                        <button type="button" class="btn btn-primary" id="save">Save changes</button>
                    </div>
                </div>
            </div>
        </div>
 
    </section>
 
    <script>
        let titulo = document.querySelector('.modal-title');
 
        //function para cargar o recargar la tabla
        const LoadMyTabla = () => {
            //Invocamos la construccion de la tabla
            new BootstrapDatatable({
                id_div: 'users',
                th_column: ['NAME', 'EMAIL', 'PHONE', 'ACCION'],
                url: 'php.php',
                id_btn_add: 'addBtn', //creamos el boton para agregar nuevo registro con el id:addBtn
                clase: 'border table-striped table-hover table-bordered'
            });
            //Escuachamos el evento click del addBtn
            addBtn.addEventListener('click', () => {
                frm.reset();
                titulo.innerHTML = '<span class="text-success">AGREGA UN NUEVO REGISTRO</span>';
                myModal.style.display = 'block';
            });
        }
        //Al terminar de cargar la pagina
        document.addEventListener('DOMContentLoaded', function() {
            LoadMyTabla(); //Ejecutamos la funcion que se encargara de dibujar la tabla
        });
        //Funcion edita por medio de fetch envio el id y traigo los datos
        const edita = (i) => {
            frm.reset();
            FetchAsynAwait('php.php', {
                'id': i
            }).then((ret) => {
                for (let elem in ret) { //recorro el array que recibo
                    let valor = ret[elem]; //aca le saco la data
                    document.querySelectorAll('#frm input').forEach(function(e) { //recorro el form
                        //le indico que si el id de los input son iguales a las llaves del array
                        if (e.id == elem) e.value = valor; //pues le coloque la data a quien corresponda
                    });
                }
                titulo.innerHTML = '<span class="text-primary">EDITA ESTE REGISTRO</span>';
                myModal.style.display = 'block'; //finalmente abro el modal con la data ya pintada
            })
        }
        //Al presionar Save changes
        save.addEventListener('click', (e) => {
            e.preventDefault();
            //------
            //me creo un formdata
            let formData = new FormData(frm);
            let JsonPars = {};
            formData.forEach(function(value, key) {
                JsonPars[key] = value;
            });
            //---
            FetchAsynAwait('php.php', {
                'JsonPars': JsonPars //para luego enviarselo a php
            }, 'text').then((ret) => {
                if (ret.trim() == 'insert') {
                    LoadMyTabla();
                    myModal.style.display = 'none';
                    tshow('success', '¡AGREGADO!', 'Creado con exito nuevo registro.');
                } else if (ret.trim() == 'update') {
                    LoadMyTabla();
                    myModal.style.display = 'none';
                    tshow('info', '¡EDITADO!', 'El registro ha sido modificado.');
                } else {
                    tshow('danger', '¡ERROR!', ret);
                }
            });
        });
        //function para eliminar un registro
        const borra = (i) => {
            let mu = 'Seguro desea eliminar el registro <b>' + i +
                '</b><br><div class=" mt-2 d-flex justify-content-end"><span class="btn btn-light border btn-sm" onclick="SIACEPTO(' +
                i + ');">SI</span></div>';
            tshow('warning', '¡ADVERTENCIA!', mu, 16e3);
        }
        const SIACEPTO = (i) => {
            FetchAsynAwait('php.php', {
                'ID_delete': i
            }, 'text').then((ret) => {
                if (ret.trim() == 'ok') {
                    LoadMyTabla();
                    tshow('success', '¡ELIMINADO!', 'Se ha eliminado el registro.');
                } else {
                    tshow('danger', '¡ERROR!', ret);
                }
            });
        }
        //Escuchando para cerrar el modal
        document.querySelectorAll('.x-close').forEach(function(elem) {
            elem.addEventListener("click", function() {
                myModal.style.display = 'none';
            });
        });
        // function para enviar por POST cumple lo mismo que ajax de jquery
        const FetchAsynAwait = async (pag, dataJson, r = 'json') => {
            const opciones = {
                method: 'POST',
                cache: 'no-cache',
                body: JSON.stringify(dataJson),
                headers: {
                    'Content-Type': 'application/json'
                }
            };
            try {
                const fetchResp = await fetch(pag, opciones);
                const retorna = await r === 'json' ? fetchResp.json() : fetchResp.text();
                return retorna;
            } catch (e) {
                return e;
            }
        }
    </script>
</body>
 
</html>

ahora crea un archivo y llámalo php.php y pega el siguiente código

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
<?php
$servidor = 'localhost';
$user_admin = 'xxxxxxxxxxx'; //tu usuario admin
$user_pass = 'xxxxxxxxxxx'; // tu password de poseerla
$database = 'xxxxxxxxxxx'; // tu base de datos
$bd = new mysqli($servidor, $user_admin, $user_pass, $database, 3306);
$bd->set_charset("utf8");
 
// Aca recibimos lo que fecth envia en una unica variable
$json = json_decode(file_get_contents('php://input'), true);
 
 
if (!empty($json['id'])) { //si enviamos el id ...
  //Pasamos el id para buscar el users especifico
   $qA = "SELECT * from users where id = '" . $json['id'] . "'";
   $rA = $bd->query($qA);
   while ($fA = $rA->fetch_array()) {
      $edit = array(
         'id' => $fA[0],
         'name' => $fA[1],
         'email' => $fA[2],
         'phone' => $fA[3]
      );
   }
   // extraemos su informacion para pasarlo a javascript
   echo json_encode($edit, true); //devolvemos en json
   // y luego lo pintamos en el modal
} else if (!empty($json['JsonPars'])) { //aca enviamos el formdata
   $id = $json['JsonPars']['id'];
   $name = $json['JsonPars']['name'];
   $email = $json['JsonPars']['email'];
   $phone = $json['JsonPars']['phone'];
   if (empty($id)) { //si el id es vacio quiere decir que debemos crear
      $insert = "INSERT INTO users(name,email,phone)
      VALUES('" . $name . "','" . $email . "','" . $phone . "')";
      if (empty($bd->query($insert))) echo 'Error MySql ' . $bd->error;
      else echo 'insert';
      //devolvemos el resultado en text para que ejecutar las notify javascript
   } else {
      //caso contrario editamos el users por medio de su id
      $update = "UPDATE users SET
      name = '" . $name . "',
      email = '" . $email . "',
      phone = '" . $phone . "'
      WHERE id ='" . $id . "'";
      if (empty($bd->query($update))) echo 'Error MySql ' . $bd->error;
      else echo 'update';
      //devolvemos el resultado en text para que ejecutar las notify javascript
   }
   $bd->close();
} else if (!empty($json['ID_delete'])) { //aca enviamos el id solo para eliminar
   $delete = "DELETE FROM users WHERE id = '" . $json['ID_delete'] . "' ";
   if (empty($bd->query($delete))) echo 'Error MySql ' . $bd->error;
   else echo 'ok';
   $bd->close();
} else { // como ninguna de las condiciones anteriores se cumplieron
   //quiere decir que debemos dibujar el datatable
   $qA = "SELECT * from users order by name";
   $rA = $bd->query($qA);
   $tabla = array();
   while ($fA = $rA->fetch_array()) {
      array_push($tabla, array(
         $fA[1],
         $fA[2],
         $fA[3],
         '<div class="d-flex justify-content-center">
         <span onclick="edita(' . $fA[0] . ');"><span><i class="fa-regular fa-pen-to-square fs-5 text-muted" role="button"></i></span></span>
         <span onclick="borra(' . $fA[0] . ');"><span><i class="fa fa-trash fs-5 text-danger ms-3" role="button"></i></span></span>
      </div>'
      ));
   }
   echo json_encode($tabla, true); //devolvemos en json
   // y luego lo pintamos en el datatable
}

Listo ya tienes tu CRUD básico, sencillo y potente

Lee las líneas comentadas para que logres digerir y entender todo.

Saludos
Jeffferson JImenez
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

Boton de formulario en ventana modal de Bootstrap y ajax no funciona

Publicado por Toni (4 intervenciones) el 24/02/2023 21:25:39
Tremendo Jefferson!!! Muchísimas gracias!!!
Está super bien explicado y es muy útil. Ahora me toca ir entendiendo cada paso!!
Què gusto encontrar a personas así!!!
Un saludo!
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