web-dev-qa-db-ja.com

Symfony2 Twigブロックにパラメーターを渡すにはどうすればよいですか?

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のドキュメントを確認しましたが、これを実行できることを示唆するものは何も見つかりませんでしたが、私にとっては、明らかにブロックを使用しているようです。

24
Adil

Symfony 2.2のincludeタグにアップデートがあり、これが役立つかもしれません。これは新しいタグの例です:{{ include('FTWGuildBundle:Help:popover.html.twig', {'content':helpContent,'title':helpTitle}) }}

コントローラーへのサブリクエストを行う必要がないため(renderがこれを行う)、パフォーマンスが向上します。

私の例では、ヘルプポップオーバーのHTMLを含め、タイトルとコンテンツを提供しています。

13
Chris

Symfony v2 +(= 3、4、5、Twig v1.28.0)なので、withキーワードを使用してblock()関数でカスタムテンプレートを使用できます:

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

コミット: https://github.com/twigphp/Twig/commit/02b084e2f5c3119604b1c0da388dd2438a012191

15
kxo

{% render block.table_headers with {'statementType': 'INC'} %}はsymfonyでは認識されません。以下を使用する必要があります。

{% render "yourBundle:controleur:action" with { 'arg1' : 'value1', 'arg2' : 'value2' } %}
8
alex

Twigの マクロ機能 が欲しいようです。別の方法として、ブロックを別のテンプレートとして記述し、 include を使用します。

6
inanimatt

それはあなたにとって価値があるもののために。以下は、コンテンツのブロックをレンダリングする方法の例です。これは、メールを送信するバッチアプリ用であるため、試行しているものとは少し異なりますが、それでも役立つ場合があります

        $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
Chris

別の方法は、Twig拡張機能を作成することです。

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

あなたのTwig関数はヘッダーのレンダリングを処理します

return $this->renderView("MyBundle:Twig:tableHeader.html.twig", array( 'result' => $result));
0
user1041440

キーなしでパラメータを使用してクラスのメソッドを呼び出す

{{ attribute(classname, methodname, [parameter1, parameter2]) }}

キーを持つパラメーターを使用してクラスの任意のメソッドを呼び出す

{{ attribute(classname, methodname, {"parameter1" : parameter1, "parameter2" : parameter2]) }}

配列/オブジェクトのプロパティを取得する

{{ attribute(array, key) }}

0
J Ajay