Ver Mensaje Individual
  #1 (permalink)  
Antiguo 01/02/2011, 18:21
Fenris
 
Fecha de Ingreso: agosto-2008
Mensajes: 271
Antigüedad: 15 años, 8 meses
Puntos: 2
[problema] ZF y AJAX

Hola

De nuevo por aquí tratando de encontrar ayuda, estoy tratando de usar AJAX con ZF pero no resulta, esta es la situacion. Tengo lo siguiente un formulario con criterios establecidos en radiobuttons, busca por apellido o por rut, una caja para introducir el cliente a buscar con la particularidad de que comenzara la búsqueda a partir del segundo carácter tipeado por el usuario en la caja, enviara mediante AJAX la solicitud al controlador clientes acción search y este devolverá una estructura XML para ser procesada por el script de javascript, donde almacenara los resultados devueltos en un select (lista) creando un elemento option por cada ítem devuelto en el resultado.

Este código me funcionaba pero con programacion procedimental no OOP.-

Aqui dejo el codigo.

Controller: Clientes, Action: Search
Código PHP:
Ver original
  1. public function searchAction()
  2.     {
  3.         $this->_helper->layout->disableLayout();
  4.         $_request = $this->getRequest();
  5.        
  6.         if ($_request->isGet())
  7.         {
  8.             $filtro = $_request->getQuery('filtro');
  9.             $criterio = $_request->getQuery('criterio');
  10.            
  11.             if (null !== $filtro && null !== $criterio)
  12.             {
  13.                 //instancio el modelo para invocar al metodo
  14.                 $clientes= new Application_Model_Clientes();
  15.                 echo $clientes->search($filtro, $criterio);
  16.             }
  17.         }
  18.     }

Clientes Model
Código PHP:
Ver original
  1. public function search($p1, $p2)
  2.      {
  3.         return $this->getMapper()->search($p1, $p2);
  4.      }

Clientes Mapper
Código PHP:
Ver original
  1. public function search($p1, $p2)
  2.     {
  3.         $select = $this->getDbTable()->select()
  4.                                     ->from(array('pac' => 'clientes'),
  5.                                            array('rut'=>'pac.rut',
  6.                                                  'nombre'=>'CONCAT(pac.nombres," ",pac.apellidoPaterno)'))
  7.                                     ->where($p1.' LIKE ?', '%'.$p2.'%')
  8.                                     ->order('apellidoPaterno ASC');
  9.                                    
  10.         $resultSet = $this->getDbTable()->fetchAll($select);
  11.         if (0 < count($resultSet)) {
  12.             $entries   = array();
  13.             $xml = "<?xml version='1.0' encoding='utf-8' ?>\n"."<items>\n";
  14.             foreach ($resultSet as $row) {
  15.                 $xml = $xml."<RUT>".$row->rut."</RUT>\n";
  16.                 $xml = $xml."<NOMBRES>".$row->nombre."</NOMBRES>\n";
  17.             }
  18.         } else {
  19.             $xml = $xml."<RUT>1</RUT>\n";
  20.             $xml = $xml."<NOMBRES>No se encontraron coincidencias</NOMBRES>\n";
  21.         }  
  22.         $xml = $xml ."</items>";   
  23.         return $xml;
  24.     }

VIEW SEARCH

Código HTML:
Ver original
  1. <?php echo $this->doctype() ?>
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  4. <title>Sistema Informatico Clinica</title>
  5. <?php $this->headLink()->appendStylesheet('/css/global.css') ?>
  6. <?php $this->headLink()->appendStylesheet('/css/master.css') ?>
  7. <?php echo $this->headLink() ?>
  8. <script type="text/javascript" src="/js/funciones.js"></script>
  9. <script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>
  10.  
  11. <script type="text/javascript">
  12.  
  13. var httpReq;    //objeto para realizar peticiones HTTP
  14. var items;  //Contendrá el XML obtenido para los elementos de la lista
  15. var ids;    //Contendrá el XML obtenido para los elementos de la lista
  16. var tipo;  //Contendra el XML obtenido para el elemento TIPO
  17. var valores;    //Contendrá el XML obtenido para los elementos de la lista
  18.  
  19. //Se encarga de cargar los items de la lista secundaria
  20. function loadItems(tipo)
  21. {
  22.     var filtro;
  23.  
  24.     if (document.frm_buscar_clientes.filtros[0].checked){
  25.         filtro='apellidoPaterno';
  26.     } else {
  27.         filtro='rut';
  28.     }
  29.     getXML("/filtro/"+filtro+"/criterio/"+tipo);
  30. }
  31.  
  32. //Carga el RSS en el objeto rssXML
  33. function getXML(url)
  34. {
  35.     //Si es Mozilla, Opera o safari (entre otros que lo soportan como objeto nativo del navegador)
  36.     if (window.XMLHttpRequest)
  37.     {
  38.         httpReq = new XMLHttpRequest();
  39.     }
  40.     else    //Internet Explorer lo expone como control Active X
  41.     {
  42.         httpReq = new ActiveXObject("Microsoft.XMLHTTP");
  43.     }
  44.     //Ya debería tener una referencia al objeto
  45.     if (httpReq != null)
  46.     {
  47.         httpReq.onreadystatechange = finCarga;
  48.         httpReq.open("GET", url, true)  //El true del final es para que lo solicite de forma asíncrona
  49.         httpReq.send(null); //al ser una petición GET no va nada en el cuerpo de la petición, de ahí el null
  50.     }
  51. }
  52.  
  53. //Función que se ejecuta cuando cambia el estado de la carga del objeto httpReq
  54. function finCarga()
  55. {
  56.     if (httpReq.readyState == 4)    //4: completado, 3: en curso, 1:cargado, 0: no iniciado
  57.     {
  58.         if (httpReq.status == 200)  //200: OK (código HTTP, podría haber sido 404 (no encontrado), 500 (error), etc...)
  59.         {
  60.             items = httpReq.responseXML.getElementsByTagName("NOMBRES");    //Coge sólo los elementos "item"
  61.             ids= httpReq.responseXML.getElementsByTagName("RUT");   //Coge sólo los elementos "item"   
  62.             ProcesaItems();
  63.         }
  64.         else    //Se produjo un error
  65.         {
  66.             alert("No se pudo recuperar la información de la lista secundaria: " + httpReq.statusText);
  67.         }
  68.     }
  69. }
  70.  
  71. //Procesa los items del RSS
  72. function ProcesaItems()
  73. {
  74.     listaSec = document.getElementById("mnuSecundario");
  75.     if (listaSec != null)
  76.     {
  77.         listaSec.options.length = 0;    //Vacía la lista de opciones
  78.         //Cargamos las nuevas opciones
  79.         for(i=0; i<items.length; i++)
  80.         {
  81.            
  82.             var opc = document.createElement("OPTION");
  83.             opc.text = items[i].childNodes[0].nodeValue;
  84.             opc.value = ids[i].childNodes[0].nodeValue;
  85.  
  86.             listaSec.options.add(opc);
  87.             if (ids[i].childNodes[0].nodeValue == 0 || items[i].childNodes[0].nodeValue == 'No se encontraron coincidencias')
  88.             {          
  89.                 listaSec.disabled=true; //PARA EL CASO DE NO HABER RESULTADOS INABILITO EL SELECTOR
  90.             } else {
  91.                 listaSec.disabled=false;   
  92.                 listaSec.options[0].selected = true; //si se encontraron coincidencias marco la primera opcion de la lista como seleccionada               
  93.                
  94.             }
  95.         }
  96.     }
  97. }
  98.  
  99. function CargaPagina(dato){
  100.  
  101.         listaSec = document.getElementById("mnuSecundario");
  102.         var textoSel = '0';
  103.         var valorSel = '0';
  104.  
  105.         if(document.frm_buscar_clientes.mnuSecundario.selectedIndex != -1 && listaSec.value != ''){
  106.                 textoSel = document.frm_buscar_clientes.mnuSecundario.options[document.frm_buscar_clientesentes.mnuSecundario.selectedIndex].text;
  107.                 valorSel = document.frm_buscar_clientes.mnuSecundario.value;
  108.                 parent.infFrame.location.href = '/clientes/edit/rut/'+valorSel;
  109.             }
  110.  
  111. }
  112. </head>
  113. <div class="outerbox" >
  114.  
  115.     <form
  116.          name="frm_buscar_clientes"
  117.              id="frm_buscar_clientes"
  118.                 method="post"
  119.                     action="/clientes/search/" >
  120.  
  121.         <div class="mainHeading"><h4>Buscador de clientes</h4></div>
  122.            
  123.                 <table cellspacing="0" cellpadding="0" class="data-table" id="clientes-table" >
  124.                     <tr >
  125.                                                 <td scope="col">
  126.                             Filtros
  127.  
  128.                         </td>
  129.                                                 <td scope="col">
  130.                             <input name="filtros" type="radio" value="apellidoPaterno" checked>&nbsp;&nbsp;Apellido Paterno
  131.                         </td>
  132.  
  133.                                                 <td scope="col">
  134.                             <input name="filtros" type="radio" value="rut">&nbsp;&nbsp;Rut            
  135.                         </td>
  136.  
  137.                     </tr>
  138.  
  139.                     <tr>
  140.                         <td colspan="3" style="height:2px"></td>
  141.                     </tr>
  142.                    
  143.                     <tr >
  144.                                                 <td scope="col">
  145.                             Texto a Buscar
  146.  
  147.                         </td>
  148.                                                 <td scope="col" colspan="2">
  149. <input name="mnuPrimario" type="text" id="mnuPrimario" onKeyUp="this.value=this.value.toUpperCase(); if (this.value.length>2){loadItems(this.value);};" size="50">
  150.                             </td>
  151.  
  152.                     </tr>
  153.                    
  154.                     <tr>
  155.                         <td colspan="3" style="height:2px"></td>
  156.                     </tr>
  157.  
  158.                     <tr >
  159.                                                 <td scope="col">
  160.                             Coincidencias
  161.  
  162.                         </td>
  163.                                                 <td scope="col" colspan="2">
  164.                                                 <select name="mnuSecundario" style="width:300px;" size="5" id="mnuSecundario" onclick="LoadClientesInfo(this.value);" disabled="disabled">
  165.           <option value="">[Ingrese texto a buscar en la caja superior]</option>
  166.         </select>   <input name="hayseleccion" type="hidden" value="0">                     </td>
  167.  
  168.                     </tr>
  169.                    
  170.                 </table>
  171.     </form>
  172.  
  173. </div>
  174. </body>
  175. </html>
  176. <script type="text/javascript">
  177.     <!--
  178.         if (document.getElementById && document.createElement) {
  179.             roundBorder('outerbox');
  180.         }
  181.    -->

Saludos y espero me ayuden..