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
public function searchAction() { $this->_helper->layout->disableLayout(); $_request = $this->getRequest(); if ($_request->isGet()) { $filtro = $_request->getQuery('filtro'); $criterio = $_request->getQuery('criterio'); if (null !== $filtro && null !== $criterio) { //instancio el modelo para invocar al metodo $clientes= new Application_Model_Clientes(); echo $clientes->search($filtro, $criterio); } } }
Clientes Model
Código PHP:
Ver original
public function search($p1, $p2) { return $this->getMapper()->search($p1, $p2); }
Clientes Mapper
Código PHP:
Ver original
public function search($p1, $p2) { $select = $this->getDbTable()->select() ->from(array('pac' => 'clientes'), array('rut'=>'pac.rut', 'nombre'=>'CONCAT(pac.nombres," ",pac.apellidoPaterno)')) ->where($p1.' LIKE ?', '%'.$p2.'%') ->order('apellidoPaterno ASC'); $resultSet = $this->getDbTable()->fetchAll($select); if (0 < count($resultSet)) { $entries = array(); $xml = "<?xml version='1.0' encoding='utf-8' ?>\n"."<items>\n"; foreach ($resultSet as $row) { $xml = $xml."<RUT>".$row->rut."</RUT>\n"; $xml = $xml."<NOMBRES>".$row->nombre."</NOMBRES>\n"; } } else { $xml = $xml."<RUT>1</RUT>\n"; $xml = $xml."<NOMBRES>No se encontraron coincidencias</NOMBRES>\n"; } $xml = $xml ."</items>"; return $xml; }
VIEW SEARCH
Código HTML:
Ver original
<?php echo $this->doctype() ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <?php $this->headLink()->appendStylesheet('/css/global.css') ?> <?php $this->headLink()->appendStylesheet('/css/master.css') ?> <?php echo $this->headLink() ?> <script type="text/javascript"> var httpReq; //objeto para realizar peticiones HTTP var items; //Contendrá el XML obtenido para los elementos de la lista var ids; //Contendrá el XML obtenido para los elementos de la lista var tipo; //Contendra el XML obtenido para el elemento TIPO var valores; //Contendrá el XML obtenido para los elementos de la lista //Se encarga de cargar los items de la lista secundaria function loadItems(tipo) { var filtro; if (document.frm_buscar_clientes.filtros[0].checked){ filtro='apellidoPaterno'; } else { filtro='rut'; } getXML("/filtro/"+filtro+"/criterio/"+tipo); } //Carga el RSS en el objeto rssXML function getXML(url) { //Si es Mozilla, Opera o safari (entre otros que lo soportan como objeto nativo del navegador) if (window.XMLHttpRequest) { httpReq = new XMLHttpRequest(); } else //Internet Explorer lo expone como control Active X { httpReq = new ActiveXObject("Microsoft.XMLHTTP"); } //Ya debería tener una referencia al objeto if (httpReq != null) { httpReq.onreadystatechange = finCarga; httpReq.open("GET", url, true) //El true del final es para que lo solicite de forma asíncrona httpReq.send(null); //al ser una petición GET no va nada en el cuerpo de la petición, de ahí el null } } //Función que se ejecuta cuando cambia el estado de la carga del objeto httpReq function finCarga() { if (httpReq.readyState == 4) //4: completado, 3: en curso, 1:cargado, 0: no iniciado { if (httpReq.status == 200) //200: OK (código HTTP, podría haber sido 404 (no encontrado), 500 (error), etc...) { items = httpReq.responseXML.getElementsByTagName("NOMBRES"); //Coge sólo los elementos "item" ids= httpReq.responseXML.getElementsByTagName("RUT"); //Coge sólo los elementos "item" ProcesaItems(); } else //Se produjo un error { alert("No se pudo recuperar la información de la lista secundaria: " + httpReq.statusText); } } } //Procesa los items del RSS function ProcesaItems() { listaSec = document.getElementById("mnuSecundario"); if (listaSec != null) { listaSec.options.length = 0; //Vacía la lista de opciones //Cargamos las nuevas opciones for(i=0; i<items.length; i++) { var opc = document.createElement("OPTION"); opc.text = items[i].childNodes[0].nodeValue; opc.value = ids[i].childNodes[0].nodeValue; listaSec.options.add(opc); if (ids[i].childNodes[0].nodeValue == 0 || items[i].childNodes[0].nodeValue == 'No se encontraron coincidencias') { listaSec.disabled=true; //PARA EL CASO DE NO HABER RESULTADOS INABILITO EL SELECTOR } else { listaSec.disabled=false; listaSec.options[0].selected = true; //si se encontraron coincidencias marco la primera opcion de la lista como seleccionada } } } } function CargaPagina(dato){ listaSec = document.getElementById("mnuSecundario"); var textoSel = '0'; var valorSel = '0'; if(document.frm_buscar_clientes.mnuSecundario.selectedIndex != -1 && listaSec.value != ''){ textoSel = document.frm_buscar_clientes.mnuSecundario.options[document.frm_buscar_clientesentes.mnuSecundario.selectedIndex].text; valorSel = document.frm_buscar_clientes.mnuSecundario.value; parent.infFrame.location.href = '/clientes/edit/rut/'+valorSel; } } </script> </head> <body> <div class="outerbox" > <form name="frm_buscar_clientes" id="frm_buscar_clientes" method="post" action="/clientes/search/" > <table cellspacing="0" cellpadding="0" class="data-table" id="clientes-table" > <tr > <td scope="col"> Filtros </td> <td scope="col"> <input name="filtros" type="radio" value="apellidoPaterno" checked> Apellido Paterno </td> <td scope="col"> <input name="filtros" type="radio" value="rut"> Rut </td> </tr> <tr> </tr> <tr > <td scope="col"> Texto a Buscar </td> <td scope="col" colspan="2"> <input name="mnuPrimario" type="text" id="mnuPrimario" onKeyUp="this.value=this.value.toUpperCase(); if (this.value.length>2){loadItems(this.value);};" size="50"> </td> </tr> <tr> </tr> <tr > <td scope="col"> Coincidencias </td> <td scope="col" colspan="2"> <select name="mnuSecundario" style="width:300px;" size="5" id="mnuSecundario" onclick="LoadClientesInfo(this.value);" disabled="disabled"> </tr> </table> </form> </div> </body> </html> <script type="text/javascript"> <!-- if (document.getElementById && document.createElement) { roundBorder('outerbox'); } --> </script>
Saludos y espero me ayuden..