Вызов функции PHP из шаблона Twig

У меня есть функция в моем контроллере, которая возвращает массив сущностей, поэтому в моем шаблоне ветки я делаю это для перебора элементов:

{% 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 %}

В моем контроллере у меня есть и эта функция PHP:

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

Я могу назвать это следующим образом:

for ($i = 0; $i < count($arr); $i++) {
    $this->DetailCombination($arr, $i + 1, $result);
}

// TEST
foreach ($result as $arr) {
    echo join(" ", $arr) . '<br>';
}

Возможно ли доступ к функции PHP из шаблона Twig, чтобы получить все возможные комбинации элементов в сущности? Как?

** ОБНОВЛЕНИЕ **

Это функция, которая возвращает объекты, обработанные после шаблона Twig:

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

Ответы

Ответ 1

Невозможно напрямую получить доступ к любой функции PHP внутри Twig.

Что вы можете сделать, это написать расширение Twig. Общая структура заключается в написании службы с некоторыми полезными функциями, напишите расширение Twig как мост для доступа к службе с веточкой. Расширение Twig будет использовать сервис и ваш контроллер также может использовать службу.

Посмотрите: http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Приветствия.

Ответ 2

Существует уже расширение Twig, которое позволяет вам вызывать функции PHP из ваших шаблонов Twig, например:

Hi, I am unique: {{ uniqid() }}.

And {{ floor(7.7) }} is floor of 7.7.

См. официальный репозиторий .

Ответ 3

Пока я согласен с комментариями о передаче переменных с вашего контроллера, вы также можете регистрировать функции undefined при настройке среды ветки

$twig->registerUndefinedFunctionCallback(function ($name) {
        // security
        $allowed = false;
        switch ($name) {
            // example of calling a wordpress function
            case 'get_admin_page_title':
                $allowed = true;
                break;
        }

        if ($allowed && function_exists($name)) {
            return new Twig_Function_Function($name);
        }

        return false;
    });

Это из Страница рецепта Twig

Не пробовал вызывать функцию на объекте в качестве запрошенного исходного вопроса

Ответ 4

Вы можете проверить свою определенную функцию на

$arr = get_defined_functions();
print_r($arr);

это даст вам массив всех функций, если ваша функция существует в нем, вы можете использовать его как:

 {{ user.myfunction({{parameter}}) }}

Ответ 5

Принятый ответ createproblem является правильным. Но если вы действительно знаете, что делаете, и вы не против злых путей, это единственное дополнительное расширение Twig, которое вам когда-либо понадобится:

function evilEvalPhp($eval, $args = null)
{
    $result = null;
    eval($eval);
    return $result;
}

P.S. Единственная причина использовать Twig вместо PHP в качестве шаблона языка: бесконечная скука!

Ответ 6

Я удивлен, что ответ на код уже не отправлен, это один лайнер.

Вы можете просто {{ categeory_id | getVariations }}

Это однострочный:

$twig->addFilter('getVariations', new Twig_Filter_Function('getVariations'));

Ответ 7

Я знаю, что это старый поток. Но с symfony 3.3 я сделал это:

{{ render(controller(
    'AppBundle\\Controller\\yourController::yourAction'
)) }}

Документы Symfony