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 originalpublic 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 originalpublic function search($p1, $p2)
{
return $this->getMapper()->search($p1, $p2);
}
Clientes Mapper
Código PHP:
Ver originalpublic 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"> <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" src="/js/funciones.js"></script> <script type="text/javascript" src="/js/jquery-1.4.4.min.js"></script>
<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;
}
}
name="frm_buscar_clientes"
id="frm_buscar_clientes"
method="post"
action="/clientes/search/" >
<div class="mainHeading"><h4>Buscador de clientes
</h4></div>
<table cellspacing="0" cellpadding="0" class="data-table" id="clientes-table" > Filtros
<input name="filtros" type="radio" value="apellidoPaterno" checked> Apellido Paterno
<input name="filtros" type="radio" value="rut"> Rut
<td colspan="3" style="height:2px"></td>
Texto a Buscar
<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 colspan="3" style="height:2px"></td>
Coincidencias
<td scope="col" colspan="2"> <select name="mnuSecundario" style="width:300px;" size="5" id="mnuSecundario" onclick="LoadClientesInfo(this.value);" disabled="disabled"> <option value="">[Ingrese texto a buscar en la caja superior]
</option> </select> <input name="hayseleccion" type="hidden" value="0"> </td>
<script type="text/javascript"> <!--
if (document.getElementById && document.createElement) {
roundBorder('outerbox');
}
-->
Saludos y espero me ayuden..