19

I have a xxx.html.twig file which shows a page, but when I want to refresh the page with different data and just update it with new data, I have a select and a submit button for it. The thing is that I don't know how do I call an action in the controller which I pass parameters to from my twig and call for new data and then I render the same twig template again with new parameters.

How do I do so?

Alon
  • 3,734
  • 10
  • 45
  • 64

3 Answers3

41

Here are a few different ways:

{{ render(app.request.baseUrl ~ '/helper/test', {"hostid2": hostid } ) }}

or

{% include 'MyCoreBundle:Helper:test.html.twig' with {"hostid2": hostid } only %}

or

{% render controller("MyCoreBundle:Helper:test", {'hostid2': hostid}) %}
someuser
  • 2,279
  • 4
  • 28
  • 39
  • could you explain briefly what the `only` at the end of the `include` is for please? – Veve Jan 09 '15 at 08:32
  • Nevermind, I've found a good explaination here : http://stackoverflow.com/q/9935551/4074148 – Veve Jan 12 '15 at 02:50
  • Ahh love between mans :) I've found a bug trying to do: {# any for loop #} {{ render(app.request.baseUrl ~ '/helper/test', {"hostid2": forloop.var } ) }} {# endfor #} Even that the different values get inside the rendered controller, in the final template, they do not change. I'm tearing my white hairs out with this one. – Martin Fasani Feb 05 '15 at 15:18
  • 1
    Note that `{% render %}` is now deprecated, it is replaced by `{{ render() }}`. – SteeveDroz Jun 09 '15 at 09:26
33

Symfony 2.1:

{% render 'YourBundle:YourController:yourAction' with {'var': value} %}

Symfony 2.6+:

{{ render(controller('YourBundle:YourController:yourAction', {'var': value})) }}

And, of course, read the documentation.

1ed
  • 3,668
  • 15
  • 25
Vitalii Zurian
  • 17,858
  • 4
  • 64
  • 81
0

I think some parts are depricated here. To make the include work in latest Symfony 3.1.10, I solved it like this:

{% extends 'base.html.twig' %}
{% block body %}
    {{ include('AppBundle:Default:inner_content.html.twig') }}
{% endblock %}

Note: include() with parentheses. Then all the variables are included from the parent template. If you like to restrict some variables in the child template, you use with ... only (look over)