3

Symfony2とTwigを使用して、ブロックのみを含むファイルを常に利用できるようにする方法はありますか?

たとえば、「cookie」という名前のブロックを、使用しているテンプレートに常に含めたり拡張したりすることなく、システム内の任意のテンプレートで常に使用できるようにしたい場合です。

何か案は?


明確化

次のような何かを実行できる汎用ブロックがあるとします。

{% block myBlock %}
    ABC Examples
{% endblock %}

このブロックでレンダリングしたいことを知っているクラスがあります。私のテンプレート自体は必ずしもこれを知っているわけではありません。

 {{ block(myObj.blockName) }}

それから私はそれを持っていたいので、私のコントローラー/サービス/など。テンプレートが実際にそれについて直接知る必要なしに、そのブロックを含むファイルを登録することができます(したがって、それぞれがいくつかの共通のインターフェースで動作するような複数のファイルを持つことができます)。

カスタムTwig関数をTwigExtensionに登録するのと似ています。私のテンプレートは、そこにあることを明示的に知る必要はありません。実行時に利用可能である必要があります。

それは理にかなっていますか?


もう少し明確にするために、私は基本的に、Symfony2でフォームをレンダリングするためのデフォルトのTwigブロックがあるのと同じようなことをしたいと思っています。何かを変更したいときだけ、毎回デフォルトのフォームファイルを含める必要はありません。

4

2 に答える 2

2

私は自分の答えを見つけるためにSymfonyのソースコードを調べに行きました。構成ファイルまたはコントローラーから直接それを埋め込むための凝った、きちんとした方法がないように見えます。これは少し残念ですが、大したことではありません。

したがって、私の状況を解決するために、「use」キーワードを使用してブロックファイルをベーステンプレートに含め、他のすべてのファイルで使用できるようにします。

{# widget_blocks.html.twig #}
{# Widgets #}
{% block my_widget %}
    ABC Cookies
{% endblock %}

{# base.html.twig #}
{% use widget_blocks.html.twig %}
{{ block(my_widget.block) }}

正確には私が望んでいたものではありませんが、十分に近いです。

于 2013-02-07T00:25:18.940 に答える
0
{% render 'MyMainBundle:Default:credits' with {'arg1': $myObj } %}

それは私が言った事です。上記の行との違いは何ですか

{{ block(myObj.blockName) }}

カスタムフィルターを登録することはできますが、私が知る限り、それは文字列値のみを返します。http://twig.sensiolabs.org/doc/advanced.html#id2

于 2013-02-05T18:38:09.317 に答える