Как передать параметры в блок Symfony2 Twig?
Я хочу генерировать заголовки таблиц в блоке ветки и повторно использовать их на странице, на этой странице имеется около 5 разных таблиц с примерно одинаковыми заголовками. Блок-код таков:
{% block table_headers %}
<th>Fiscal Year</th>
<th>End Date</th>
<th>Period Length</th>
{% for item in result.FinancialStatements.COAMap.mapItem %}
{% if item.statementType == statementType %}
<th>{{ item._ }} ({{ item.coaItem }})</th>
{% endif %}
{% endfor %}
{% endblock %}
Ключевая строка в приведенном выше коде
{% if item.statementType == statementType %}
Я хочу передать statementType в качестве параметра, где я выполняю блок, например:
{% render block.table_headers with {'statementType': 'INC'} %}
Но это не работает. Я хочу сохранить блок и его рендеринг в том же файле (но разные блоки), для концептуальной близости.
Можно ли использовать блоки как это? Я просмотрел документы Symfony2 и не нашел ничего, что могло бы сделать это, но это кажется очевидным использованием блоков для меня.
Ответы
Ответ 1
Обновлен тег include в Symfony 2.2, который может помочь вам в этом. Вот пример нового тега:
{{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}
Это может быть то, что вам нужно, поскольку оно позволяет избежать необходимости выполнять подпросу для контроллера (render
делает это), он будет лучше выполнять.
В моем примере я включаю HTML для получения справки и предоставления заголовка и контента.
Ответ 2
Теперь (Symfony 2, 3 и 4+) мы можем использовать с синтаксисом:
{% with {
'myVar1': myValue1,
'myVar2': myValue2
}
%}
{{ block('toolbar', myTemplate) }}
{% endwith %}
Фиксация: https://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191
Ответ 3
{% render block.table_headers with {'statementType': 'INC'} %}
не распознается Symfony. Вы должны использовать:
{% render "yourBundle:controleur:action" with { 'arg1' : 'value1', 'arg2' : 'value2' } %}
Ответ 4
Похоже, вы хотите, чтобы функция макросов Twig . Альтернативно напишите свой блок как отдельный шаблон и используйте include.
Ответ 5
Другим было бы создание расширения Twig, см.
http://symfony.com/doc/current/cookbook/templating/twig_extension.html
Функция Twig, заботясь о рендеринге заголовка
return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( 'result' => $result));
Ответ 6
Для чего это стоит вам. Вот пример того, как я отобразил блоки контента. Это для пакетного приложения, которое отправляет электронные письма, поэтому оно немного отличается от того, что вы пытаетесь, но тем не менее может быть полезно
$templateContent = $this->getContainer()->get('twig')->loadTemplate('FTWGuildBundle:AuctionNotification:notificationEmail.html.twig');
$body = $templateContent->renderBlock('body', array('siteDomain' => $siteClient->getSiteDomain(), 'staticContentDomain' => $siteClient->getStaticContentDomain(), 'batch' => $batch->getNotifications(), 'auction_notification_lockout_period' => $this->getContainer()->getParameter('auction_notification_lockout_period')));
$subject = ($templateContent->hasBlock("subject")
? $templateContent->renderBlock("subject", array('batchSize' => $batch->getSize(), 'batch' => $batch))
: "Auction House Notifications");
Ответ 7
Вызов любого метода класса с параметрами без ключа
{{ attribute(classname, methodname, [parameter1, parameter2]) }}
Вызов любого метода класса с параметрами с ключом
{{ attribute(classname, methodname, {"parameter1": parameter1, "parameter2": parameter2]) }}
Получить свойство массива/объекта
{{ attribute(array, key) }}