I want to retrieve Cities names from a table in the database and put them as options in a select input (combobox) which is defined in ‘layout.html.twig’ . All my views extends ‘layout.html.twig’, so how can I access to cities names in every page?
[Solution]I’m not able to respond to my topic ,I didn’t have much reputation so I edit my topic
I have found the solution, using “embedding controllers”
-
first I’ve created an action to retreive all cities names:
public function listCitiesAction(){ // retreiving cities $entities = $this->getDoctrine()->getRepository("MedAdBundle:City")->findAll(); return $this->render('MedAdBundle:Ville:list_cities.html.twig', array('entities' => $entities)); }
-
this action render list_cities.html.twig defined as :
<select class="form-control"> {% for entity in entities %} <option>{{ entity.name}}</option> {% endfor %} </select>
-
finnaly I edit my layout.html.twig
<div> {{ render(controller('MedAdBundle:City:listCities'))}} </div>
In this way I can access to cities combobox in every page in my app 😉
Another nice way would be use render.
This allows you to call a controller out of your layout.html.twig
{{ render(controller("AcmeDemoBundle:Helper:citySelector")) }}
you also can cache the output with ESI.
Answer:
It’s well explained in the cookbook.
http://symfony.com/doc/current/cookbook/templating/global_variables.html
Answer:
I would go with these steps:
- Write a form hosting a symfony entity field configured to work with the Cities table
- Define this form as a service in the DIC
- Define a twig extension that exposes a function to output the form HTML
- Use the twig function in the layout.html.twig that is extended by all the other templates
As an optimization I would look how I could wire Doctrine with some caching system (e.g. memcached) to avoid hitting the database on each page load.
This is where you can find documentation about the entity field: http://symfony.com/doc/current/reference/forms/types/entity.html
Use the Symfony documentation to find how to define a form as a service and how to write your own twig extension.