¿Cómo puedo pasar un parámetro entre 2 Actions de un mismo controlador en Symfony?

24 views
Skip to first unread message

Jesus Barrera

unread,
Nov 16, 2015, 1:35:47 PM11/16/15
to Symfony Madrid
Mi aplicación consiste en generar un formulario donde el usuario introducirá valores en distintos campos. Si el formulario es válido, se ejecutará una búsqueda contra MongoDB de acuerdo filtrando por los valores introducidos en el formulario. El siguiente paso es redendizar para presentar los datos que ha devuelto la búsqueda contra MongoDB. En esa redendización, tengo un botón para exportar a un fichero en formato CSV/Excel/JSON los datos devueltos por la búsqueda contra MongoDB. Es en este paso donde no sé cómo pasar al Action de Exportación los datos devueltos por la búsqueda contra MongoDB.

En el Controlador DefaultController.php codifico:
class DefaultController extends Controller {
//.....
    public function searchSumarioBOEAction (Request $request)
    {
//Inicio de searchSumarioBOEAction
//....
$sumarioBOE=new boe1();
$form = $this->createForm(new searchSumarioBOEType(), $sumarioBOE, array ('method' => 'GET',));     
        $form->handleRequest($request);
//......
if ($form->isValid()) {
$datos= //Ejecutar Query contra MongoDB
return $this->render('jbdMEBIBD2015FEBBundle:Default:resultado.html.twig', array('datos' => $datos));
}
//...
//Fin de searchSumarioBOEAction
}
public function generateCsvAction($datos)
{
//Código para exportar a CSV los $datos obtenidos tras Ejecutar Query contra MongoDB
//....
//....
}
}

La plantilla twig resultado.html.twig es:

{% block body %}
<a href="{{ path('generateCsv', {'datos': datos}) }}">Export as Excel</a>
{# table body #}
{% for dato in datos %}
{% if dato.item is not null%}
<table>
    <tr>
        <td><h2><a href="http://www.boe.es{{dato.urlPdf}}">{{ dato.item }}</a></h2></td>       
    </tr>  
    <tr>
        <td>Fecha: {{dato.fechaPub }}</td>
    </tr>    
    <tr>
        <td>Departamento: {{dato.departamento }}</td>
    </tr> 
    <tr>
        <td>Sección: {{dato.NombreSeccion }}</td>
    </tr>       
    <tr>
        <td>Epígrafe: {{dato.epigrafe }}</td>
    </tr>   
    <tr>
        <td>Título: {{ dato.titulo }}</td>       
    </tr>
</table>
{% endif %}
{% else %}
<table>
    <tr>
        <td>No hay resultados.</td>
    </tr>
</table>
{% endfor %}
{% endblock %}

El fichero routing.yml es el siguiente:

searchBOE:
    path:     /searchSumarioBOE
    defaults: { _controller: jbdMEBIBD2015FEBBundle:Default:searchSumarioBOE }
generateCsv:
    pattern: /generateCsv
    defaults: {_controller: jbdMEBIBD2015FEBBundle:Default:generateCsv }

¿Cómo puedo pasar un parámetro entre 2 Actions de un mismo controlador en Symfony? Es decir, ¿cómo puedo pasar el valor $datos entre el Action searchSumarioBOEAction y el Action generateCsvAction? El Action generateCsvAction se ejecutará cuando el usuario pulse sobre el botón de Exportar a Excel después de la redendización de searchSumarioBOEAction.

Muchas gracias.

Un saludo.

daniel....@freelancemadrid.es

unread,
Nov 16, 2015, 4:35:24 PM11/16/15
to symfony...@googlegroups.com

2015-11-16 19:35 GMT+01:00 Jesus Barrera <jesus....@bluetab.net>:
¿Cómo puedo pasar un parámetro entre 2 Actions de un mismo controlador en Symfony?

Ya lo tienes echo aquí.

{{ path('generateCsv', {'datos': datos}) }}

Hay otras formas de pasar información pero en este caso, utilizar un parametro get es una forma correcta de hacerlo.

Saludos!
--
-------------------------------------------------------------------------------------
Daniel González Cerviño
Developer http://desarrolla2.com
Tel (+34) 653 96 50 48
Mail daniel....@freelancemadrid.es
Twiter: http://twitter.com/desarrolla2
Linkedin: http://www.linkedin.com/in/desarrolla2
Github: https://github.com/desarrolla2
-------------------------------------------------------------------------------------

Jesus Barrera

unread,
Nov 16, 2015, 5:00:05 PM11/16/15
to Symfony Madrid
Buenas tardes:

Cuando pulso sobre el link Export as Excel, aparece el siguiente error:

Controller "jbd\MEBIBD2015FEBBundle\Controller\DefaultController::generateCsvAction()" requires that you provide a value for the "$datos" argument (because there is no default value or because there is a non optional argument after this one). 

En la plantilla twig hago la llamada:

<a href="{{ path('generateCsv', {'datos': datos}) }}">Export as Excel</a>

Muchas gracias.

Un saludo.

daniel....@freelancemadrid.es

unread,
Nov 17, 2015, 3:06:28 AM11/17/15
to symfony...@googlegroups.com

2015-11-16 23:00 GMT+01:00 Jesus Barrera <jesus....@bluetab.net>:
Controller "jbd\MEBIBD2015FEBBundle\Controller\DefaultController::generateCsvAction()" requires that you provide a value for the "$datos" argument (because there is no default value or because there is a non optional argument after this one). 


Hola Jesús.

change this:
public function generateCsvAction($datos)

for this:
public function generateCsvAction(Request $request){
    $datos = $request->get('datos');

No tienes bien mapeado $datos en el routing, dale un nuevo vistazo a los capítulos de routing, para saber más.

Jesus Barrera

unread,
Nov 17, 2015, 5:39:38 AM11/17/15
to Symfony Madrid
Buenos días:

¿Debería modificar también la plantilla twig?

En la ruta, ¿debería tener

generateCsv:
    pattern: /generateCsv/$datos
    defaults: {_controller: jbdMEBIBD2015FEBBundle:Default:generateCsv }
?

Si no quisiera pasar a generateCsv la request completa sino solo los valores proporcionados en el formulario, ¿cómo podría hacerlo?

Muchas gracias.

Un saludo.

Jorge Paredes Pérez

unread,
Nov 17, 2015, 5:47:31 AM11/17/15
to symfony...@googlegroups.com
Hola,

Debería ser:

generateCsv:
    path: /generateCsv/{datos}
    defaults: {_controller: jbdMEBIBD2015FEBBundle:Default:generateCsv }

o si es opcional el parámetro

generateCsv:
    pattern: /generateCsv/{?datos}
    defaults: {_controller: jbdMEBIBD2015FEBBundle:Default:generateCsv }

No? 

En el hilo que he leído, en un inicio no adjuntas datos en la ruta creo.



Salu2!

___

 Jorge Paredes
 Diseño Gráfico / Web
 Programación Web
 Fotografía
 677 27 13 92

http://www.quasarweb.es  

             



--
Has recibido este mensaje porque estás suscrito al grupo "Symfony Madrid" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a symfony_madri...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Reply all
Reply to author
Forward
0 new messages