Я только начал использовать 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 вы можете сделать это, но я не использую фреймворк. Я надеюсь, что есть что-то, чего мне не хватает в этой концепции.
Оказывается, подумав о том, как это сделать, я наткнулся на нужную мне информацию. Секрет в том, что вы МОЖЕТЕ вызывать пользовательские функции / методы внутри ваших шаблонов.
$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') }}
,
Других решений пока нет …