El algoritmo implementado para permitir agregar, borrar y modificar datos de clientes es exactamente igual que el de categorías.
De forma similar hemos creado una subcarpeta llamada 'clientes' donde almacenamos los dos archivos: 'administración.html' y 'procesar.php':
<!doctype html> <html> <head> <title>Administración de clientes</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <link rel="stylesheet" href="../css/bootstrap.min.css"> <script src="../js/jquery.min.js"></script> <script src="../js/popper.min.js"></script> <script src="../js/bootstrap.min.js"></script> </head> <body> <div class="container"> <h1>Administracion de Clientes</h1> <table class="table table-striped"> <thead> <tr> <th>Código</th> <th>Nombre</th> <th>Direccion</th> <th>Telefono</th> <th>Mail</th> <th>Edición</th> </tr> </thead> <tbody id="datos"> </tbody> </table> <button type="button" id="btnAgregar" class="btn btn-success">Agregar</button> <hr> <button type="button" id="btnFinalizar" class="btn btn-success">Finalizar</button> </div> <div class="modal fade" id="ModalEditar" tabindex="-1" role="dialog"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="false">×</span> </button> </div> <div class="modal-body"> <input type="hidden" id="Codigo" name="Codigo"> <div class="form-row"> <div class="form-group col-md-12"> <label>Nombre:</label> <input type="text" id="Nombre" class="form-control" placeholder=""> </div> </div> <div class="form-row"> <div class="form-group col-md-12"> <label>Direccion:</label> <input type="text" id="Direccion" class="form-control" placeholder=""> </div> </div> <div class="form-row"> <div class="form-group col-md-12"> <label>Telefono:</label> <input type="text" id="Telefono" class="form-control" placeholder=""> </div> </div> <div class="form-row"> <div class="form-group col-md-12"> <label>Mail:</label> <input type="text" id="Mail" class="form-control" placeholder=""> </div> </div> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarAgregar" class="btn btn-success">Agregar</button> <button type="button" id="btnModificar" class="btn btn-success">Modificar</button> <button type="button" id="btnBorrar" class="btn btn-success">Borrar</button> <button type="button" data-dismiss="modal" class="btn btn-success">Cancelar</button> </div> </div> </div> </div> <!-- ModalConfirmarCancelar --> <div class="modal fade" id="ModalConfirmarBorrar" tabindex="-1" role="dialog"> <div class="modal-dialog" style="max-width: 600px" role="document"> <div class="modal-content"> <div class="modal-header"> <h1>Realmente quiere borrarlo?</h1> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> <div class="modal-footer"> <button type="button" id="btnConfirmarBorrado" class="btn btn-success">Confirmar</button> <button type="button" data-dismiss="modal" class="btn btn-success">Cancelar</button> </div> </div> </div> </div> <script> document.addEventListener("DOMContentLoaded", function () { var cliente; MostrarClientes(); //Boton que vuelve a la página principal $('#btnFinalizar').click(function () { window.location = '../index.php'; }); //Boton que muestra el diálogo de agregar $('#btnAgregar').click(function () { LimpiarFormulario(); $('#btnConfirmarAgregar').show(); $('#btnModificar').hide(); $('#btnBorrar').hide(); $("#ModalEditar").modal(); }); $('#btnConfirmarAgregar').click(function () { RecolectarDatosFormulario(); if (!EntradaFormularioCorrecto()) return; $("#ModalEditar").modal('hide'); EnviarInformacion("agregar"); }); $('#btnBorrar').click(function () { $("#ModalEditar").modal('hide'); $("#ModalConfirmarBorrar").modal(); }); $('#btnConfirmarBorrado').click(function () { $("#ModalConfirmarBorrar").modal('hide'); RecolectarDatosFormulario(); $("#ModalEditar").modal('hide'); EnviarInformacion("borrar"); }); $('#btnModificar').click(function () { RecolectarDatosFormulario(); if (!EntradaFormularioCorrecto()) return; $("#ModalEditar").modal('hide'); EnviarInformacion("modificar"); }); //******************************************************* function MostrarClientes() { $.ajax({ type: 'GET', url: 'procesar.php?accion=listar', success: function (clientes) { let filas = ''; for (let cliente of clientes) { filas += '<tr><td>' + cliente.codigo + '</td><td>' + cliente.nombre + '</td><td>' + cliente.telefono + '</td><td>' + cliente.mail + '</td><td>' + cliente.direccion + '</td>'; filas += '<td><a class="btn btn-primary botoneditar" role="button" href="#" data-codigo="' + cliente.codigo + '">Edita?</a> </td></tr>'; } $('#datos').html(filas); //Boton que muestra el diálogo de modificar y borrar $('.botoneditar').click(function () { $('#Codigo').val($(this).get(0).dataset.codigo); RecolectarDatosFormulario(); RecuperarCliente("recuperar"); $('#btnConfirmarAgregar').prop("disabled", true); $('#btnConfirmarAgregar').hide(); $('#btnModificar').show(); $('#btnBorrar').show(); $("#ModalEditar").modal(); }); }, error: function () { alert("Hay un error .."); } }); } //Funciones AJAX para enviar y recuperar datos del servidor //******************************************************* function EnviarInformacion(accion) { $.ajax({ type: 'POST', url: 'procesar.php?accion=' + accion, data: cliente, success: function (msg) { MostrarClientes(); }, error: function () { alert("Hay un error .."); } }); } function RecuperarCliente(accion) { $.ajax({ type: 'POST', url: 'procesar.php?accion=' + accion, data: cliente, success: function (datos) { $('#Nombre').val(datos[0]['nombre']); $('#Telefono').val(datos[0]['telefono']); $('#Mail').val(datos[0]['mail']); $('#Direccion').val(datos[0]['direccion']); }, error: function () { alert("Hay un error si.."); } }); } //******************************************************* function RecolectarDatosFormulario() { cliente = { codigo: $('#Codigo').val(), nombre: $('#Nombre').val(), mail: $('#Mail').val(), direccion: $('#Direccion').val(), telefono: $('#Telefono').val() }; } function LimpiarFormulario() { $('#Codigo').val(''); $('#Nombre').val(''); $('#Telefono').val(''); $('#Mail').val(''); $('#Direccion').val(''); } function EntradaFormularioCorrecto() { if (cliente['nombre'] == '') { alert("No Puede estar vacío el nombre"); return false; } return true; } }); </script> </body> </html>
El segundo archivo que tenemos en la carpeta 'clientes':
procesar.php<?php header('Content-Type: application/json'); require("../conexion.php"); $conexion = retornarConexion(); switch ($_GET['accion']) { case 'listar': $respuesta = mysqli_query($conexion, "select codigo, nombre, telefono, mail, direccion from clientes"); $resultado = mysqli_fetch_all($respuesta, MYSQLI_ASSOC); echo json_encode($resultado); break; case 'agregar': $respuesta = mysqli_query($conexion, "insert into clientes(nombre,telefono,mail,direccion) values ('$_POST[nombre]','$_POST[telefono]','$_POST[mail]','$_POST[direccion]')"); echo json_encode($respuesta); break; case 'recuperar': $respuesta = mysqli_query($conexion, "select codigo, nombre,telefono,mail,direccion from clientes where codigo=$_POST[codigo]"); $resultado = mysqli_fetch_all($respuesta, MYSQLI_ASSOC); echo json_encode($resultado); break; case 'borrar': $respuesta = mysqli_query($conexion, "delete from clientes where codigo=".$_POST['codigo']); echo json_encode($respuesta); break; case 'modificar': $respuesta = mysqli_query($conexion, "update clientes set nombre='$_POST[nombre]', telefono='$_POST[telefono]', mail='$_POST[mail]', direccion='$_POST[direccion]' where codigo=$_POST[codigo]"); echo json_encode($respuesta); break; } ?>
La ejecución de la página nos genera una interfaz visual similar a:
Con un diálogo que se muestra cuando presionamos el botón de "Agregar":
o "Editar":
Los algoritmos podemos analizar que son iguales que en el concepto anterior de la tabla 'categorias'.