Call PHP function from Twig template
Solution 1
Its not possible to access any PHP function inside Twig directly.
What you can do is write a Twig extension. A common structure is, writing a service with some utility functions, write a Twig extension as bridge to access the service from twig. The Twig extension will use the service and your controller can use the service too.
Take a look: http://symfony.com/doc/current/cookbook/templating/twig_extension.html
Cheers.
Solution 2
There is already a Twig extension that lets you call PHP functions form your Twig templates like:
Hi, I am unique: {{ uniqid() }}.
And {{ floor(7.7) }} is floor of 7.7.
See official extension repository.
Solution 3
I am surprised the code answer is not posted already, it's a one liner.
You could just {{ categeory_id | getVariations }}
It's a one-liner:
Twig2:
$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));
Twig 3:
$this->twig->addFilter(new \Twig\TwigFilter('getVariations','getVariations'));
Twig 3 but as function instead of a filter:
$this->twig->addFunction(new \Twig\TwigFunction('getVariantsFunc', 'getVariations'));
Solution 4
You can check your all defined function by
$arr = get_defined_functions();
print_r($arr);
this will give you array of all functions in if your function exist in it you can use it like:
{{ user.myfunction({{parameter}}) }}
Solution 5
I know this is an old thread. But with symfony 3.3 I did this:
{{ render(controller(
'AppBundle\\Controller\\yourController::yourAction'
)) }}
Reynier
Updated on July 09, 2022Comments
-
Reynier almost 2 years
I have a function in my controller that returns array of entities so in my twig template I do this to iterate over elements:
{% for groupName, entity in items %} <ul> <ul> {% for element in entity %} <li>{{ element.getLabel }}</li> <li><input type="text" name="detail[{{ element.getId }}]" id="pd_{{ element.getId }}" /><input type="text" name="price[{{ element.getId }}]" id="pd_price_{{ element.getId }}" /><input type="text" name="stock[{{ element.getId }}]" id="pd_stock_{{ element.getId }}" /></li> {% endfor %} </ul> </ul> {% endfor %}
In my controller I have also this PHP function:
private function DetailCombination($arr, $level, &$result, $curr = array()) { for ($i = 0; $i < count($arr); $i++) { $new = array_merge($curr, array($arr[$i])); if ($level == 1) { sort($new); if (!in_array($new, $result)) { $result[] = $new; } } else { combinations($arr, $level - 1, $result, $new); } } }
I can call it in this way:
for ($i = 0; $i < count($arr); $i++) { $this->DetailCombination($arr, $i + 1, $result); } // TEST foreach ($result as $arr) { echo join(" ", $arr) . '<br>'; }
It's possible access to the PHP function from Twig template in order to get all the possible combinations of elements in entity? How?
** UPDATE **
This is the function that returns entities processed after by Twig Template:
private function getVariations($category_id) { $items = array(); $em = $this->getDoctrine()->getManager(); $entityCategory = $em->getRepository('CategoryBundle:Category')->find($category_id); foreach ($entityCategory->getProductDetails() as $entity) { if ($entity->getToProduct() == 1) { foreach ($entity->getDetailGroup() as $group) { if (!array_key_exists($group->getName(), $items)) { $items [$group->getName()] = array(); } $items [$group->getName()] [] = $entity; } } } return $items; }