1

Estoy experimentando un caso... Tengo un index, y por medio de un ajax, hace una consulta en el archivo consulta.php. este me devuelve una tabla y lo imprime en un div que esta en index.

El problema consulta.php tiene include_once a detalle_vac.php, que este me da una lista tipo acordion de datos del id, sin embargo, esa lista le quiero hacer un filtro, el filtro hace que el año se pase por la url, pero se manda a index,(ejemplo, index.php?year=2025), pero al final el detalle_vac, no me devuelve los datos del año que se paso por la url, yo dudo por que es por varios archivos y al final actualiza a index y solo le pasa el año, como le puedo hacer solo para actualizar esa parte del código y no todo.

Aqui un poco de contexto.

    <?php
        session_start();
    ?>

 <!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
<body class="fondo" >
        <center><h1 class="orange">Control de Vacaciones de Empleados RT</h1></center>


    <div class="container filtro">
        <!-- Formulario Busqueda Empleado -->
        <form id="searchForm" method="POST" >
            <label for="employeeNumber" class="negritas">Número de Empleado:</label> <br><br>
            <input type="number" id="employeeNumber" name="employeeNumber" placeholder="Ingrese el número de empleado" autocomplete="off">
            <input type="submit" value="Buscar" id="btnBuscar">
        </form>
    <!-- </div> -->

        <!-- DIV PARA MOSTRAR TABLA CON INFO DEL EMPLEADO -->
        <div id="searchResults" class="">
        </div>

    <!-- Scripts -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>


    <!-- Scripts para hacer funcional la busqueda -->
  <script src="CSS_JS_LIB/jquery/jquery.min.js"></script>
  <script type="text/javascript" src="CSS_JS_LIB/main.js"></script>        <!-- Scripts donde se manda el id, y en el archivo se hace el ajax -->

    <!-- JS de Bootstrap (opcional, pero necesario para algunas funcionalidades) -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>
</body>
</html>

main.js

function buscar_datos(idEmpleado) {

    // Almacenar el ID del empleado en el almacenamiento local
    localStorage.setItem('lastSelectedEmployee', idEmpleado);
    
    // Ocultar la tabla de empleados
    document.getElementById('tablaEmpleados').style.display = 'none';

    $.ajax({
        type: 'POST',
        url: 'consulta.php',
        data: { idEmpleado: idEmpleado }, // Aquí pasamos el ID del empleado correctamente
        success: function (respuesta) {
            if (respuesta.trim() === "") {
                resultado.innerHTML = "<p>No se encontró ningún empleado con el ID proporcionado.</p>";
            } else {
                resultado.innerHTML = respuesta;
            }
        },`introducir el código aquí`
        error: function () {
            resultado.innerHTML = "<p>Ocurrió un error al buscar el empleado. Por favor, inténtelo de nuevo más tarde.</p>";
        }
    });
}
</script>

me manda a consulta.php

<?php
include_once "Conexiones/databaseSQL.php";

$salida = "";

    <table id='customers'>
      <thead>
        <tr>
          <th rowspan='2'>N°</th>
          <th rowspan='2'>Nombres</th>
          <th colspan='2'>Apellidos</th>
          <th rowspan='2'>Área</th>
          <th rowspan='2'>Puesto</th>
          <th rowspan='2'>Sucursal</th>
          <th rowspan='2'>Fecha Alta</th>
          <th colspan='2'>Antigüedad</th>
          <th colspan='2'>Vacaciones</th>
        </tr>
        <tr>
          <th>Paterno</th>
          <th>Materno</th>
          <th>Años</th>
          <th>Meses</th>
          <th>Otorgados</th>
          <th>Pendientes</th>
        </tr>
      </thead>
      <tbody>";

    while ($row = sqlsrv_fetch_array($res)) {

        //obtener el id_empleado
        $id_emp = $row['Personal']; 
           $salida .= "
      <tr>
      
      echo "<br>
        <div class='formt'>
          <a href='ReportePorEmpleadoRT.php?id=" . $row['Personal'] . "' class='btnRep' target='_blank'>
            <i class='fa-solid fa-file-pdf'></i>&nbsp;&nbsp;&nbsp;Generar Reporte
          </a>
          <a href='#' class='btnSv btn btn-primary' data-bs-toggle='modal' data-bs-target='#modalVacaciones' data-id='" . $row['Personal'] . "' data-vacaciones='" . $row['Vacaciones'] . "'>Solicitar Vacaciones</a>
        </div> <br>
        <h5>En el sistema existen los siguientes registros de acuerdo al dato ingresado:</h5>";
    }
    $salida .= "</tbody>
    </table><br>";

    echo $salida;

    // INCLUDE de detalle vac el que quiero actualizar 
    include('detalle_vac.php');
  } else {
    $salida .= "<br><h3>NO HAY DATOS POR MOSTRAR<br> N° DE EMPLEADO NO ESTÁ DE ALTA</h3><br><br><br><br><br><br>";
    echo $salida;
  }
}

sqlsrv_close($connx);
?>

detalle_vac.php quiero hacer el filtro pero no funciona

<!DOCTYPE html>
<html lang="es">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
 <body>
  <br>
  <h3>Historial de Vacaciones</h3>

  <!-- Formulario de selección de año -->
  <form id="filterForm" class="css-form" action="index.php" method="GET">
    <label for="year" class="form-label">Seleccionar Año:</label>
    <select name="year" id="year" class="form-select">
      <?php
        include_once("Conexiones/database.php"); // Incluir archivo de conexión
        // Obtener el año seleccionado del parámetro en la URL o el año actual
        $selected_year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');

        // Obtener años únicos de las vacaciones
        $query_years = "SELECT DISTINCT YEAR(fa_inicio) AS anio FROM v_solicitud WHERE id_emp = $id_emp AND estado != 5 ORDER BY anio DESC";
        $result_years = mysqli_query($conn, $query_years);

        while ($row_years = mysqli_fetch_assoc($result_years)) {
            $anio = $row_years['anio'];
            $selected = ($anio == $selected_year) ? "selected" : "";
            echo "<option value=\"$anio\" $selected>$anio</option>";
        }
      ?>
    </select>
    <button type="submit" class="form-button">Filtrar</button>
  </form>

  <br>

  <!-- Contenedor de acordeones -->
  <div id="accordionContainer" class="accordion" id="accordionPanelsStayOpenExample">
    <?php
      include_once("Conexiones/database.php"); // Incluir archivo de conexión
      
      // Obtener el año seleccionado del parámetro en la URL o el año actual
      $selected_year = isset($_GET['year']) ? intval($_GET['year']) : date('Y');

      // Consulta SQL para filtrar por año
      $query = "SELECT estado, id, GROUP_CONCAT(CONCAT(fa_inicio, '_', fa_final, '_', t_dias) SEPARATOR '|') AS info_vacaciones, SUM(t_dias) AS sum_tdias
                FROM v_solicitud 
                WHERE id_emp = $id_emp AND estado != 5 AND YEAR(fa_inicio) = $selected_year
                GROUP BY estado, id";

      $result = mysqli_query($conn, $query);
      $grouped_periods = array();

      while ($row = mysqli_fetch_assoc($result)) {
        $estatus = $row['estado'];
        $id_soli = $row['id'];
        $total_dias = $row['sum_tdias'];
        $info_vacaciones = explode('|', $row['info_vacaciones']);

        foreach ($info_vacaciones as $info) {
          $vacation_data = explode('_', $info);
          $start_date = date('Y-m-d', strtotime($vacation_data[0]));
          $end_date = date('Y-m-d', strtotime($vacation_data[1]));
          $total_days = $vacation_data[2];
          $start_month = $month_names[date('F', strtotime($start_date))];
          $end_month = $month_names[date('F', strtotime($end_date))];
          $subtitle = ($start_month != $end_month) ? "$start_month-$end_month" : $start_month;
          $grouped_periods[$estatus][$subtitle][] = array(
              'id_soli' => $id_soli,
              'start_date' => $start_date,
              'end_date' => $end_date,
              'total_days' => $total_days
          );
        }
      }
    ?>

    <!-- Mostrar resultados -->
    <?php
    foreach ($grouped_periods as $estatus => $subtitles) {
    ?>
      <div class="accordion-item">
        <h2 class="accordion-header" id="heading<?php echo $estatus; ?>">
          <button class="accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-toggle="collapse" data-bs-target="#collapse<?php echo $estatus; ?>" aria-expanded="true" aria-controls="collapse<?php echo $estatus; ?>">
            <?php
            if ($estatus == 1) {
              echo "Vacaciones Disfrutadas";
            } elseif ($estatus == 2) {
              echo "Vacaciones Aprobadas";
            } elseif ($estatus == 3) {
              echo "Vacaciones Solicitadas";
            } elseif ($estatus == 4) {
              echo "Vacaciones No Autorizadas";
            }
            ?>
          </button>
        </h2>
        <div id="collapse<?php echo $estatus; ?>" class="accordion-collapse collapse" aria-labelledby="heading<?php echo $estatus; ?>">
          <div class="accordion-body">
            <?php
            foreach ($subtitles as $subtitle => $periods) {
              foreach ($periods as $period) {
                $id_soli = $period['id_soli'];
                $start_date = $period['start_date'];
                $end_date = $period['end_date'];
                $total_days = $period['total_days'];
            ?>
              <div class="general">
                <div class="formiz">
                  <h5><?php echo $subtitle; ?></h5>
                  <p class="formb2"><strong class="orange2">N°:</strong> <input type="number" value="<?php echo $id_soli; ?>" readonly></p>
                  <p class="formb2"><strong class="orange2">Fecha de inicio:</strong> <input type="date" value="<?php echo $start_date; ?>" readonly></p>
                  <p class="formb2"><strong class="orange2">Fecha de fin:</strong> <input type="date" value="<?php echo $end_date; ?>" readonly></p>
                  <p class="formb2"><strong class="orange2">Total de días:</strong> <?php echo $total_days; ?></p>
                </div>
                <?php
                if ($estatus != 1 && $estatus != 4) {
                ?>
                  <div class="formder">
                    <form class="formselect" action="update_status.php" method="POST">
                      <strong class="orange2">Cambiar Estatus:</strong>
                      <div class="formb">
                        <select name="estatus">
                          <option value="">Seleccionar Estatus</option>
                          <?php
                          if ($estatus == 2) {
                            echo '<option value="1">Vacaciones Disfrutadas</option>';
                          } elseif ($estatus == 3) {
                            echo '<option value="2">Vacaciones Aprobadas</option>';
                            echo '<option value="4">Vacaciones No Autorizadas</option>';
                          }
                          ?>
                        </select>
                        <input type="hidden" name="id_emp" value="<?php echo $id_emp; ?>">
                        <input type="hidden" name="id_soli" value="<?php echo $id_soli; ?>">
                        <button class="btnok" type="submit">Aceptar</button>
                      </div>
                    </form>
                    <br><br><br>
                    <?php
                    if ($estatus == 3) {
                    ?>
                      <form class="alinear" action="delete_periodo.php" method="POST" style="display:inline;">
                        <input type="hidden" name="id_soli" value="<?php echo $id_soli; ?>">
                        <button type="submit" class="btn btn-danger btn-sm eliminar-periodo">Eliminar</button>
                      </form>
                    <?php
                    }
                    ?>
                  </div>
                <?php
                } elseif ($estatus == 4) { // Solo mostrar el botón de eliminar para "Vacaciones No Autorizadas"
                ?>
                  <div class="formder">
                    <form class="alinear" action="delete_periodo.php" method="POST" style="display:inline;">
                      <input type="hidden" name="id_soli" value="<?php echo $id_soli; ?>">
                      <button type="submit" class="btn btn-danger btn-sm eliminar-periodo">Eliminar</button>
                    </form>
                  </div>
                <?php
                }
                ?>
              </div>
              <hr>
            <?php
              } // Fin foreach $periods
            } // Fin foreach $subtitles
            ?>
          </div>
        </div>
      </div>
    <?php
    } // Fin foreach $grouped_periods
    mysqli_free_result($result);

</body>
</html>
4
  • Hola, por favor provee un poco del código que utilizas en tus archivos .php para ayudarte de una mejor manera y entender la estructura de las peticiones Commented el 19 jun. a las 16:37
  • si, le acabo de agregar el código más esencial
    – ccands
    Commented el 19 jun. a las 17:13
  • ¿En realidad hace falta tanto código para exponer el problema? Sugiero que en la pregunta publiques un ejemplo mínimo verificable, que suele funcionar mucho mejor.
    – jachguate
    Commented el 19 jun. a las 21:59
  • Cuando llamas a consulta.php, agrega el año tambien en las variables pasadas, y luego en el consulta.php interpreta esa variable POST y la asignas a $_GET['year'] antes de llamar al detalle_vac.php para que le llegue correctamente el valor, pues al mandárselo por ajax y POST, no pilla el $_GET esperado a menos que hagas este truquillo marrano. Hay otras formas, pero con eso sales del paso seguramente.
    – masterguru
    Commented el 19 jun. a las 22:17

1 respuesta 1

2

Para comenzar, diría que hay un mal diseño, si un script está requiriendo que una variable sea pasada vía GET y luego ese script es utilizado en un POST.

Para resolver sin hacer mayores cambios, por suerte, PHP tiene también la variable superglobal $_REQUEST, que combina el contenido de $_GET, $_POST y $_COOKIE.

Así, puedes resolver fácilmente tu problema haciendo estos cambios:

  • En detalle_vac.php, cambiar las apariciones de $_GET['year'] por $_REQUEST['year']. Esto hará que el script siga funcionando donde se pasa el parámetro year como parte de un GET y hará que ahora funcione cuando se pasa en un POST.
  • En main.js pasa el valor del año en la llamada ajax, por ejemplo, suponiendo que lo tienes almacenado en una variable year:
    $.ajax({
        type: 'POST',
        url: 'consulta.php',
        data: { idEmpleado: idEmpleado, year: year },
    

Si no tienes almacenado el año en una variable, tendrás que hacer el trabajo adicional de,

  • declarar e inicializar el valor de esa variable para que esté disponible en javascript al procesar el index.php o
  • extraer el valor de la variable de la URL vía javascript.

De ser necesarias, estas tareas quedan fuera del alcance de esta respuesta.

Finalmente, el diseño es importante. Si no te detienes a pensar por un momento en el alcance que tiene tu sistema y darle una solución real adecuada al alcance, cosas así van a seguir apareciendo a medida que vayas avanzando. Hacer arreglos de este tipo, va a funcionar por un tiempo pero, en mi experiencia, son fuente frecuente de errores y causa de inestabilidad en los sistemas.

Puedes mejorar el diseño, por ejemplo, convirtiendo estos scripts que contienen las piezas del rompecabezas de la salida hacia la interfaz de usuario, en clases o en funciones que reciben parámetros, y que son invocadas desde los scripts que procesan los datos.

Imagina una función llamada generar_historial_vacaciones(), que recibe como parámetros el año y el id del empleado, o que pertenece a una clase que tiene estos datos como miembros de la clase, y que envía a la salida un <div> que contiene los datos del historial de vacaciones para el empleado y año recibidos.

Luego, desde donde haga falta ver este historial, invocas a la función. Y es en este lugar de invocación dónde tomas los parámetros de donde estén disponibles, puede ser desde un POST, desde un GET, desde una COOKIE o de datos almacenados en la sesión, dependiendo de la mecánica de interacción con el usuario de ese script en particular.

Este es un div que puede pasar a formar parte de una hoja simple, sin mucha estructura, que está diseñada para ser enviada a la impresora, en un caso, pero también puede estar dentro de un acordión, una pestaña, o cualquier otro elemento de la interfaz en una hoja que tiene una funcionalidad distinta, por ejemplo, en una pestaña de la ficha del empleado, o en una pestaña de una consola del administrador de recursos humanos, etc.

¿No es la respuesta que buscas? Examina otras preguntas con la etiqueta o formula tu propia pregunta.