llamar a un controlador desde javascript con ajax

7,511 views
Skip to first unread message

joselito

unread,
May 1, 2012, 2:56:49 PM5/1/12
to symfony-es
Se podria hacer eso? es que quiero que al darle a un boton genere un
pdf y entonces tendria que llamar a un controlador que tiene
implementada la generacion del pdf con el bundle que trae symfony2.


Un saludo y muchas gracias.

Carlos Zuniga

unread,
May 1, 2012, 4:55:53 PM5/1/12
to symfo...@googlegroups.com
2012/5/1 joselito <parad...@gmail.com>:
> Se podria hacer eso? es que quiero que al darle a un boton genere un
> pdf y entonces tendria que llamar a un controlador que tiene
> implementada la generacion del pdf con el bundle que trae symfony2.
>

Respuesta corta: Si.

Respuesta larga: Symfony se comunica mediante Requests. Le envías un
Request a una url, Symfony la enruta hacia un controlador y devuelve
un objeto Response. Sea una petición AJAX o no.


Pretendes devolver el pdf directamente o generar el archivo y
guardarlo? una idea es generarlo y devolver un JSON con la url del
pdf.

Saludos
--
Linux Registered User # 386081
A menudo unas pocas horas de "Prueba y error" podrán ahorrarte minutos
de leer manuales.

joselito

unread,
May 1, 2012, 7:31:37 PM5/1/12
to symfony-es
Muchas gracias por responder Carlos. lo que pretendo es generarlo y
guardarlo.
Aunque tambien me serviria todo esto para cuando le diese a un boton
mandar un mail con el sistema que trae symfonmy para mandar email.
osea capturar el evento onclick del boton y desde ayi lalmar a un
controlador que me mande el email.

te pongo las dudas que tengo:

function objetoAjax(){
var xmlhttp=false;
try {
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlhttp = false;
}
}
if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
xmlhttp = new XMLHttpRequest();
}
return xmlhttp;
}

ajax=objetoAjax();   var nTds = $('td',
this.parentNode.parentNode); var id = $(nTds[0]).text(); var url
=     ajax.open("GET", url,true);        ajax.send(null);   
});

Imagina algo como eso. de esa forma cojo el id de una tabla y en la
variable url le deberia de pasar la url de un controlador no? como
seria???
Cuando le ponga esa url en el controlador cojeria las variables con el
metodo request de esta forma:

$request = $this->get('request');
$request->isXmlHttpRequest(); // miro si es una peticion de ajax
$request->query->get('id'); //cojo el id de una peticion de forma
loquesea.php?id=loquesea

Para que valdria el response? como pongo esa url?

un saludo y mcuahs gracias

joselito

unread,
May 1, 2012, 8:12:00 PM5/1/12
to symfony-es
Hola de nuevo, como el metodo get recoje las variables de esta forma
loquesea.php?nombre=loquesea . el metodo get no me sirve para llamar a
un controlador.

para llamar a un controlador tendria que usar el metodo post el cual
no manda la cadena del ? y se cojerai de la siguiente manera:

$request->request->get('page');

Estoy en lo cierto? alguna ayuda? un saludo.

Carlos Zuniga

unread,
May 1, 2012, 8:47:25 PM5/1/12
to symfo...@googlegroups.com
2012/5/1 joselito <parad...@gmail.com>:
Si la llamada es para hacer algo no trivial (guardar o envíar algo),
es mejor que utilices POST. Si son muchos parámetros, lo mejor sería
que crees un Form Type para manejarlo.

Por cierto, por tu código ejemplo, parece que utilizas jquery.

Si es así, deberías de usar la implementación de ajax que tiene para
no tener que estar haciendo el tuyo propio, algo así:

$.ajax({
type: "POST",
url: "/ruta/",
data: { id: $('selector').text }
}).done(function( msg ) {
alert( "Data Saved: " + msg );
});

joselito

unread,
May 2, 2012, 7:31:52 AM5/2/12
to symfony-es
Gracias por las respuestas Carlos. Me ha servido de gran ayuda. de un
código super largo hago una llamada de la siguiente manera usando el
jquery.
$.ajax({url: url1});

Le paso la url preparada con su parámetros y listo me imagino que se
pasara mediante get si no se especificada nada puesto que me funciona.

Ahora el problema lo tengo para llamar a un cotrolador.
Cuando pulso en un botón hago esto:

$('#pruebaa').live('click', function () {
var url1 = "http://localhost/jquery/web/app_dev.php/web/pruebita";
alert(url1);
$.ajax({
type: "POST",
url: url1,
data: {nombre: "pepe"}
}).done(function() {
alert( "Datos grabados");}
})

routing.yml

pruebita:
pattern: web/pruebita/{nombre}
defaults: { _controller: miomioBundle:Pruebita:pruebita }

pruebitacontroller

class PruebitaController extends Controller
{

public function pruebitaAction($nombre)
{
return $this-
>render('miomioBundle:Pruebita:index.html.twig',array('nombre' =>
$nombre));
}
}

vista
{% extends '::base.html.twig' %}

{% block title %}Bienvenido a la gestion{% endblock %}

{% block body %}
<h3> {{ nombre }}</h3>

{% endblock %}

El problema es que no se como ejecutar el controlador por ajax cuando
le pulse el botón. Creo que el error esta cuando le meto la url.

muchas gracias de nuevo Carlos.

Carlos Zuniga

unread,
May 2, 2012, 2:14:19 PM5/2/12
to symfo...@googlegroups.com
2012/5/2 joselito <parad...@gmail.com>:
Exacto, tu controlador funciona con una ruta `/web/pruebita/{nombre}`,
por ejemplo `/web/pruebita/pepe`, pero en tu javascript estas abriendo
una url `/web/pruebita/`, por lo que la variable $nombre queda en
blanco.

No confundas las variables en las rutas con variables GET. Las
variables en las rutas te llegan como parámetros en el controlador,
mientras que a las variables GET puedes acceder mediante
`$this->getRequest()->query->get('nombre')`.

En tu caso, cambiaría el patrón de tu ruta a `/web/pruebita` y la el
controlador a:

public function pruebitaAction()
{
return $this->render('miomioBundle:Pruebita:index.html.twig',
array('nombre'
=>$this->getRequest()->query->get('nombre')));
}

Y mucho mejor, cambiarlo a POST y usar getRequest()->request en lugar de query.

joselito

unread,
May 2, 2012, 8:33:47 PM5/2/12
to symfony-es
Hola Carlos. He estado de nuevo probando y tengo esto:

$('#pruebaa').live('click', function () {
var url1 = "http://localhost/jquery/web/app_dev.php/web/
pruebita";
alert(url1);
$.ajax({
type: "GET",
url: url1,
data: {nombre: "pepe"}
}).done(function() {
alert( "Datos grabados");})
})

pruebita:
pattern: web/pruebita
defaults: { _controller: miomioBundle:Pruebita:pruebita }
<?php

namespace mio\mioBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class PruebitaController extends Controller
{

public function pruebitaAction()
{
return $this-
>render('miomioBundle:Pruebita:index.html.twig',array('nombre' =>
$this->getRequest()->query->get('nombre')));
}
}

Entonces cuando me meto en el sistema tengo algo como esto:

http://www.subirimagenes.com/imagen-capturadepantalla-7668829.html

si le doy al botón y luego me logueo me hace esto :

http://www.subirimagenes.com/imagen-capturadepantalla-7668816.html

es decir creo que lo hace bien. aunque si cambio el método por POST y
recojo la variable por request y no por query no muestra el mensaje
pepe. no se que pasa.


pero al darle al botón inicio y luego al darle al botón de ajax otrava
vez dice que carga bien los datos pero no ocurre nada. no tendria que
llevarme de nuevo al mismo sitio que antes?

osea no entiendo pq cuando pulso el botón sin estar logueado al
loguearme se va al pruebita.html.twig. y cuando ya estoy logueado le
doy dice que carga bien los datos pero no hace nada.esto ultimo es lo
que me mosquea.

creo que me estoy liando o no entiendo nada jajaj un saluido tiooo y
gracias.

JotaJota

unread,
May 4, 2012, 9:14:56 AM5/4/12
to symfo...@googlegroups.com
Tengo el mismo problema, no se que URL he de poner a la funcion de ajax y inicie la funcion Action de la clase del controlador... Si alguien sabe como hacerlo podria poner un ejemplo sencillo del codigo Jquery, controlador, vista y ruta si es necesaria(que no lo tengo claro).

un saludo a todos.


Danny alfonzo Viana perez

unread,
May 4, 2012, 9:55:03 AM5/4/12
to symfo...@googlegroups.com
facil, deben instalar un bundle llamado FOSJsRoutingBundle que hace posible generar rutas desde javascript:

ejemplo:
después de instalar el bundle, usarlo importando estas dos js en la plantilla

<script type="text/javascript" src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script type="text/javascript" src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>

luego en javascript:

mivariable  = 25
ruta = Routing.generate('albuns', { 'id': mivariable });

funcionajax(ruta,formato,etc,etc);

esa es la idea

JotaJota

unread,
May 4, 2012, 7:13:12 PM5/4/12
to symfo...@googlegroups.com
Muchas gracias Danny tiene buena pinta, he leido la doc, y esto es justamente lo que necesitaba, mil gracias :)

juan vexenat

unread,
Jan 3, 2013, 11:53:59 AM1/3/13
to symfo...@googlegroups.com
Tal ves sirva http://sf2.showmethecode.es/app.php/ejemplo/

El 3 de enero de 2013 10:12, Jaume Pomes <jaume...@gmail.com> escribió:
Muchas gràcias Danny!

He perdido mucho tiempo con este problema.


El divendres 4 de maig de 2012 15:55:03 UTC+2, Danny alfonzo Viana perez va escriure:

--
Has recibido este mensaje porque estás suscrito al grupo "symfony-es" de Google Groups.
Para publicar en este grupo, envía un email a symfo...@googlegroups.com
Para darte de baja, envía un email a symfony-es+...@googlegroups.com
El resto de opciones puedes encontrarlas en http://groups.google.com/group/symfony-es?hl=es

Juan Martín Díaz

unread,
Jan 3, 2013, 4:45:16 PM1/3/13
to symfo...@googlegroups.com
Hola, me gustaría saber cual es la aplicación de esto y que ventaja tiene a almacenar la ruta de un action en una variable javascript desde twig.
¡Muchas gracias!
Reply all
Reply to author
Forward
0 new messages