Skip to content

7. Búsqueda y Filtrado de Datos

7.1 Explicación Teórica de la Búsqueda y Filtrado

  • 7.1.1 ¿Qué es la búsqueda y el filtrado de datos?

    • Definición y propósito de la búsqueda y el filtrado en aplicaciones web.
    • ¿Por qué es importante implementar estas funcionalidades?
  • 7.1.2 ¿Cómo afecta la búsqueda y el filtrado al modelo MVC?

    • Modelo: Cómo se modifican las consultas a la base de datos para incorporar la búsqueda y el filtrado.
    • Controlador: Cómo el controlador gestiona las solicitudes de búsqueda y filtrado y las pasa al modelo.
    • Controlador central: Cómo se redirigen las solicitudes de búsqueda y filtrado a los controladores específicos.
    • Vista: Cómo se presentan los resultados de la búsqueda y el filtrado en la interfaz de usuario.

7.2 Implementación de la Búsqueda

  • 7.2.1 Modificación del Modelo para Soportar la Búsqueda
  • Crear una función en el modelo para buscar empleados según un término de búsqueda.

  • 7.2.2 Modificación del Controlador para Gestionar la Búsqueda

  • Modificar el controlador para recibir la búsqueda desde la vista y pasarlo al modelo.

  • 7.2.3 Modificación de la Vista para la Búsqueda

  • Añadir un campo de búsqueda en la vista para que los usuarios puedan ingresar términos de búsqueda.

7.3 Implementación del Filtrado

  • 7.3.1 Filtrar por Departamento
  • Crear filtros para mostrar empleados de un departamento específico.

  • 7.3.2 Filtrar por Fecha de Contratación y Fecha de Nacimiento

  • Implementar filtros que permitan a los usuarios buscar empleados a partir de una fecha de contratación y fecha de nacimiento.

  • 7.3.3 Modificación de la Vista para Filtrar

  • Añadir filtros en el menú de navegación y en la vista para mostrar los resultados filtrados.

---

7.1 Explicación Teórica de la Búsqueda y Filtrado

7.1.1 ¿Qué es la búsqueda y el filtrado de datos?

La búsqueda es el proceso de encontrar registros que coincidan con un término de búsqueda específico. En el contexto de nuestra aplicación, el usuario puede ingresar un término en un campo de búsqueda (por ejemplo, un nombre o apellido), y el sistema debería mostrar solo los registros que coincidan con ese término.

El filtrado, por otro lado, es el proceso de restringir los resultados mostrados según criterios específicos. Por ejemplo:

  • Filtrar por departamento: Mostrar solo empleados de un departamento específico.
  • Filtrar por fechas: Mostrar solo empleados que fueron contratados después de una fecha determinada.

¿Por qué es importante la búsqueda y el filtrado?

  1. Mejora la experiencia de usuario: Permite a los usuarios encontrar rápidamente lo que están buscando, lo que hace que la aplicación sea más útil y eficiente.
  2. Reducción de la carga visual: En lugar de mostrar una lista interminable de registros, la búsqueda y el filtrado permiten mostrar solo los datos relevantes.
  3. Optimización del rendimiento: Filtrar y buscar en la base de datos reduce el número de registros que se tienen que cargar y procesar.

7.1.2 ¿Cómo afecta la búsqueda y el filtrado al modelo MVC?

Modelo:

  • El Modelo debe ser modificado para aceptar criterios de búsqueda y filtrado en las consultas SQL. Esto implica agregar cláusulas WHERE y condiciones dinámicas a las consultas.

Controlador:

  • El Controlador se encarga de recibir las solicitudes de búsqueda y filtrado desde la Vista, y luego pasar esos parámetros al Modelo para que la consulta se ejecute adecuadamente.

Vista:

  • En la Vista, debemos proporcionar campos de entrada para la búsqueda y los filtros. Los usuarios ingresarán los criterios que desean, y la vista mostrará los resultados basados en esos criterios.

Front controller:

  • El Front controller debe ser capaz de manejar las solicitudes de búsqueda y filtrado, redirigiendo a los controladores adecuados y asegurando que los datos se muestren correctamente.

7.2 Implementación de la Búsqueda

7.2.1 Modificación del Modelo para Soportar la Búsqueda

Vamos a modificar el modelo de empleados para que soporte la búsqueda por nombre o apellido.

Código de Empleado.php para la búsqueda:

Empleado.php modificado para búsqueda
<?php
// Incluir el archivo de conexión a la base de datos
<?php
// Incluir el archivo de conexión a la base de datos
include '../bd.php';

class Empleado {
    private $conexion;

    public function __construct() {
        // Obtener la conexión a la base de datos
        $this->conexion = obtenerConexion();
    }

    // Obtener empleados con búsqueda, paginación y ordenación
    public function obtenerEmpleados($pagina = 1, $empleadosPorPagina = 10, $ordenarPor = 'emp_no', $orden = 'ASC', $busqueda = '') {
        // Calcular el offset para la consulta
        $offset = ($pagina - 1) * $empleadosPorPagina;

        // Construir la consulta SQL con búsqueda
        $query = "SELECT * FROM employees WHERE 1";

        // Búsqueda por nombre o apellido
        if (!empty($busqueda)) {
            $query .= " AND (first_name LIKE :busqueda OR last_name LIKE :busqueda)";
        }

        // Ordenar los resultados
        $query .= " ORDER BY $ordenarPor $orden LIMIT :empleadosPorPagina OFFSET :offset";

        // Preparar y ejecutar la consulta
        $stmt = $this->conexion->prepare($query);

        // Asignar los parámetros a la consulta
        $busqueda = "%$busqueda%";  // Convertir a formato LIKE para búsqueda en SQL
        $stmt->bindValue(':busqueda', $busqueda, PDO::PARAM_STR);
        $stmt->bindValue(':empleadosPorPagina', $empleadosPorPagina, PDO::PARAM_INT);
        $stmt->bindValue(':offset', $offset, PDO::PARAM_INT);
        $stmt->execute();

        // Obtener los resultados
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    // Obtener el número total de empleados para la paginación
    public function obtenerTotalEmpleados($busqueda = '') {
        $query = "SELECT COUNT(*) FROM employees WHERE 1";

        // Búsqueda por nombre o apellido
        if (!empty($busqueda)) {
            $query .= " AND (first_name LIKE :busqueda OR last_name LIKE :busqueda)";
        }

        // Preparar y ejecutar la consulta
        $stmt = $this->conexion->prepare($query);
        $busqueda = "%$busqueda%";  // Convertir a formato LIKE para búsqueda en SQL
        $stmt->bindValue(':busqueda', $busqueda, PDO::PARAM_STR);
        $stmt->execute();

        // Devolver el total de empleados
        return $stmt->fetchColumn();
    }
}
?>

Explicación:

  • obtenerEmpleados: Ahora acepta un parámetro adicional, $busqueda, que se utiliza para filtrar los empleados por nombre o apellido. Si se pasa un término de búsqueda, la consulta SQL agrega una condición WHERE que filtra por los campos first_name y last_name.

  • obtenerTotalEmpleados: Esta función devuelve el total de empleados que coinciden con el término de búsqueda, lo cual es necesario para la paginación.


7.2.2 Modificación del Controlador para Gestionar la Búsqueda

Ahora, vamos a modificar el Controlador de Empleados para gestionar las solicitudes de búsqueda y pasarlas al modelo.

Código de EmpleadoControlador.php modificado para la búsqueda:

EmpleadoControlador.php modificado para búsqueda
<?php
// Incluir el modelo
include '../modelo/Empleado.php';

class EmpleadoControlador {
    private $modelo;

    public function __construct() {
        $this->modelo = new Empleado();
    }

    // Ver empleados con búsqueda, paginación y ordenación
    public function verEmpleados($pagina = 1, $busqueda = '', $ordenarPor = 'emp_no', $orden = 'ASC') {
        $empleadosPorPagina = 10;  // Definir cuántos empleados mostrar por página

        // Obtener empleados de la base de datos con búsqueda, paginación y ordenación
        $empleados = $this->modelo->obtenerEmpleados($pagina, $empleadosPorPagina, $ordenarPor, $orden, $busqueda);

        // Obtener el total de empleados para la paginación
        $totalEmpleados = $this->modelo->obtenerTotalEmpleados($busqueda);

        // Calcular el total de páginas
        $totalPaginas = ceil($totalEmpleados / $empleadosPorPagina);

        // Incluir la vista y pasar los datos
        include '../vista/empleados.php';
    }
}
?>

Explicación:

  • El Controlador de Empleados ahora recibe un término de búsqueda desde la vista.
  • El término de búsqueda se pasa al Modelo para que los empleados sean filtrados en base al nombre o apellido.
  • El controlador también calcula el total de empleados y el número total de páginas para la paginación.

7.2.3. Modificaión del controlador central

El Controlador Central es el encargado de gestionar las solicitudes de búsqueda y filtrado y redirigirlas a los controladores correspondientes (en este caso, al Controlador de Empleados).

Vamos a modificar index.php (el Controlador Principal) para gestionar las solicitudes de búsqueda y filtrado, y pasarlas al Controlador de Empleados.

Código de index.php actualizado para gestionar búsqueda y filtrado:

index.php modificado para búsqueda y filtrado
<?php
// Iniciar la sesión
session_start();

// Incluir el controlador principal
include 'controlador/ControladorPrincipal.php';

// Crear una instancia del controlador principal
$controladorPrincipal = new ControladorPrincipal();

// Obtener la acción de la URL (puede ser: ver_empleados, editar_empleado, etc.)
$accion = isset($_GET['accion']) ? $_GET['accion'] : 'inicio';  // Acción predeterminada: inicio

// Obtener los parámetros de búsqueda y paginación
$pagina = isset($_GET['pagina']) ? (int)$_GET['pagina'] : 1;  // Página por defecto: 1
$ordenarPor = isset($_GET['ordenarPor']) ? $_GET['ordenarPor'] : 'emp_no';  // Ordenar por ID por defecto
$orden = isset($_GET['orden']) ? $_GET['orden'] : 'ASC';  // Orden ascendente por defecto
$busqueda = isset($_GET['buscar']) ? $_GET['buscar'] : '';  // Término de búsqueda (vacío por defecto)

// Llamar al método que maneja la solicitud según la acción
$controladorPrincipal->manejarSolicitud($accion, $pagina, $ordenarPor, $orden, $busqueda);
?>

Explicación:

  • Parámetros de búsqueda:

    • $busqueda: Si se pasa un término de búsqueda en la URL (por ejemplo, ?buscar=Juan), se guarda en este parámetro. Si no se pasa, se usa un valor vacío por defecto.
    • Este parámetro se pasa al Controlador Principal para que pueda ser utilizado en la lógica de filtrado.
  • Redirección a la acción correspondiente:

    • Cuando el parámetro accion es ver_empleados, pasamos todos los parámetros al Controlador de Empleados para que gestione la visualización de los empleados según la búsqueda y los filtros.

7.2.4. Modificación de ControladorPrincipal.php para recibir parámetros de búsqueda

Ahora que el Controlador Central pasa la solicitud de búsqueda al controlador adecuado, necesitamos actualizar ControladorPrincipal.php para gestionar las acciones relacionadas con la búsqueda y filtrado de los empleados.

Código de ControladorPrincipal.php actualizado para la búsqueda:

ControladorPrincipal.php modificado para búsqueda
<?php

// Incluir los controladores específicos
include '../controlador/EmpleadoControlador.php';

// Controlador principal que dirige las solicitudes
class ControladorPrincipal {

    // Maneja las solicitudes
    public function manejarSolicitud($accion, $pagina, $ordenarPor, $orden, $busqueda) {
        switch ($accion) {
            case 'inicio':
                // Mostrar la página de inicio (landing)
                include 'index.php';
                break;
            case 'ver_empleados':
                // Mostrar empleados con paginación y búsqueda
                $controlador = new EmpleadoControlador();
                $controlador->verEmpleados($pagina, $busqueda, $ordenarPor, $orden);
                break;
            case 'editar_empleado':
                // Editar empleado
                if (isset($_GET['id'])) {
                    $emp_id = $_GET['id'];
                    $controlador = new EmpleadoControlador();
                    $controlador->verEmpleado($emp_id);
                }
                break;
            case 'agregar_empleado':
                // Agregar empleado
                include '../vista/empleadosForm.php';
                break;
            case 'eliminar_empleado':
                // Eliminar empleado
                if (isset($_GET['id'])) {
                    $emp_id = $_GET['id'];
                    $controlador = new EmpleadoControlador();
                    $controlador->eliminarEmpleado($emp_id);
                }
                break;
            default:
                // Redirigir a la página de inicio si no se encuentra la acción
                header('Location: index.php');
                exit;
        }
    }
}
?>

Explicación:

  • En el Controlador Principal, la acción ver_empleados ahora acepta el parámetro $busqueda y lo pasa al Controlador de Empleados.
  • $pagina, $ordenarPor, $orden y $busqueda son pasados al Controlador de Empleados, que se encargará de manejar la búsqueda y los filtros correctamente.

7.2.5. Modificación de la Vista empleados.php para Búsqueda

  1. Añadir un formulario de búsqueda en la vista para que los usuarios puedan ingresar términos de búsqueda (por nombre o apellido).
  2. Añadir filtros para departamento y fechas.
  3. Mostrar los empleados filtrados y buscados en una tabla.
  4. Integrar la paginación con los filtros y la búsqueda.

1. Código de empleados.php actualizado para la búsqueda:

empleados.php modificado para búsqueda y filtros
<?php
// Iniciar la sesión
session_start();

// Verificar si el usuario está autenticado
if (!isset($_SESSION['usuario'])) {
    header('Location: login.php');  // Redirigir al login si no está autenticado
    exit;
}
?>

<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <title>Empleados</title>
    <style>
        /* Estilos para los botones de ordenación */
        .ordenar {
            cursor: pointer;
            margin-left: 5px;
            font-size: 16px;
        }

        /* Estilos para el formulario de búsqueda y filtros */
        #filtros {
            margin-bottom: 20px;
        }

        #filtros input, #filtros select {
            margin-right: 10px;
        }

        #filtros button {
            padding: 5px 15px;
            background-color: #007BFF;
            color: white;
            border: none;
            cursor: pointer;
        }

        #filtros button:hover {
            background-color: #0056b3;
        }
    </style>
</head>
<body>

    <!-- Menú de navegación -->
    <nav>
        <ul>
            <li><a href="index.php">Inicio</a></li>
            <li><a href="empleados.php">Empleados</a></li>
            <li><a href="departamentos.php">Departamentos</a></li>
            <li><a href="contacto.php">Contacto</a></li>
            <li><a href="logout.php">Cerrar sesión</a></li>
        </ul>
    </nav>

   <!-- Formulario de búsqueda -->
    <section id="filtros">
        <h2>Buscar Empleados</h2>
        <form method="GET" action="index.php">
            <input type="text" name="buscar" placeholder="Buscar por nombre o apellido" value="<?= isset($_GET['buscar']) ? $_GET['buscar'] : '' ?>">
            <button type="submit">Buscar</button>
        </form>
    </section>

    <!-- Contenido de la página de empleados -->
    <section id="empleados">
        <h1>Lista de Empleados</h1>

        <!-- Tabla de empleados -->
        <table>
            <thead>
                <tr>
                    <th><a href="index.php?accion=ver_empleados&ordenarPor=emp_no&orden=ASC" class="ordenar">ID +</a> | 
                        <a href="index.php?accion=ver_empleados&ordenarPor=emp_no&orden=DESC" class="ordenar">ID -</a></th>
                    <th><a href="index.php?accion=ver_empleados&ordenarPor=first_name&orden=ASC" class="ordenar">Nombre +</a> | 
                        <a href="index.php?accion=ver_empleados&ordenarPor=first_name&orden=DESC" class="ordenar">Nombre -</a></th>
                    <th><a href="index.php?accion=ver_empleados&ordenarPor=last_name&orden=ASC" class="ordenar">Apellido +</a> | 
                        <a href="index.php?accion=ver_empleados&ordenarPor=last_name&orden=DESC" class="ordenar">Apellido -</a></th>
                    <th>Fecha de Nacimiento</th>
                    <th>Fecha de Contratación</th>
                    <th>Género</th>
                    <th>Acciones</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($empleados as $empleado): ?>
                <tr>
                    <td><?= $empleado['emp_no'] ?></td>
                    <td><?= $empleado['first_name'] ?></td>
                    <td><?= $empleado['last_name'] ?></td>
                    <td><?= $empleado['birth_date'] ?></td>
                    <td><?= $empleado['hire_date'] ?></td>
                    <td><?= $empleado['gender'] ?></td>
                    <td>
                        <a href="index.php?accion=editar_empleado&id=<?= $empleado['emp_no'] ?>">Editar</a>
                        <a href="index.php?accion=eliminar_empleado&id=<?= $empleado['emp_no'] ?>" onclick="return confirm('¿Estás seguro de eliminar este empleado?')">Eliminar</a>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>

        <!-- Paginación -->
        <div id="paginacion">
            <!-- Ir a la primera página -->
            <a href="index.php?accion=ver_empleados&pagina=1">Primera</a>

            <!-- Ir a la página anterior (si no estamos en la primera) -->
            <?php if ($pagina > 1): ?>
                <a href="index.php?accion=ver_empleados&pagina=<?= $pagina - 1 ?>">Anterior</a>
            <?php endif; ?>

            <!-- Mostrar el número de página actual y total -->
            Página <?= $pagina ?> de <?= $totalPaginas ?>

            <!-- Ir a la página siguiente (si no estamos en la última) -->
            <?php if ($pagina < $totalPaginas): ?>
                <a href="index.php?accion=ver_empleados&pagina=<?= $pagina + 1 ?>">Siguiente</a>
            <?php endif; ?>

            <!-- Ir a la última página -->
            <a href="index.php?accion=ver_empleados&pagina=<?= $totalPaginas ?>">Última</a>
        </div>
    </section>

</body>
</html>

Explicación de los cambios:

  1. Formulario de búsqueda y filtros:

    • El formulario permite al usuario buscar empleados por nombre o apellido, y aplicar filtros como departamento, fecha de contratación y fecha de nacimiento.
    • Los datos del formulario se envían a index.php, que gestiona las solicitudes de búsqueda y filtrado.
  2. Filtros:

    • Se incluyen filtros para departamento y fechas, permitiendo que los usuarios puedan afinar su búsqueda de empleados.
    • Cada campo tiene un valor predeterminado de vacío si no se aplica ningún filtro.
  3. Botones de ordenación:

    • Los enlaces de ordenación por ID, nombre y apellido se encuentran en los encabezados de las columnas. Los signos + y - permiten cambiar el orden entre ascendente y descendente.
  4. Paginación:

    • La paginación sigue funcionando con los enlaces de Primera, Anterior, Siguiente, Última.
    • La paginación se ajusta en función de los empleados filtrados y buscados.