Las cabeceras X-JSON salen de un modo misterioso en la documentacion de Prototype, e incluso en la de symfony.
Pues bien, tiene utilidad, vienen muy bien para enviar datos desde la operacion ajax hecha en el servidor hasta la funcion javascript que se suele ejecutar en el status ‘complete’
Pero pasemos a un ejemplo:

Una tipica llamada ajax symfony o prototype

<?php echo javascript_tag(remote_function(array('update'=>'temasPfrecuentes',
						'url'=>'pfrecuentes/listadoTemasPfrecuentes',
						'complete'=>'prepareTemasPfrecuentes(request,json)',
						'script'=>true) ) ) ?>

Como se puede ver, esta llamada ajax hace que se “rellene” el div “temaPfrecuentes” con el resultado de la operacion “pfrecuentes/listadoTemaPfrecuentes” del servidor (accion-template, etc ..). ademas, se pide que cuando se complete la operacion, se llame a la funcion prepareTemasPfrecuentes:

/** observese que la funcion se llama con los argumentos 'request,json'.
* TODAS LAS FUNCIONES QUE SE LLAMAN CUANDO SE CUMPLA UN STATUS AJAX DETERMINADO
* (complete,success,failure,etc..)
* ACEPTAN ESTOS DOS PARAMETROS, PERO HAY QUE INDICARLOS,
* TANTO EN LA CONFIGURACION DEL OBJETO AJAX COMO EN LA DEFINICION
* DE LA FUNCION JAVASCRIPT
*/
function prepareTemasPfrecuentes(request,json)
  {
  yadda, yadda....

  var idcat_padre = json.idcat_padre ;
  var idcol = json.idcol ;

  yadda, yadda ...
  }

Como podemos ver, la funcion javscript recibe, ademas del tipico (e inutil) objeto request, un objeto json, del cual extrae parametros que de otro modo tendria que averiguar por los metodos mas bizarros.
No hay que olvidar, que cuando indicamos llamadas a funciones en las opciones del objeto ajax, intentar definir argumentos ‘ad-hoc’ es mas bien peligroso, y nos generara miles de errores intraceables. Mi consejo es llamarlas siempre con estos dos argumentos (request,json) (por si no ha quedado claro, yo mismo me he pegado muchas, muchisimas tortas con esta estupidez de los argumentos de las funciones).
y para definir el objeto json en el servidor donde se realiza la operacion ajax en cuestion:

  public function executeListadoTemasPfrecuentes()
  {

    $idcol = $this->getRequest()->getParameter ('idcol','0');
    $idcat_padre = $this->getRequest()->getParameter ('idcat_padre','0');

     ... yadda yadda yadda ...   

    // formato json en string {nombre:valor, nombre:valor} tambien acepta arrays [{},{}]
    $output = '{idcat_padre:"'.$idcat_padre.'",idcol:"'.$idcol.'",tituloCol:"'.$tituloCol.'"}';
    $this->getResponse()->setHttpHeader("X-JSON", '('.$output.')');
    return sfView::SUCCESS;
  }

lo unico que hay que hacer es:

  • explicitar, en la funcion, los argumentos (request,json) (tanto en el ‘oncomplete’=>’pepe(request,json)’, como en el function pepe(request,json).
  • en la accion (u operacion ajax en el servidor, en general), definir una cabecera X-JSON con un objeto json en formato string, entre parentesis
  • disfrutar de una forma comoda y sencilla de recibir , en el javascript, parametros enviados por el op del servidor.

2 Comments on “Uso de las cabeceras X-JSON”

You can track this conversation through its atom feed.

  1. Leonardo says:

    muy buen aporte…. todo me funciona muy bien, el problema es que solo funciona en mozilla firefox… que debo hacer para que me funcione en todos los navegadores.
    Gracias

  2. JoeZ says:

    Leonardo.
    teoricamente, esto se hace a traves de prototype, y el prototype ha de ser multiplataforma. deberia funcionarte en todos los navegadores. a mi me funciona.

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>