Foros del Web » Programando para Internet » PHP »

PHP OO Realizar llamada a controlador mediante AJAX

Estas en el tema de Realizar llamada a controlador mediante AJAX en el foro de PHP en Foros del Web. Buenas a todos, ando con una consulta para hacerles, resulta que estoy haciendo una llamada ajax a un controlador php para evitar que se abran ...
  #1 (permalink)  
Antiguo 28/08/2022, 21:20
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Realizar llamada a controlador mediante AJAX

Buenas a todos, ando con una consulta para hacerles, resulta que estoy haciendo una llamada ajax a un controlador php para evitar que se abran 2 páginas para hacer un alta y la verdad nunca usé ajax hasta ahora, pero intento y no consigo nada, le hago click en el botón "Aceptar" y no se inmuta para nada.
Pongo el código

DepartamentosController.php
Código PHP:
Ver original
  1. public function add(){
  2.         if(isset($_POST["btnaceptar"])){
  3.             try {
  4.                 $entity = $this->createEntity();
  5.                 $entity->create();
  6.                 Session::set("msg",Session::msgSuccess("Departamento Creado"));
  7.                 header("Location:index.php?c=departamentos&a=index");
  8.                 exit();                    
  9.             } catch (\Exception $ex) {
  10.                 Session::set("msg",Session::msgDanger($ex->getMessage()));                  
  11.             }
  12.         }
  13.        
  14.         $this->redirect("add.php");
  15.     }

Departamentos/index.php
Código PHP:
Ver original
  1. <h3><i class="fa fa-angle-right"></i>&nbsp;Mantenimiento de Departamentos</h3>
  2. ......
  3.     <!-- Modal -->
  4. <div class="modal fade" id="AMModal" aria-hidden="true">
  5.     <div class="modal-dialog modal-dialog-centered">
  6.         <div class="modal-content">
  7.             <form id="AMDocumento" method="post">
  8.                 <div class="modal-header">
  9.                     <h3 class="modal-title">
  10.                         <i class="fa fa-angle-right"></i>&nbsp;Crear Departamento
  11.                     </h3>
  12.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  13.                 </div>
  14.                 <div class="modal-body">        
  15.                     <div class="form-group">
  16.                         <label class="col-form-label">Nombre (*):</label>                      
  17.                         <input type="text" name="txtnombre" id="nombre" class="form-control" autofocus="autofocus" required="required" />                        
  18.                     </div>                
  19.                 </div>
  20.                 <div class="modal-footer">
  21.                     <input type="hidden" name="hid" id="id" value="0" />
  22.                     <button
  23.                         type="submit"
  24.                         name="btnaceptar"
  25.                         value="Aceptar"
  26.                         id="aceptar"
  27.                         class="btn btn-success"
  28.                     >
  29.                         <i class="fa fa-check"></i>&nbsp;Aceptar
  30.                     </button>
  31.                     <button
  32.                         type="button"
  33.                         name="btncancelar"
  34.                         value="Cancelar"
  35.                         class="btn btn-danger"
  36.                         data-bs-dismiss="modal"
  37.                     >
  38.                         <i class="fa fa-times"></i>&nbsp;Cancelar
  39.                     </button>
  40.                 </div>
  41.             </form>            
  42.         </div>        
  43.     </div>
  44.   </div>
  45. </div>
  46. <script src="Public/js/crud/departamento.js"></script>

departamento.js
Código PHP:
Ver original
  1. $(function() {
  2.     $('#AMDocumento').submit(function(e) {
  3.         e.preventDefault();
  4.        
  5.         $.ajax({
  6.             type:'POST',
  7.             url:'index.php?c=departamentos&a=add',
  8.             data: $('#AMDocumento').serialize(),
  9.             dataType: 'json',
  10.             success: function(dataResult){
  11.                 var result = JSON.parse(dataResult);
  12.                 if(result.statusCode===200){
  13.                     $('#AMDocumento').hide();
  14.                 }
  15.             }
  16.         });
  17.     });
  18. });

Necesito su ayuda para ver cómo hacer andar los ajax.
Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #2 (permalink)  
Antiguo 30/08/2022, 05:09
Avatar de vb2005  
Fecha de Ingreso: noviembre-2005
Ubicación: Paderborn - Alemania
Mensajes: 568
Antigüedad: 19 años
Puntos: 25
Respuesta: Realizar llamada a controlador mediante AJAX

Por lo que leo de tu código, el problema es que el listener de .submit() está en la funcion de jquery que no se llama.

Tiene que ser asi:

Código PHP:
Ver original
  1. Posted in: Using jQuery Core
  2. $( document ).ready(function(){
  3. ... tu código
  4. })
__________________
www.marcher.com.uy - Web personal
Nerd's Corner - Desarrollo de software a medida
  #3 (permalink)  
Antiguo 04/09/2022, 22:17
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Realizar llamada a controlador mediante AJAX

Primero que todo gracias por responderme, funcionó lo que me dijiste pero también necesitaba poner el botón en el data:

departamento.js:

Código Javascript:
Ver original
  1. $(document).ready(function(){
  2.     $('#AMDocumento').submit(function(e) {
  3.         e.preventDefault();
  4.        
  5.         var myData = {
  6.             btnaceptar: $("#aceptar").val(),
  7.             hid: $("#id").val() !== null ? $("#id").val() : 0,
  8.             txtnombre: $("#nombre").val()
  9.         };
  10.        
  11.         $.ajax({
  12.             type:'POST',
  13.             url:'index.php?c=departamentos&a=add',
  14.             data: myData,            
  15.             success: function(){                
  16.                 $('#AMDocumento').hide();                
  17.             }
  18.         });
  19.     });
  20. });

Y me inserta bien pero ahora como problema estoy teniendo que la pantalla se pone gris después de que el modal se oculta al lograr la inserción, pareciendo que esta bloqueada hasta que hago un click.

Por otro lado:

¿cómo puedo hacer para que el mensaje que coloco aparezca luego de que la inserción funcione?

layout.php (vista generica que las otras heredan):
Código PHP:
Ver original
  1. <body>
  2.         <?php echo $menu; ?>
  3.         <section>
  4.             <div id="main">
  5.                 <?php
  6.                     if (\App\Session::get('msg') != null) {  ?>
  7.                         <div class="alert alert-<?php echo \App\Session::get('msg')[0]; ?> alert-dismissible fade show">
  8.                             <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
  9.                             <i class="fa fa-<?php echo \App\Session::get('msg')[1]; ?>" style="font-size: 24px;"></i>&nbsp;
  10.                             <?php echo \App\Session::get('msg')[2]; ?>
  11.                         </div>                        
  12.                 <?php    
  13.                         \App\Session::set('msg', "");                    
  14.                     }
  15.                     echo $content;        
  16.                 ?>
  17.             </div>
  18.         </section>      
  19.     </body>

¿cómo puedo hacer que la grilla de datos que es independiente de si tiene filtro o no cargue la fila insertada desde el ajax?

Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #4 (permalink)  
Antiguo 10/09/2022, 22:22
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Realizar llamada a controlador mediante AJAX

Pude hacer que el modal se cierre sin problema con esto:

Código Javascript:
Ver original
  1. $('#AMModal').modal('hide');

Intenté poner datatable de jquery, pero por alguna razón no carga el datatable ni llega el ajax a consumir la función del controlador:

DepartamentosController.php:
Código PHP:
Ver original
  1. public function obtenerTodos(){
  2.         //luego agrego los filtros
  3.         $tabla = (new Departamento())->find();
  4.         //return $tabla;
  5.         echo json_encode($tabla);
  6.     }

departamento.js
Código Javascript:
Ver original
  1. $("#tablaDep").DataTable({
  2.             processing: true,
  3.             serverSide: true,
  4.             serverMethod: "post",
  5.             pageLength: 10,
  6.             ajax: {
  7.                 url: 'index.php?c=departamentos&a=obtenerTodos'
  8.                
  9.             },
  10.             columns: [
  11.                 {
  12.                     data: "id"
  13.                 },
  14.                 { data: "nombre" },
  15.                 { data: "estado" }
  16.             ]
  17.         });

index.php:
Código HTML:
Ver original
  1. ....
  2. <table class="table table-bordered table-striped table-condensed" id="#tablaDep">
  3.         <thead>
  4.             <th></th>
  5.             <th>Nombre</th>
  6.             <th>Estado</th>
  7.         </thead>
  8.     </table>

Necesito tener esto listo, pero no sé que hacer si el ajax no reacciona.
Espero sus respuestas y saludos.
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias
  #5 (permalink)  
Antiguo 27/09/2022, 21:22
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Realizar llamada a controlador mediante AJAX

Buenas a todos, al final pude generar el listado desde ajax y hacer click en los botones de paginación realizando los siguientes cambios:

DepartamentoController.php
Código PHP:
Ver original
  1. public function obtenerTodos(){
  2.         $json = [];
  3.        
  4.         Session::set('pDep', isset($_GET['p']) ? $_GET['p'] : 1);
  5.        
  6.         if(isset($_POST['stEstado'])){
  7.             Session::set('eDep', $this->clean($_POST['stEstado']));
  8.         } else {
  9.             Session::set('eDep', Session::get('eDep'));
  10.         }
  11.        
  12.         if(isset($_POST['txtbuscador'])){
  13.             Session::set('bDep', $this->clean($_POST['txtbuscador']));
  14.         } else {
  15.             Session::set('bDep', Session::get('bDep'));
  16.         }
  17.        
  18.         $params = [
  19.             "criterio"=> "%".Session::get('bDep')."%",
  20.             "estado" => Session::get('eDep')
  21.         ];
  22.        
  23.         $tabla = (new Departamento())->find($params);
  24.        
  25.         $departamentos = $this->getPaginator()->paginar($tabla, Session::get('pDep'));
  26.         $paginador = $this->getPaginator()->getPages();
  27.        
  28.         foreach($departamentos as $dep){
  29.             array_push($json, [
  30.                 "id" => $dep->getId(),
  31.                 "nombre" => $dep->getNombre(),
  32.                 "activo" => $dep->isActivo()
  33.             ]);
  34.         }
  35.        
  36.         header("Content-Type: application/json");
  37.         echo json_encode([
  38.             "tabla" => $json,
  39.             "paginador" => $paginador
  40.         ]);
  41.     }

departamento.js
Código Javascript:
Ver original
  1. function load_data(page_number = 1){
  2.         $.ajax({
  3.             url: "index.php?c=departamentos&a=obtenerTodos",
  4.             type: "GET",
  5.             dataType: "JSON",
  6.             data: {
  7.                 txtbuscador: $("#buscador").val(),
  8.                 p: page_number
  9.             },
  10.             success: function(data) {
  11.                 var paginador = data.paginador;
  12.                 var tabla = data.tabla;
  13.                 var vTabla = '';
  14.                 var vPaginador = '';
  15.                 var i;
  16.  
  17.                 for (i = 0; i < tabla.length; i++) {
  18.                     vTabla += '<tr>' +
  19.                     '<td></td>' +
  20.                     '<td>' + tabla[i].nombre + '</td>' +
  21.                     '<td>' + (tabla[i].activo ? "Activo" : "Inactivo") + '</td>' +
  22.                     '</tr>';
  23.                 }
  24.  
  25.                 if(paginador !== null){
  26.                     vPaginador += "<div class='d-flex justify-content-center'>";
  27.                     vPaginador +="<ul class='pagination' id='pagination'>";
  28.  
  29.                     if(paginador["primero"]){
  30.                         vPaginador += "<li class='page-item'>";
  31.                         vPaginador +="<a class='page-link' id='" + paginador["primero"] +"' title='Primero'>";
  32.                         vPaginador +="<i class='fas fa-angle-double-left'>&nbsp;</i>";
  33.                         vPaginador +="</a>";
  34.                         vPaginador +="</li>";
  35.                     } else {
  36.                         vPaginador +="<li class='page-item disabled'>";
  37.                         vPaginador +="<span class ='page-link'>";
  38.                         vPaginador +="<i class='fas fa-angle-double-left'>&nbsp;</i>";
  39.                         vPaginador +="</span>";
  40.                         vPaginador +="</li>";
  41.                     }
  42.  
  43.                     if(paginador["anterior"]){
  44.                         vPaginador +="<li class='page-item'>";
  45.                         vPaginador +="<a class='page-link' id='" + paginador["anterior"] +"' title='Anterior'>";
  46.                         vPaginador +="<i class='fas fa-angle-left'>&nbsp;</i>";
  47.                         vPaginador +="</a>";
  48.                         vPaginador +="</li>";
  49.                     } else {
  50.                         vPaginador +="<li class='page-item disabled'>";
  51.                         vPaginador +="<span class='page-link'>";
  52.                         vPaginador +="<i class='fas fa-angle-left'>&nbsp;</i>";
  53.                         vPaginador +="</span>";
  54.                         vPaginador +="</li>";
  55.                     }
  56.  
  57.                     for(i = 0; i < paginador["rango"].length; i++){
  58.                         if(paginador["actual"] === paginador["rango"][i]){
  59.                             vPaginador +="<li class='page-item active'>";
  60.                             vPaginador +="<span class='page-link'>";
  61.                             vPaginador += paginador["rango"][i];
  62.                             vPaginador +="</span>";
  63.                             vPaginador +="</li>";
  64.                         } else {
  65.                             vPaginador +="<li class='page-item'>";
  66.                             vPaginador +="<a class='page-link' id='" + paginador["rango"][i]+"' class='page-link'>";
  67.                             vPaginador += paginador['rango'][i];
  68.                             vPaginador +="</a>";
  69.                             vPaginador +="</li>";
  70.                         }
  71.                     }
  72.  
  73.                     if(paginador["siguiente"]){
  74.                         vPaginador +="<li class='page-item'>";
  75.                         vPaginador +="<a class='page-link' id='" + paginador["siguiente"] +"' title='Siguiente'>";
  76.                         vPaginador +="<i class='fas fa-angle-right'>&nbsp;</i>";
  77.                         vPaginador +="</a>";
  78.                         vPaginador +="</li>";
  79.                     } else {
  80.                         vPaginador +="<li class='page-item disabled'>";
  81.                         vPaginador +="<span class='page-link'>";
  82.                         vPaginador +="<i class='fas fa-angle-right'>&nbsp;</i>";
  83.                         vPaginador +="</span>";
  84.                         vPaginador +="</li>";
  85.                     }
  86.  
  87.                     if(paginador["ultimo"]){
  88.                         vPaginador +="<li class='page-item'>";
  89.                         vPaginador +="<a class='page-link' id='" + paginador["ultimo"] +"' title='Último'>";
  90.                         vPaginador +="<i class='fas fa-angle-double-right'>&nbsp;</i>";
  91.                         vPaginador +="</a>";
  92.                         vPaginador +="</li>";
  93.                     } else {
  94.                         vPaginador +="<li class='page-item disabled'>";
  95.                         vPaginador +="<span class='page-link'>";
  96.                         vPaginador +="<i class='fas fa-angle-double-right'>&nbsp;</i>";
  97.                         vPaginador +="</span>";
  98.                         vPaginador +="</li>";
  99.                     }
  100.  
  101.                     vPaginador +="</ul>";                                
  102.                     vPaginador += "</div>";
  103.                 }
  104.  
  105.                 $('#DataResult').html(vTabla);
  106.                 $('#DataPages').html(vPaginador);
  107.             },
  108.             error: function(jqXHR, textStatus, errorThrown) {
  109.                 alert(errorThrown);
  110.             }
  111.         });
  112.     }
  113.    
  114.     $(window).on("load", function() {
  115.         load_data();
  116.     });
  117.    
  118.     $(document).on("click","#pagination a",function(e) {
  119.         e.preventDefault();
  120.         var page_id = $(this).attr("id");
  121.         load_data(page_id);
  122.     });
  123.    
  124.     [B]$("#buscador").keyup(function(e){
  125.     e.preventDefault();
  126.     load_data();
  127.     });[/B]
  128.     });

El único problema es que ahora, al realizar una búsqueda escribiendo en la caja de texto, el filtro no cambia para nada, antes de pasar a ajax, los filtros andaban bien y no sé que necesito para dejar funcional el buscador.

Espero sus respuestas y saludos
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias

Última edición por detective_jd; 14/10/2022 a las 21:33
  #6 (permalink)  
Antiguo 14/10/2022, 21:34
Avatar de detective_jd  
Fecha de Ingreso: abril-2011
Ubicación: Salto
Mensajes: 437
Antigüedad: 13 años, 7 meses
Puntos: 6
Respuesta: Realizar llamada a controlador mediante AJAX

También pondré el index por las dudas si ven que me falta algo en el index:

Código HTML:
Ver original
  1. <h3><i class="fa fa-angle-right"></i>&nbsp;Mantenimiento de Departamentos</h3>
  2. <div class="content-panel">
  3.     <div class="d-flex justify-content-between">
  4.         <div class="p-2 bd-highlight">
  5.             <a href="index.php?c=main&a=index">
  6.                 <button class="btn btn-info" tabindex="1">
  7.                     <i class="fa fa-arrow-left"></i>&nbsp;Volver
  8.                 </button>
  9.             </a>
  10.             <button class="btn btn-success" data-bs-toggle="modal" data-bs-target="#AMModal">
  11.                 <i class="fa fa-plus"></i>&nbsp;Crear
  12.             </button>
  13.         </div>
  14.         <div>
  15.             <div class="d-flex justify-content-end">            
  16.                 <div class="p-2 bd-highlight">
  17.                     <div class="input-group mb-3">
  18.                         <label class="d-flex align-items-center justify-content-center mx-2" style="display: inline-block;">Ver:</label>
  19.                         <select name="stEstado" class="form-select" style="display: inline-block;">
  20.                             <option value="">Todos</option>
  21.                             <option value="1">Activo</option>
  22.                             <option value="0">Inactivo</option>
  23.                         </select>
  24.                     </div>            
  25.                 </div>
  26.                 <div class="p-2 bd-highlight">                
  27.                     <div class="input-group mb-3">
  28.                         <input
  29.                            type="search"
  30.                            id="buscador"
  31.                            name="txtbuscador"
  32.                            placeholder="Buscar por nombre"
  33.                            class="form-control rounded"
  34.                            tabindex="3"
  35.                            style="display: inline-block;"
  36.                            />
  37.                         <span
  38.                            class="input-group-text border-0"
  39.                            id="search-addon"
  40.                            style="background-color: white;"
  41.                        >
  42.                             <i class="fas fa-search"></i>
  43.                         </span>
  44.                     </div>                
  45.                 </div>            
  46.             </div>
  47.         </div>
  48.     </div>
  49.     <table class="table table-bordered table-striped table-condensed" id="#tablaDep">
  50.         <thead>
  51.             <th></th>
  52.             <th>Nombre</th>
  53.             <th>Estado</th>
  54.         </thead>
  55.         <tbody id="DataResult">            
  56.         </tbody>
  57.     </table>
  58.     <div id="DataPages">        
  59.     </div>
  60. </div>
  61. <!-- Modal -->
  62. <div class="modal fade" id="AMModal" aria-hidden="true">
  63.     <div class="modal-dialog modal-dialog-centered">
  64.         <div class="modal-content">
  65.             <form id="AMDocumento" method="post">
  66.                 <div class="modal-header">
  67.                     <h3 class="modal-title">
  68.                         <i class="fa fa-angle-right"></i>&nbsp;Crear Departamento
  69.                     </h3>
  70.                     <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
  71.                 </div>
  72.                 <div class="modal-body">        
  73.                     <div class="form-group">
  74.                         <label class="col-form-label">Nombre (*):</label>                      
  75.                         <input type="text" name="txtnombre" id="nombre" class="form-control" autofocus="autofocus" required="required" />                        
  76.                     </div>                
  77.                 </div>
  78.                 <div class="modal-footer">
  79.                     <input type="hidden" name="hid" id="id" value="0" />
  80.                     <button
  81.                        type="submit"
  82.                        name="btnaceptar"
  83.                        value="Aceptar"
  84.                        id="aceptar"
  85.                        class="btn btn-success"
  86.                    >
  87.                         <i class="fa fa-check"></i>&nbsp;Aceptar
  88.                     </button>
  89.                     <button
  90.                        type="button"
  91.                        name="btncancelar"
  92.                        value="Cancelar"
  93.                        class="btn btn-danger"
  94.                        data-bs-dismiss="modal"
  95.                    >
  96.                         <i class="fa fa-times"></i>&nbsp;Cancelar
  97.                     </button>
  98.                 </div>
  99.             </form>            
  100.         </div>        
  101.     </div>
  102.   </div>
  103. </div>
  104. <script src="Public/js/crud/departamento.js" type="text/javascript"></script>

Espero sus respuestas y saludos
__________________
Si te interesa, visita mi perfil de Linkedin. Gracias

Etiquetas: ajax, controlador, llamada, mediante
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:22.