馃搼Creaci贸n de CRUD de Roles con HTML, AJAX, jQuery, JavaScript, Bootstrap y PHP
- Creaci贸n de las carpetas del sistema
- Creaci贸n de tablas (roles y usuarios)
- Creaci贸n de tablas para roles
- Creaci贸n del modal para roles (insertar)
- Creaci贸n del modal para editar los Roles
- Creaci贸n de un modal unificado (insertar/editar) para roles
- Creaci贸n del JS para roles en DataTable
- Creaci贸n de JS para insertar roles
- Creaci贸n del JS para editar los roles
- Creaci贸n del JS para eliminar roles
- Creaci贸n del PHP para los roles
Una buena organizaci贸n desde el inicio es clave para mantener nuestro proyecto ordenado y facilitar el desarrollo.
Estructura de Carpetas Sugerida:
Para este proyecto, te propongo la siguiente estructura de carpetas. Esta es una estructura com煤n y funcional para proyectos web peque帽os y medianos:
mi_proyecto_crud/
├── css/
├── js/
├── php/
├── index.html
└── README.md (opcional)
Visualizaci贸n:
Imagina que abres tu explorador de archivos. Dentro de la carpeta principal que llamaremos mi_proyecto_crud
, crearemos las siguientes subcarpetas y un archivo principal:
mi_proyecto_crud
├── 馃搨 css
├── 馃搨 js
├── 馃搨 php
├── 馃搫 index.html
└── 馃搫 README.md
Explicaci贸n de cada carpeta y archivo:
css/
(Carpeta): Aqu铆 guardaremos todos nuestros archivos de hojas de estilo en cascada (CSS). Utilizaremos Bootstrap para darle estilo a nuestra interfaz, por lo que es probable que tengamos archivos CSS de Bootstrap aqu铆, as铆 como cualquier archivo CSS personalizado que necesitemos para nuestro proyecto.- Ejemplo:
css/bootstrap.min.css
,css/estilos.css
- Ejemplo:
js/
(Carpeta): Esta carpeta contendr谩 todos nuestros archivos de JavaScript. Aqu铆 ir谩n las bibliotecas como jQuery y los scripts que escribamos para manejar la l贸gica de la interfaz de usuario, las peticiones AJAX y la interacci贸n con el servidor.- Ejemplo:
js/jquery-3.7.1.min.js
,js/bootstrap.bundle.min.js
,js/roles.js
- Ejemplo:
php/
(Carpeta): Dentro de esta carpeta almacenaremos todos nuestros archivos PHP. Estos archivos ser谩n los encargados de interactuar con la base de datos, procesar las peticiones del cliente (enviadas mediante AJAX) y devolver las respuestas necesarias.- Ejemplo:
php/conexion.php
,php/roles.php
- Ejemplo:
index.html
(Archivo): Este ser谩 el archivo HTML principal de nuestra aplicaci贸n. Contendr谩 la estructura de la interfaz de usuario para la gesti贸n de roles (y eventualmente usuarios). Aqu铆 incluiremos las referencias a nuestros archivos CSS y JavaScript.README.md
(Opcional): Este es un archivo de texto en formato Markdown que se utiliza com煤nmente para proporcionar informaci贸n sobre el proyecto, como una descripci贸n, instrucciones de instalaci贸n, etc. Es 煤til si planeas compartir tu proyecto o mantener un registro detallado.
C贸digo de ejemplo para index.html
(estructura b谩sica):
Para que nuestra aplicaci贸n funcione correctamente, necesitamos definir la estructura de las tablas que almacenar谩n la informaci贸n de los roles y los usuarios.
Base de Datos:
Asumiremos que est谩s utilizando una base de datos relacional como MySQL (que suele venir con XAMPP). Si est谩s utilizando otra base de datos, la sintaxis puede variar ligeramente, pero los conceptos ser谩n los mismos.
Tabla roles
Esta tabla almacenar谩 la informaci贸n sobre los diferentes roles que pueden tener los usuarios en nuestro sistema (ej: Administrador, Editor, Usuario Registrado, etc.).
Estructura:
Columna | Tipo de Dato | Atributos | Descripci贸n | Ejemplo |
---|---|---|---|---|
idRol |
INT |
AUTO_INCREMENT, PRIMARY KEY |
Identificador 煤nico para cada rol. | 1, 2, 3 |
rol |
VARCHAR(50) |
NOT NULL, UNIQUE |
Nombre del rol. Debe ser 煤nico y no nulo. | Administrador |
C贸digo SQL para crear la tabla roles
:
CREATE TABLE roles (
idRol INT AUTO_INCREMENT PRIMARY KEY,
rol VARCHAR(50) NOT NULL UNIQUE
);
Explicaci贸n del c贸digo:
CREATE TABLE roles
: Indica que vamos a crear una nueva tabla llamadaroles
.idRol INT AUTO_INCREMENT PRIMARY KEY
: Define una columna llamadaidRol
de tipo entero (INT
).AUTO_INCREMENT
: Esto hace que el valor deidRol
se genere autom谩ticamente cada vez que se inserta una nueva fila.PRIMARY KEY
: Esto indica que la columnaidRol
ser谩 la clave primaria de la tabla.
rol VARCHAR(50) NOT NULL UNIQUE
: Define una columna llamadarol
de tipo cadena de caracteres variable (VARCHAR
).NOT NULL
: Esto asegura que esta columna no puede dejarse vac铆a.UNIQUE
: Esto garantiza que no puede haber dos roles con el mismo nombre.
Tabla usuarios
Esta tabla almacenar谩 la informaci贸n de los usuarios de nuestro sistema.
Estructura:
Columna | Tipo de Dato | Atributos | Descripci贸n | Ejemplo | Clave For谩nea | Referencia |
---|---|---|---|---|---|---|
idUsuario |
INT |
AUTO_INCREMENT, PRIMARY KEY |
Identificador 煤nico para cada usuario. | 101, 102, 103 | ||
nombre |
VARCHAR(100) |
NOT NULL |
Nombre completo del usuario. | Juan P茅rez | ||
email |
VARCHAR(100) |
NOT NULL, UNIQUE |
Direcci贸n de correo electr贸nico del usuario. | juan.perez@ejemplo.com | ||
password |
VARCHAR(255) |
NOT NULL |
Contrase帽a del usuario (se recomienda usar hash). | $2y$10$... |
||
idRol |
INT |
NOT NULL |
Identificador del rol al que pertenece el usuario. | 1, 2 | SI | roles(idRol) |
fechaCreacion |
TIMESTAMP |
DEFAULT CURRENT_TIMESTAMP |
Fecha y hora en que se cre贸 el usuario. | 2025-05-18 10:50:00 |
C贸digo SQL para crear la tabla usuarios
:
CREATE TABLE usuarios (
idUsuario INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
idRol INT NOT NULL,
fechaCreacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (idRol) REFERENCES roles(idRol)
);
Explicaci贸n del c贸digo:
CREATE TABLE usuarios
: Indica que vamos a crear una nueva tabla llamadausuarios
.idUsuario INT AUTO_INCREMENT PRIMARY KEY
: Identificador 煤nico para cada usuario.nombre VARCHAR(100) NOT NULL
: Nombre completo del usuario (no puede ser nulo).email VARCHAR(100) NOT NULL UNIQUE
: Direcci贸n de correo electr贸nico (no nula y 煤nica).password VARCHAR(255) NOT NULL
: Contrase帽a del usuario (se recomienda usar hash).idRol INT NOT NULL
: Clave for谩nea que relaciona al usuario con un rol.fechaCreacion TIMESTAMP DEFAULT CURRENT_TIMESTAMP
: Fecha y hora de creaci贸n.FOREIGN KEY (idRol) REFERENCES roles(idRol)
: Define la clave for谩nea que referencia a la tablaroles
.
Implementaci贸n de la tabla din谩mica para mostrar los roles utilizando DataTables
Un DataTable es una forma muy 煤til y din谩mica de mostrar informaci贸n en una tabla en la interfaz de usuario, ofreciendo funcionalidades como paginaci贸n, b煤squeda, ordenamiento y m谩s. Utilizaremos la librer铆a jQuery DataTables para esto.
Requisitos
Para implementar DataTables, necesitamos incluir los archivos CSS y JavaScript de la librer铆a en nuestro archivo index.html
. Aseg煤rate de tener jQuery incluido tambi茅n, ya que DataTables depende de 茅l.
Dentro de la etiqueta <head>
de tu index.html
:
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.7/css/jquery.dataTables.min.css">
Antes de la etiqueta <body>
de tu index.html
:
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.0.js"></script>
<script type="text/javascript" src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js"></script>
Estructura HTML para la tabla de roles en index.html
Dentro del div
con la clase container
en tu index.html
, vamos a a帽adir la estructura b谩sica de la tabla que DataTables convertir谩 en una tabla din谩mica.
<table id="tablaRoles" class="table table-striped table-bordered" style="width:100%">
<thead>
<tr>
<th>ID</th>
<th>Rol</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot>
<tr>
<th>ID</th>
<th>Rol</th>
<th>Acciones</th>
</tr>
</tfoot>
</table>
Explicaci贸n del HTML:
<table id="tablaRoles" class="table table-striped table-bordered" style="width:100%">
: Creamos una tabla HTML con el IDtablaRoles
. Las clasestable
,table-striped
, ytable-bordered
son clases de Bootstrap para darle un estilo b谩sico a la tabla.style="width:100%"
hace que la tabla ocupe todo el ancho de su contenedor.<thead>
: Define la fila de encabezado de la tabla.<th>ID</th>
,<th>Rol</th>
,<th>Acciones</th>
: Son las celdas de encabezado para cada columna. La columna "Acciones" la utilizaremos para los botones de editar y eliminar cada rol.
<tbody>
: Aqu铆 es donde se insertar谩n din谩micamente las filas con los datos de los roles que obtendremos de nuestra base de datos a trav茅s de PHP y AJAX. Inicialmente estar谩 vac铆o.<tfoot>
: Define el pie de la tabla. A menudo se utiliza para mostrar la misma informaci贸n del encabezado o para mostrar res煤menes. En este caso, repetimos las columnas del encabezado.
Inicializaci贸n de DataTables con JavaScript (en js/roles.js
)
Ahora, vamos a escribir el c贸digo JavaScript que se encargar谩 de inicializar DataTables en nuestra tabla cuando la p谩gina se cargue. Aseg煤rate de que este archivo (js/roles.js
) est茅 vinculado correctamente en tu index.html
(como vimos en el ejemplo b谩sico anterior).
$(document).ready(function() {
$('#tablaRoles').DataTable({
"ajax": {
"url": "php/roles.php?accion=1", // La URL del script PHP que devolver谩 los datos de los roles en formato JSON (Case 1: Ver datos)
"dataSrc": "" // Los datos JSON est谩n en la ra铆z de la respuesta
},
"columns": [
{ "data": "idRol" },
{ "data": "rol" },
{
"data": null,
"defaultContent": "<button class='btn btn-sm btn-warning btnEditarRol'>Editar</button> <button class='btn btn-sm btn-danger btnEliminarRol'>Eliminar</button>"
}
],
"language": {
"url": "//cdn.datatables.net/plug-ins/1.10.25/i18n/Spanish.json" // Opcional: para poner DataTables en espa帽ol
}
});
});
Explicaci贸n del JavaScript:
$(document).ready(function() { ... });
: Asegura que el c贸digo dentro se ejecute solo cuando el documento HTML est茅 completamente cargado.$('#tablaRoles').DataTable({ ... });
: Inicializa DataTables en la tabla con el IDtablaRoles
."ajax": { ... }
: Configura la fuente de datos para DataTables mediante una petici贸n AJAX."url": "php/roles.php?accion=1"
: Especifica la URL del archivo PHP (roles.php
) que se encargar谩 de obtener los datos de los roles de la base de datos. Le pasamos un par谩metroaccion=1
para indicar que queremos obtener todos los roles (este "case 1" lo definiremos en nuestro archivophp/roles.php
)."dataSrc": ""
: Indica que los datos JSON que devuelva el script PHP estar谩n directamente en la ra铆z de la respuesta (es decir, un array de objetos).
"columns": [ ... ]
: Define c贸mo se mostrar谩n los datos en cada columna de la tabla.{ "data": "idRol" }
: La primera columna mostrar谩 el valor de la propiedadidRol
de cada objeto en los datos JSON.{ "data": "rol" }
: La segunda columna mostrar谩 el valor de la propiedadrol
.{ "data": null, "defaultContent": "<button class='btn btn-sm btn-warning btnEditarRol'>Editar</button> <button class='btn btn-sm btn-danger btnEliminarRol'>Eliminar</button>" }
: La tercera columna no est谩 directamente ligada a una propiedad espec铆fica de los datos. En su lugar,defaultContent
define el HTML que se mostrar谩 en cada celda de esta columna. Aqu铆 incluimos los botones para "Editar" y "Eliminar" cada rol. Les asignamos clases (btnEditarRol
,btnEliminarRol
) para poder manejar sus eventos con JavaScript posteriormente.
"language": { ... }
: Opcional. Permite configurar el idioma de DataTables (etiquetas, mensajes, etc.). Aqu铆 se carga el archivo de idioma espa帽ol desde un CDN.
Creaci贸n del Modal para Roles (Insertar)
Este modal de Bootstrap se utilizar谩 para crear nuevos roles en nuestro sistema.
Estructura HTML del Modal para Insertar
A continuaci贸n, se presenta la estructura HTML del modal para insertar. Este c贸digo debe ir dentro
del <body>
de tu archivo index.html
, preferiblemente despu茅s de la tabla
de roles.
<!-- Modal para Insertar Roles -->
<div class="modal fade" id="mdlInsertarRol" tabindex="-1" aria-labelledby="insertarRolModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-success text-white">
<h5 class="modal-title" id="insertarRolModalLabel">Nuevo Rol</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="frmInsertarRol">
<div class="mb-3">
<label for="rol" class="form-label">Nombre del Rol:</label>
<input type="text" class="form-control" name="rol" id="rol" placeholder="Escribe el nombre del rol" required>
</div>
</form>
</div>
<div class="modal-footer bg-success">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
<button type="submit" class="btn btn-primary" id="btnGuardarNuevoRol" form="frmInsertarRol">Guardar Rol</button>
</div>
</div>
</div>
</div>
Explicaci贸n del HTML del Modal para Insertar:
- El ID del modal es
mdlInsertarRol
y el del formulario esfrmInsertarRol
. - El encabezado y el pie de p谩gina tienen un fondo verde (`bg-success`).
- No incluye el campo oculto
idRol
, ya que estamos creando un nuevo registro.
Creaci贸n del Modal para Roles (Editar)
Este modal de Bootstrap se utilizar谩 para editar roles existentes en nuestro sistema.
Estructura HTML del Modal para Editar
A continuaci贸n, se presenta la estructura HTML del modal para editar. Este c贸digo debe ir dentro del
<body>
de tu archivo index.html
, preferiblemente despu茅s del modal de
inserci贸n.
<!-- Modal para Editar Roles -->
<div class="modal fade" id="mdlEditarRol" tabindex="-1" aria-labelledby="editarRolModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-warning text-dark">
<h5 class="modal-title" id="editarRolModalLabel">Editar Rol</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="frmEditarRol">
<div class="mb-3">
<label for="idRolEditar" class="form-label">ID del Rol:</label>
<input type="text" class="form-control" name="idRol" id="idRolEditar" readonly>
</div>
<div class="mb-3">
<label for="rolEditar" class="form-label">Nombre del Rol:</label>
<input type="text" class="form-control" name="rol" id="rolEditar" placeholder="Escribe el nuevo nombre del rol" required>
</div>
</form>
</div>
<div class="modal-footer bg-warning">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
<button type="submit" class="btn btn-primary" id="btnActualizarRol" form="frmEditarRol">Actualizar Rol</button>
</div>
</div>
</div>
</div>
Explicaci贸n del HTML del Modal para Editar:
- El ID del modal es
mdlEditarRol
y el del formulario esfrmEditarRol
. - El encabezado y el pie de p谩gina tienen un fondo amarillo (`bg-warning`).
- Incluye un campo de texto para el
idRol
con el atributoreadonly
. - El campo para el nombre del rol tiene el ID
rolEditar
. - El bot贸n de guardar tiene el ID
btnActualizarRol
.
Creaci贸n del Modal Unificado para Roles (Insertar/Editar con ID Readonly)
Este modal unificado de Bootstrap servir谩 tanto para insertar nuevos roles como para editar los
existentes. Incluye un campo idRol
que estar谩 visible y en modo solo lectura durante la
edici贸n.
Estructura HTML del Modal Unificado con ID Readonly
A continuaci贸n, se presenta la estructura HTML del modal unificado. Este c贸digo debe ir dentro del
<body>
de tu archivo index.html
.
<!-- Modal Unificado para Registrar/Editar Roles con ID Readonly -->
<div class="modal fade" id="mdlGestionRolesUnificado" tabindex="-1" aria-labelledby="gestionRolesModalLabelUnificado" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-info text-white">
<h5 class="modal-title" id="gestionRolesModalLabelUnificado">Gesti贸n de Rol</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<form id="frmGestionRolesUnificado">
<div class="mb-3">
<label for="idRolUnificado" class="form-label">ID del Rol:</label>
<input type="text" class="form-control" name="idRol" id="idRolUnificado" readonly>
</div>
<div class="mb-3">
<label for="rolUnificado" class="form-label">Nombre del Rol:</label>
<input type="text" class="form-control" name="rol" id="rolUnificado" placeholder="Escribe el nombre del rol" required>
</div>
</form>
</div>
<div class="modal-footer bg-info">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cerrar</button>
<button type="submit" class="btn btn-primary" id="btnGuardarRolUnificado" form="frmGestionRolesUnificado">Guardar Rol</button>
</div>
</div>
</div>
</div>
Explicaci贸n del HTML del Modal Unificado con ID Readonly:
- El ID del modal es
mdlGestionRolesUnificado
y el del formulario esfrmGestionRolesUnificado
. - Incluye un campo de texto para el
idRol
con el atributoreadonly
, visible tanto en la creaci贸n como en la edici贸n (aunque solo se llenar谩 al editar). - El campo para el nombre del rol tiene el ID
rolUnificado
. - El bot贸n de guardar tiene el ID
btnGuardarRolUnificado
.
Creaci贸n del script JavaScript para el DataTable de Roles
Este script JavaScript se encargar谩 de inicializar la librer铆a DataTables en nuestra tabla de roles y cargar los datos desde el servidor utilizando AJAX. Configuraremos los aspectos b谩sicos para mostrar la informaci贸n de los roles en un formato de tabla interactivo, incluyendo la estructura para las acciones de editar y eliminar.
Inclusi贸n de los CDN necesarios
Para que el DataTable se visualice correctamente, es necesario incluir los siguientes CDN en la secci贸n
<head>
de tu archivo index.html
:
<!-- CDN de DataTables CSS -->
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.7/css/jquery.dataTables.min.css">
Y antes de la etiqueta </body>
, aseg煤rate de tener el CDN de JavaScript necesario:
<!-- CDN de jQuery (necesario para DataTables) -->
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.0.js"></script>
<!-- CDN de DataTables JS -->
<script type="text/javascript" src="https://cdn.datatables.net/1.13.7/js/jquery.dataTables.min.js"></script>
C贸digo JavaScript para inicializar el DataTable
$(document).ready(function() {
var table = $('#tablaRoles').DataTable({
ajax: {
url: "php/roles.php?accion=1", // La URL del script PHP que devuelve los datos (Case 1: Ver datos)
type: "GET", // O "POST" seg煤n tu configuraci贸n en PHP
dataSrc: "" // Los datos JSON est谩n en la ra铆z de la respuesta
},
columns: [{
data: "idRol"
},
{
data: "rol"
},
{
targets: -1, // 脷ltima columna
orderable: false, // No permitir ordenar esta columna
render: function(data, type, full, meta) {
return "<center>" +
"<span class='btnEditarRol text-primary px-1' style='cursor:pointer'>" +
"<i class='fas fa-pencil-alt fs-5'></i>" +
"</span>" +
"<span class='btnEliminarRol text-danger px-1' style='cursor:pointer'>" +
"<i class='fas fa-trash fs-5'></i>" +
"</span>" +
"</center>";
}
}],
language: {
url: "//cdn.datatables.net/plug-ins/1.10.25/i18n/Spanish.json"
}
});
// Los eventos para los botones de Editar y Eliminar se manejar谩n en otros acordeones.
// $('#tablaRoles tbody').on('click', '.btnEditarRol', function() { ... });
// $('#tablaRoles tbody').on('click', '.btnEliminarRol', function() { ... });
});
Explicaci贸n del C贸digo JavaScript del DataTable:
$(document).ready(function() { ... });
: Asegura que el c贸digo se ejecute cuando el DOM est茅 completamente cargado.$('#tablaRoles').DataTable({ ... });
: Inicializa DataTables en la tabla con el IDtablaRoles
.ajax: { ... }
: Configura la fuente de datos AJAX para cargar la informaci贸n de los roles desde el servidor.columns: [...]
: Define las columnas del DataTable.{ data: "idRol" }
: Muestra el ID del rol.{ data: "rol" }
: Muestra el nombre del rol.{ targets: -1, orderable: false, render: function(...) }
: Define la 煤ltima columna para las acciones.targets: -1
: Indica que esta configuraci贸n aplica a la 煤ltima columna.orderable: false
: Evita que esta columna pueda ser ordenada.render: function(...)
: Funci贸n que define el HTML que se mostrar谩 en cada celda de esta columna. El c贸digo HTML generado es:
Este HTML crea dos elementos `<span>` que actuar谩n como botones. Cada uno tiene clases de Bootstrap para el estilo (`text-primary`, `text-danger`, `px-1`) y una clase personalizada (`btnEditarRol`, `btnEliminarRol`) que usaremos en el futuro para capturar los eventos de clic. Dentro de cada `<span>` se incluye un icono de Font Awesome para representar las acciones de editar (`fa-pencil-alt`) y eliminar (`fa-trash`). El estilo `cursor:pointer` hace que el cursor del rat贸n cambie al pasar sobre ellos, indicando que son interactivos. El elemento `<center>` se utiliza para centrar los botones dentro de la celda.<center> <span class='btnEditarRol text-primary px-1' style='cursor:pointer'> <i class='fas fa-pencil-alt fs-5'></i> </span> <span class='btnEliminarRol text-danger px-1' style='cursor:pointer'> <i class='fas fa-trash fs-5'></i> </span> </center>
language: { url: "//cdn.datatables.net/plug-ins/1.10.25/i18n/Spanish.json" }
: Configura el idioma a espa帽ol.- Los comentarios al final del script indican que la l贸gica para los eventos de clic en los botones "Editar" y "Eliminar" se implementar谩 en secciones posteriores (otros acordeones).
C贸digo JavaScript para Insertar Roles
Este script JavaScript se encarga de capturar los datos del formulario de inserci贸n de roles
(frmInsertarRol
) cuando se hace clic en el bot贸n de "Guardar Rol" dentro del modal
mdlInsertarRol
. Es importante recordar que el modal de inserci贸n, tal como lo definimos,
**no incluye el campo `idRol`**, ya que este se generar谩 autom谩ticamente al crear un nuevo registro en
la base de datos. Los datos capturados del formulario (en este caso, solo el nombre del rol) se env铆an
al servidor mediante una petici贸n AJAX.
C贸digo JavaScript para la Inserci贸n de Roles
$(document).ready(function() {
// Evento submit del formulario de inserci贸n de roles
$('#frmInsertarRol').submit(function(event) {
event.preventDefault(); // Evitar la recarga de la p谩gina
// Capturar los datos del formulario
var formData = $(this).serialize();
// Realizar la petici贸n AJAX para insertar el nuevo rol
$.ajax({
url: "php/roles.php?accion=2", // La URL del script PHP para la inserci贸n (Case 2: Insertar)
type: "POST",
data: formData,
dataType: "json", // Esperamos una respuesta JSON del servidor
success: function(response) {
if (response.success) {
$('#mdlInsertarRol').modal('hide'); // Ocultar el modal
$('#tablaRoles').DataTable().ajax.reload(); // Recargar el DataTable
Swal.fire({
icon: 'success',
title: 'Rol Registrado',
text: response.message
});
$('#frmInsertarRol')[0].reset(); // Limpiar el formulario
} else {
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message
});
}
},
error: function(xhr, status, error) {
console.error("Error en la petici贸n AJAX:", error);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Hubo un problema al registrar el rol.'
});
}
});
});
});
Explicaci贸n del C贸digo JavaScript para la Inserci贸n:
$(document).ready(function() { ... });
: Asegura que el c贸digo se ejecute cuando el DOM est茅 completamente cargado.$('#frmInsertarRol').submit(function(event) { ... });
: Asigna un evento al env铆o (submit
) del formulario con el IDfrmInsertarRol
.event.preventDefault();
: Evita la recarga de la p谩gina.var formData = $(this).serialize();
: Captura los datos del formulario (solo el camporol
en este caso, ya que no hayidRol
en el modal de inserci贸n).$.ajax({ ... });
: Realiza una petici贸n AJAX al servidor.url: "php/roles.php?accion=2"
: Especifica la ruta para la inserci贸n.type: "POST"
: M茅todo HTTP para enviar los datos.data: formData
: Los datos del formulario (solo el nombre del rol).dataType: "json"
: Esperamos una respuesta JSON.success: function(response) { ... }
: Maneja la respuesta exitosa del servidor, ocultando el modal, recargando el DataTable, mostrando un mensaje de 茅xito y limpiando el formulario.error: function(xhr, status, error) { ... }
: Maneja los errores en la petici贸n AJAX.
C贸digo JavaScript para Editar Roles
Este script JavaScript se encarga de dos acciones principales relacionadas con la edici贸n de roles:
- Cargar los datos del rol seleccionado en el modal de edici贸n (
mdlEditarRol
) cuando se hace clic en el bot贸n "Editar" del DataTable. - Enviar los datos actualizados del formulario de edici贸n (
frmEditarRol
) al servidor mediante una petici贸n AJAX.
Recuerda que el modal de edici贸n (mdlEditarRol
) contiene un campo idRol
que es
de tipo texto y tiene el atributo readonly
, adem谩s del campo para el nombre del rol.
C贸digo JavaScript para la Edici贸n de Roles
$(document).ready(function() {
var tablaRoles = $('#tablaRoles').DataTable(); // Obtener la instancia del DataTable
// Evento clic en el bot贸n "Editar Rol" del DataTable
$('#tablaRoles tbody').on('click', '.btnEditarRol', function() {
var data = tablaRoles.row($(this).parents('tr')).data();
var idRol = data.idRol;
// Realizar la petici贸n AJAX para obtener los datos del rol a editar
$.ajax({
url: "php/roles.php?accion=3&idRol=" + idRol, // La URL para obtener los datos del rol (Case 3: Obtener datos para editar)
type: "GET",
dataType: "json",
success: function(response) {
if (response) {
$('#idRolEditar').val(response.idRol); // Llenar el campo idRol del modal de edici贸n
$('#rolEditar').val(response.rol); // Llenar el campo nombre del rol del modal de edici贸n
$('#mdlEditarRol').modal('show'); // Mostrar el modal de edici贸n
} else {
Swal.fire({
icon: 'error',
title: 'Error',
text: 'No se pudieron cargar los datos del rol.'
});
}
},
error: function(xhr, status, error) {
console.error("Error en la petici贸n AJAX:", error);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Hubo un problema al cargar los datos del rol.'
});
}
});
});
// Evento submit del formulario de edici贸n de roles
$('#frmEditarRol').submit(function(event) {
event.preventDefault(); // Evitar la recarga de la p谩gina
// Capturar los datos del formulario de edici贸n
var formData = $(this).serialize();
// Realizar la petici贸n AJAX para actualizar el rol
$.ajax({
url: "php/roles.php?accion=4", // La URL del script PHP para la actualizaci贸n (Case 4: Actualizar)
type: "POST",
data: formData,
dataType: "json", // Esperamos una respuesta JSON del servidor
success: function(response) {
if (response.success) {
$('#mdlEditarRol').modal('hide'); // Ocultar el modal de edici贸n
$('#tablaRoles').DataTable().ajax.reload(); // Recargar el DataTable
Swal.fire({
icon: 'success',
title: 'Rol Actualizado',
text: response.message
});
$('#frmEditarRol')[0].reset(); // Limpiar el formulario de edici贸n
} else {
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message
});
}
},
error: function(xhr, status, error) {
console.error("Error en la petici贸n AJAX:", error);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Hubo un problema al actualizar el rol.'
});
}
});
});
});
Explicaci贸n del C贸digo JavaScript para la Edici贸n:
$(document).ready(function() { ... });
: Asegura que el c贸digo se ejecute cuando el DOM est茅 completamente cargado.var tablaRoles = $('#tablaRoles').DataTable();
: Obtiene la instancia del DataTable que ya hemos inicializado.$('#tablaRoles tbody').on('click', '.btnEditarRol', function() { ... });
: Asigna un evento de clic a los botones con la clase.btnEditarRol
que se encuentran dentro del cuerpo de la tabla.var data = tablaRoles.row($(this).parents('tr')).data();
: Obtiene los datos de la fila correspondiente al bot贸n "Editar" que se ha clickeado.var idRol = data.idRol;
: Extrae el ID del rol de los datos de la fila.$.ajax({ ... });
: Realiza una petici贸n AJAX al servidor para obtener los datos del rol espec铆fico que se va a editar.url: "php/roles.php?accion=3&idRol=" + idRol
: La URL del script PHP para obtener los datos (asumimos una acci贸n 3 para esto). Se env铆a elidRol
como par谩metro.type: "GET"
: M茅todo HTTP para la petici贸n.dataType: "json"
: Esperamos una respuesta JSON del servidor con los datos del rol.success: function(response) { ... }
: Si la petici贸n es exitosa y se reciben datos, se llenan los campos del modal de edici贸n (#idRolEditar
y#rolEditar
) con los valores recibidos y se muestra el modal ($('#mdlEditarRol').modal('show');
).error: function(xhr, status, error) { ... }
: Maneja los errores en la petici贸n AJAX.
$('#frmEditarRol').submit(function(event) { ... });
: Asigna un evento al env铆o (submit
) del formulario con el IDfrmEditarRol
(el formulario dentro del modal de edici贸n).event.preventDefault();
: Evita la recarga de la p谩gina.var formData = $(this).serialize();
: Serializa los datos del formulario de edici贸n, que incluir谩n elidRol
(aunque sea `readonly`) y el nuevo nombre del rol.$.ajax({ ... });
: Realiza una petici贸n AJAX al servidor para actualizar el rol.url: "php/roles.php?accion=4"
: La URL del script PHP para la actualizaci贸n (asumimos una acci贸n 4 para esto).type: "POST"
: M茅todo HTTP para enviar los datos actualizados.data: formData
: Los datos del formulario de edici贸n.dataType: "json"
: Esperamos una respuesta JSON del servidor.success: function(response) { ... }
: Si la actualizaci贸n es exitosa, se oculta el modal de edici贸n, se recarga el DataTable, se muestra un mensaje de 茅xito y se limpia el formulario.error: function(xhr, status, error) { ... }
: Maneja los errores en la petici贸n AJAX.
C贸digo JavaScript para Eliminar Roles
Este script JavaScript se encarga de la l贸gica para eliminar un rol existente en el sistema. Al hacer clic en el bot贸n "Eliminar" de una fila del DataTable, se solicitar谩 una confirmaci贸n al usuario antes de enviar una petici贸n AJAX al servidor para eliminar el rol de la base de datos.
C贸digo JavaScript para la Eliminaci贸n de Roles
$(document).ready(function() {
var tablaRoles = $('#tablaRoles').DataTable(); // Obtener la instancia del DataTable
// Evento clic en el bot贸n "Eliminar Rol" del DataTable
$('#tablaRoles tbody').on('click', '.btnEliminarRol', function() {
var data = tablaRoles.row($(this).parents('tr')).data();
var idRol = data.idRol;
// Mostrar una ventana de confirmaci贸n utilizando SweetAlert2
Swal.fire({
title: '¿Est谩s seguro?',
text: "Esta acci贸n eliminar谩 el rol permanentemente.",
icon: 'warning',
showCancelButton: true,
confirmButtonColor: '#d33',
cancelButtonColor: '#3085d6',
confirmButtonText: 'S铆, eliminar',
cancelButtonText: 'Cancelar'
}).then((result) => {
if (result.isConfirmed) {
// Realizar la petici贸n AJAX para eliminar el rol
$.ajax({
url: "php/roles.php?accion=5&idRol=" + idRol, // La URL para eliminar el rol (Case 5: Eliminar)
type: "POST",
dataType: "json",
success: function(response) {
if (response.success) {
$('#tablaRoles').DataTable().ajax.reload(); // Recargar el DataTable
Swal.fire({
icon: 'success',
title: 'Rol Eliminado',
text: response.message
});
} else {
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message
});
}
},
error: function(xhr, status, error) {
console.error("Error en la petici贸n AJAX:", error);
Swal.fire({
icon: 'error',
title: 'Error',
text: 'Hubo un problema al eliminar el rol.'
});
}
});
}
});
});
});
Explicaci贸n del C贸digo JavaScript para la Eliminaci贸n:
$(document).ready(function() { ... });
: Asegura que el c贸digo se ejecute cuando el DOM est茅 completamente cargado.var tablaRoles = $('#tablaRoles').DataTable();
: Obtiene la instancia del DataTable.$('#tablaRoles tbody').on('click', '.btnEliminarRol', function() { ... });
: Asigna un evento de clic a los botones con la clase.btnEliminarRol
dentro del cuerpo de la tabla.var data = tablaRoles.row($(this).parents('tr')).data();
: Obtiene los datos de la fila correspondiente al bot贸n "Eliminar" clickeado.var idRol = data.idRol;
: Extrae el ID del rol que se va a eliminar.Swal.fire({ ... }).then((result) => { ... });
: Utiliza SweetAlert2 para mostrar una ventana de confirmaci贸n al usuario.title: '¿Est谩s seguro?'
,text: "..."
,icon: 'warning'
: Configuran el t铆tulo, el texto y el icono de la ventana de confirmaci贸n.showCancelButton: true
,confirmButtonColor: '#d33'
,cancelButtonColor: '#3085d6'
,confirmButtonText: 'S铆, eliminar'
,cancelButtonText: 'Cancelar'
: Personalizan los botones de confirmaci贸n y cancelaci贸n..then((result) => { ... })
: Esta funci贸n se ejecuta despu茅s de que el usuario interact煤a con la ventana de confirmaci贸n.if (result.isConfirmed) { ... }
: Verifica si el usuario hizo clic en el bot贸n de confirmaci贸n ("S铆, eliminar"). Si es as铆, se procede con la eliminaci贸n mediante AJAX.
$.ajax({ ... });
: Realiza una petici贸n AJAX al servidor para eliminar el rol.url: "php/roles.php?accion=5 & idRol=" + idRol
: La URL del script PHP para la eliminaci贸n (asumimos una acci贸n 5 para esto). Se env铆a elidRol
como par谩metro.type: "POST"
: M茅todo HTTP para la petici贸n de eliminaci贸n.dataType: "json"
: Esperamos una respuesta JSON del servidor.success: function(response) { ... }
: Si la eliminaci贸n es exitosa, se recarga el DataTable y se muestra un mensaje de 茅xito.error: function(xhr, status, error) { ... }
: Maneja los errores en la petici贸n AJAX.
Implementaci贸n del archivo PHP para Roles (php/roles.php
)
Este archivo PHP recibe las peticiones AJAX desde nuestro script JavaScript y utiliza PDO (PHP Data
Objects) para interactuar con la base de datos. Se manejan diferentes acciones basadas en el par谩metro
accion
enviado en la petici贸n, implementando validaciones y devolviendo respuestas en formato
JSON.
Estructura del archivo php/roles.php
<?php
require_once("../../conexion.php"); // Conexi贸n a la base de datos
// print_r($_POST);
// exit;
$accion = isset($_POST['accion']) ? $_POST['accion'] : '';
switch ($accion) {
case '1': // Listar Roles
try {
// Ejecuta el procedimiento almacenado prc_registrosRol
$sql = "SELECT * FROM roles ORDER BY rol ASC";
$stmt = $pdo->query($sql);
$data = array(); // Array para almacenar los datos de los Roles
// Verifica si se obtuvieron resultados
if ($stmt) {
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
// Agrega los datos de cada Rol al array
$data[] = $row;
}
}
// Devuelve los datos en formato JSON
echo json_encode($data);
} catch (PDOException $e) {
// Manejo de errores en caso de una excepci贸n
echo "Error: " . $e->getMessage();
} finally {
// Cierra la conexi贸n (esto se hace autom谩ticamente con PDO al finalizar el script)
$pdo = null;
}
break;
case '2': // Agregar rol
if (isset($_POST['rol'])) {
$rol = $_POST['rol'];
// Verificar si la rol ya existe en la base de datos
$consulta = "SELECT COUNT(*) FROM Roles WHERE rol = :rol";
$stmt = $pdo->prepare($consulta);
$stmt->bindParam(':rol', $rol, PDO::PARAM_STR);
$stmt->execute();
$existeRol = $stmt->fetchColumn();
if ($existeRol > 0) {
// El rol ya est谩 registrada, mostrar mensaje con SweetAlert
echo json_encode(["mensaje" => "El rol ya est谩 registrado."]);
} else {
// El rol no existe, proceder a agregarla
$sql = "INSERT INTO Roles (rol) VALUES (:rol)";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':rol', $rol, PDO::PARAM_STR);
if ($stmt->execute()) {
// Obtener la lista de rols actualizada
$consultaRoles = "SELECT * FROM roles ORDER BY rol";
$stmtRoles = $pdo->prepare($consultaRoles);
$stmtRoles->execute();
$Roles = $stmtRoles->fetchAll(PDO::FETCH_ASSOC);
// Devolver la lista de rols en la respuesta JSON
echo json_encode(["mensaje" => "rol registrada exitosamente", "Roles" => $Roles]);
} else {
echo json_encode(["error" => "Error al registrar la rol: " . $stmt->errorInfo()[2]]);
}
}
} else {
echo json_encode(["error" => "Datos incompletos para registrar la rol."]);
}
break;
case '3': // Editar Rol
// Verifica si se ha proporcionado un ID v谩lido en la solicitud
if (isset($_POST['idRol'])) {
$idDelRol = $_POST['idRol'];
// Realiza la consulta SQL para obtener los datos del Rol seg煤n el ID
$sql = "SELECT * FROM Roles WHERE idRol = ?";
$stmt = $pdo->prepare($sql);
$stmt->execute([$idDelRol]);
// Obtiene los datos del Rol
$Rol = $stmt->fetch(PDO::FETCH_ASSOC);
// Verifica si se encontraron datos
if ($Rol) {
// Formatea los datos en formato JSON y los env铆a como respuesta
echo json_encode($Rol);
} else {
// Si no se encontraron datos, puedes enviar un mensaje de error
echo json_encode(array('error' => 'No se encontraron datos para el ID proporcionado.'));
}
} else {
// Si no se proporcion贸 un ID v谩lido, puedes enviar un mensaje de error
echo json_encode(array('error' => 'ID de Rol no v谩lido.'));
}
break;
case '4': // Actualizar usuario
// Verifica si se han proporcionado los datos necesarios para la actualizaci贸n
if (isset($_POST['idRol'], $_POST['rol'])) {
// Obt茅n los datos enviados desde el cliente
$idRol = $_POST['idRol'];
$rol = $_POST['rol'];
// Realiza una consulta para verificar si el Rol ya existe
$sqlVerificarExistencia = "SELECT COUNT(*) FROM Roles WHERE rol = ? AND idRol <> ?";
$stmtVerificarExistencia = $pdo->prepare($sqlVerificarExistencia);
$stmtVerificarExistencia->execute([$rol, $idRol]);
$existeRol = (int) $stmtVerificarExistencia->fetchColumn();
if ($existeRol > 0) {
// El Rol ya existe, devuelve un mensaje de advertencia
echo json_encode(["error" => "El Rol ya est谩 registrado."]);
} else {
// El Rol no existe, procede con la actualizaci贸n
// Actualiza la Rol sin cambiar la imagen
$sqlActualizarRol = "UPDATE roles SET rol = ? WHERE idRol = ?";
$stmtActualizarRol = $pdo->prepare($sqlActualizarRol);
if ($stmtActualizarRol->execute([$rol, $idRol])) {
echo json_encode(["mensaje" => "Rol actualizada exitosamente."]);
} else {
echo json_encode(["error" => "Error al actualizar la Rol: " . $stmtActualizarRol->errorInfo()[2]]);
}
}
} else {
echo json_encode(["error" => "Datos incompletos para actualizar la Rol."]);
}
break;
case '5': // Eliminar rol
if (isset($_POST['idRol'])) {
$idRol = $_POST['idRol'];
// Realizar la eliminaci贸n del rol en la base de datos
$sql = "DELETE FROM roles WHERE idRol = :idRol";
$stmt = $pdo->prepare($sql);
$stmt->bindParam(':idRol', $idRol, PDO::PARAM_INT);
if ($stmt->execute()) {
echo json_encode(["success" => true, "message" => "El rol se elimin贸 correctamente."]);
} else {
echo json_encode(["success" => false, "message" => "Error al eliminar el rol."]);
}
} else {
echo json_encode(["success" => false, "message" => "Datos incompletos para eliminar el rol."]);
}
break;
case '10':
try {
// Realiza la consulta para obtener las categor铆as
$sql = "SELECT * FROM roles ORDER BY rol ASC";
$stmt = $pdo->prepare($sql);
$stmt->execute();
// Obtiene los resultados en un array asociativo
$response = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Devuelve los resultados como JSON al cliente
header('Content-Type: application/json');
echo json_encode($response);
} catch (PDOException $e) {
error_log('Error en rol.php: ' . $e->getMessage());
error_log('N煤mero de error: ' . $e->getCode());
error_log('Archivo: ' . $e->getFile());
error_log('L铆nea: ' . $e->getLine());
http_response_code(500); // Establece el c贸digo de respuesta a 500 (Internal Server Error)
echo 'Error interno del servidor';
}
break;
default:
echo "Acci贸n no v谩lida";
}
Explicaci贸n del C贸digo PHP:
require_once("../../conexion.php");
: Incluye el archivo que contiene la conexi贸n a la base de datos utilizando PDO. La ruta../../conexion.php
sugiere que el archivo de conexi贸n est谩 dos niveles arriba del directorio actual.$accion = $_POST['accion'] ?? '';
: Obtiene el valor del par谩metroaccion
enviado porPOST
desde JavaScript, utilizando el operador null coalesce para asignar un valor predeterminado en caso de que no est茅 definido.switch ($accion) { ... }
: Estructura de control que ejecuta diferentes bloques de c贸digo seg煤n el valor de$accion
.- Case '1': Listar Roles
$sql = "SELECT * FROM roles ORDER BY rol ASC";
: Consulta SQL para seleccionar todos los roles ordenados alfab茅ticamente.- Se utiliza PDO para ejecutar la consulta y obtener los resultados como un array asociativo en
$data
. echo json_encode($data);
: Devuelve los datos de los roles en formato JSON.- Se incluye un bloque
try...catch
para manejar posibles errores de la base de datos.
- Case '2': Agregar rol
- Se verifica si se recibi贸 el par谩metro
rol
porPOST
. - Se realiza una consulta para verificar si el rol ya existe en la base de datos antes de insertarlo.
- Si el rol no existe, se ejecuta la inserci贸n utilizando una consulta preparada para prevenir inyecci贸n SQL.
- En caso de 茅xito, se obtiene la lista actualizada de roles y se devuelve en formato JSON junto con un mensaje.
- Se manejan errores en caso de problemas con la inserci贸n o datos incompletos.
- Se verifica si se recibi贸 el par谩metro
- Case '3': Editar Rol (obtener datos)
- Se verifica si se recibi贸 el
idRol
porPOST
. - Se realiza una consulta preparada para seleccionar los datos del rol con el ID proporcionado.
- Los datos del rol se devuelven en formato JSON si se encuentran, o un mensaje de error si no.
- Se verifica si se recibi贸 el
- Case '4': Actualizar rol
- Se verifica si se recibieron
idRol
yrol
porPOST
. - Se verifica si el nuevo nombre del rol ya existe para otro ID de rol.
- Se realiza la actualizaci贸n utilizando una consulta preparada.
- Se devuelve un mensaje de 茅xito o error en formato JSON.
- Se verifica si se recibieron
- Case '5': Eliminar rol
- Se verifica si se recibi贸 el
idRol
porPOST
. - Se realiza la eliminaci贸n utilizando una consulta preparada.
- Se devuelve un mensaje de 茅xito o error en formato JSON.
- Se verifica si se recibi贸 el
- Case '10': Listar Roles (duplicado)
- Similar al caso '1', pero utiliza
prepare
yexecute
. Se devuelve la lista de roles en JSON. Tambi茅n incluye manejo de errores y configuraci贸n del encabezadoContent-Type
.
- Similar al caso '1', pero utiliza
default: ...
: Maneja cualquier valor deaccion
no reconocido, devolviendo un mensaje de error.- La conexi贸n a la base de datos se cierra autom谩ticamente al finalizar el script con PDO.
Importante: Este c贸digo PHP utiliza PDO para interactuar con la base de datos de forma segura mediante consultas preparadas, lo que ayuda a prevenir ataques de inyecci贸n SQL. Tambi茅n incluye validaciones para la inserci贸n y actualizaci贸n de roles, verificando si el nombre del rol ya existe.
0 Comentarios
Si desea contactar comigo, lo puede hacer atravez deste formulario gracias