Как передать параметры в блок Symfony2 Twig? - PullRequest
22 голосов
/ 20 мая 2011

Я хочу сгенерировать заголовки таблиц в блоке веток и повторно использовать их по всей странице, на этой странице около 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 и не смог найти ничего, что предполагало бы, что это можно сделать, но мне кажется, что использование блоков очевидно.

Ответы [ 6 ]

12 голосов
/ 13 апреля 2013

В Symfony 2.2 есть обновление для тега include, который может помочь вам в этом.Вот пример нового тега: {{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}

Это может быть то, что вам нужно, так как он избегает необходимости выполнять дополнительный запрос к контроллеру (render делает это), он будет работать лучше.

В моем примере я включаю HTML для всплывающей подсказки и предоставляю заголовок и контент.

10 голосов
/ 08 марта 2017

Теперь (Symfony 2, 3 и 4+) мы можем использовать с синтаксисом :

{% with {
            'myVar1': myValue1,
            'myVar2': myValue2
        }
%}
        {{ block('toolbar', myTemplate) }}
{% endwith %}

Фиксация: https://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191

7 голосов
/ 22 августа 2012

{% render block.table_headers with {'statementType': 'INC'} %} не распознается Symfony. Вы должны использовать:

{% render "yourBundle:controleur:action" with { 'arg1' : 'value1', 'arg2' : 'value2' } %}
6 голосов
/ 03 июня 2011

Звучит так, как вы хотите макросов Twig .Либо напишите свой блок как отдельный шаблон и используйте include .

0 голосов
/ 13 апреля 2013

За то, что оно того стоит для вас.Вот пример того, как я рендерил блоки контента.Это для пакетного приложения, которое отправляет электронные письма, поэтому оно немного отличается от того, что вы пытаетесь, но тем не менее может быть полезным

        $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");
0 голосов
/ 23 августа 2012

Еще бы создать расширение Twig, см.

http://symfony.com/doc/current/cookbook/templating/twig_extension.html

Ваша функция Twig, заботящаяся о рендеринге заголовка

return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( 'result' => $result));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...