Как получить доступ к данным в глубоко вложенном шаблоне Twig?

Я только начал использовать Twig, и я впечатлен этим по сравнению с моим собственным механизмом шаблонов. Но одна вещь, которую я не понимаю и разочарован, это то, как получить доступ к данным, как только вы начнете входить во вложенные включения и / или блоки.

Например, в шаблоне я делаю:

<!DOCTYPE html>
<html>
<head>
<title>Index</title>
</head>
<body>
<div id="content">
{% for section in sections %}
<div id="sections">
{% include 'sections.html.twig' %}
</div>
{% endfor %}
</div>
</body>
</html>

Это достаточно просто. Но что если в sections.html.twig У меня есть несколько других включений, которые мне нужно передать данные в цикле? Застрял ли я создавать массивы с каждым фрагментом данных, который мне нужен для всей страницы, перед рендерингом шаблона?

Вот мой PHP-код:

$loader = new \Twig_Loader_Filesystem('path/to/templates');
$twig = new \Twig_Environment($loader);
$template = $twig->load('base.html.twig');

/*
* Build sections array along with all other data I may need
*/

return $template->render(['sections' => $sections);

Это было бы легко преодолеть, если бы я мог вызывать различные методы внутри самого шаблона, но я не могу. Я знаю, что в Symfony вы можете сделать это, но я не использую фреймворк. Я надеюсь, что есть что-то, чего мне не хватает в этой концепции.

0

Решение

Оказывается, подумав о том, как это сделать, я наткнулся на нужную мне информацию. Секрет в том, что вы МОЖЕТЕ вызывать пользовательские функции / методы внутри ваших шаблонов.

$loader = new \Twig_Loader_Filesystem('path/to/templates');
$twig = new \Twig_Environment($loader);
$function = new \Twig_SimpleFunction('functionName', function ($arg1,$arg2) {
return $this->class->method($arg1, $arg2);
});
$twig->addFunction($function);
$template = $twig->load('base.html.twig');

Тогда в вашем шаблоне:

{% set data = functionName('so', 'happy') %}

<div>
// handle your data however you need //
</div>

Если вам не нужно перебирать его, я думаю, что вы можете просто вызвать функцию напрямую, как {{ functionName('arg1', 'arg2') }},

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector