Call PHP function from Twig template

125,229

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'
)) }}

Symfony docs

Share:
125,229
Reynier
Author by

Reynier

Updated on July 09, 2022

Comments

  • Reynier
    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;
    }