Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Call PHP function from Twig template

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; }  
like image 364
Reynier Avatar asked Sep 06 '13 20:09

Reynier


2 Answers

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.

like image 121
createproblem Avatar answered Sep 20 '22 12:09

createproblem


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.

like image 28
umpirsky Avatar answered Sep 20 '22 12:09

umpirsky