JSON es una forma bastante cómoda de tratar con “objetos” y si lo usamos junto con AJAX puede resultar muy sencillo tratar con respuestas que contienen mas de un elemento, tales como una array o un objeto. En el siguiente ejemplo veremos como usar jQuery y JSON para realizar consultas AJAX en symfony (sin helpers o similares)
Voy a evitar declarar el modelo de datos, por lo que supongo que el lector ya tiene algunos conocimientos básicos de este framework.
1.- El Action
Lo primero que haremos es crear un nuevo método para nuestro action, el objetivo es retornar un texto serializado con información de un usuario.
public function executeAjaxDatosCorredorById(sfWebRequest $request){
/* Asegurar que la solicitud sea AJAX */
if (!$request->isXmlHttpRequest())
return $this->renderText(json_encode(array('error'=>'Sólo respondo consultas vía AJAX.')));
/* si entra por POST o GET la variable sfUserId, continuar */
if($request->getParameter('sfUserId'))
{
$usuario = sfGuardUserPeer::retrieveByPK($request->getParameter('sfUserId'));
/* Crear array asociativo con los atributos del objeto $usuario */
$datosUsuario = array(
"nombre" => $usuario->getProfile()->getNombre(),
"apellidoP" => is_null($usuario->getProfile()->getApellidoP()) ? '' : $usuario->getProfile()->getApellidoP(),
"apellidoM" => is_null($usuario->getProfile()->getApellidoM()) ? '' : $usuario->getProfile()->getApellidoM(),
"rut" => $usuario->getUsername()
);
/* retornar el arreglo en formato JSON */
return $this->renderText(json_encode($datosUsuario));
}
return $this->renderText(json_encode(array('error'=>'Faltan parámetros para realizar la consulta')));
}
Listo. la respuesta está lista para ser “interpretada”. Ahora vamos a ver cómo procesamos la consulta:
2.- La funcion AJAX
Los parámetros de esta función son:
sfAction: es dirección http de la accion de symfony a ejecutar.
idTrigger: Id del elemento DOM que desencadena el evento.
valorParametro: valor que toma laa variable GET['sfUserId']
function getDatosUsuarioById(sfAction, idTrigger, valorParametro)
{
$.ajax(
{
url: sfAction,
data: ({sfUserId: valorParametro}),
dataType: "json",
beforeSend: function()
{
$("#"+idTrigger).append('<span id="cargando_datos"> Cargando datos...');
},
complete: function()
{
$("#cargando_datos").hide();
},
success: function (data, status)
{
$("#propuesta_nombre_contratante").val(data.nombre);
$("#propuesta_apellido_p_contratante").val(data.apellidoP);
$("#propuesta_apellido_m_contratante").val(data.apellidoM);
/* ... etc */
}
error: function (data, status, e)
{
alert('Ocurrió un error cargando los datos solicitados:.\n'+data.error);
}
});
}
En la sección success se puede ver que la respuesta, representada por data, se interpreta como si fuera un objeto.
3.- La puesta en marcha
Para ver el código en funcionamiento debemos agregar el siguiente código en la vista o template en la que necesitemos la función recién implementada. En este ejemplo la función getDatosUsuarioById(…) se dispara al entrar en foco el elemento DOM con Id: propuesta_nombre_contratante. Por otra parte, nótese cómo se declara la variable sfCargaDatosUsuario, se utiliza el helper url_for para crear una ruta, utilizando enrutamiento absoluto, hacia el URL del action a ejecutar.
$(document).ready(function(){
var sfCargaDatosUsuario = "<?php echo url_for('propuesta/ajaxDatosUsuarioById')?>";
$("#propuesta_nombre_contratante").focus(function()
{
if($("#propuesta_cliente_id").val()>0)
{
getDatosUsuarioById(
sfCargaDatosUsuario,
"propuesta_cliente_id",
$("#propuesta_cliente_id").val(),
);
}
});
});
Eso por el momento, espero le sea de utilidad a alguien, iré puliendo esta entrada para que quede más clara.






