49

私はTwigでSymfony2を使用していますが、私の質問は非常に簡単です。

ビューでは、変数に基づいてレイアウトの1つを拡張したいと思います。変数がfalse拡張したい場合、拡張したいUdoWebsiteBundle::layout.html.twig場合。trueUdoWebsiteBundle::layout_true.html.twig

これが私が試したコードです:

{% block layout_extender %}

    {% if intro == 'false' %}
        {% extends 'UdoWebsiteBundle::layout.html.twig' %}
    {% else %}
        {% extends 'UdoWebsiteBundle::layout_true.html.twig' %}
    {% endif %}

{% endblock %}

このエラーが発生します:

7行目の「UdoWebsiteBundle:home:home.html.twig」では、複数の拡張タグが禁止されています

これを達成する他の方法はありますか?

4

5 に答える 5

65

これを試してください:

{% extends intro == 'false' 
    ? 'UdoWebsiteBundle::layout.html.twig' 
    : 'UdoWebsiteBundle::layout_true.html.twig' %}

ここから取ったアイデア: http://jorisdewit.ca/2011/08/27/extending-different-layouts-for-ajax-requests-in-twig-symfony2/

于 2011-10-22T17:53:19.310 に答える
18

きちんと保つには、コントローラーで定義された変数をベーステンプレートとして使用して、Twig動的継承サポートを使用する必要があります。

{% extends parent_template_var %}

変数がTwig_Templateオブジェクトに評価される場合、Twigはそれを親テンプレートとして使用します。

コントローラでparent_template_varを定義します。

if($intro == 'false')
    $parent_template_var = 'UdoWebsiteBundle::layout.html.twig';
}else{
    $parent_template_var = 'UdoWebsiteBundle::layout_true.html.twig';
}
return $this->render('::/action.html.twig', array('parent_template_var' => $parent_template_var ));

http://twig.sensiolabs.org/doc/tags/extends.html

于 2012-04-13T14:31:57.320 に答える
9

公式ドキュメントからの回答:

条件付き継承

親のテンプレート名は任意の有効なTwig式にすることができるため、継承メカニズムを条件付きにすることができます。

{% extends standalone ? "minimum.html" : "base.html" %}

In this example, the template will extend the "minimum.html" layout template if the standalone variable evaluates to true, and "base.html" otherwise.

于 2013-02-15T20:40:42.550 に答える
2

複数のテンプレートを拡張することはできません。そのため、エラーが発生します。必要に応じて、以下のような配列にそれらをプッシュする必要があります。

{% extends ['MyAppCustomBundle::Layout/layout.html.twig', 'FOSUserBundle::layout.html.twig'] %}

ただし、これを行うにはTwigバージョン1.2を使用する必要があります。 小枝のドキュメント

于 2012-02-21T20:57:55.717 に答える
2

これは、このテンプレートまたはそのテンプレートのいずれかを実行するのに意味があります。

しかし、別の状況を説明させてください。プロファイル フォームと、ユーザーが個人プロファイル関連のドキュメントをアップロードできるフォームがあります。プロファイル フォームがすでに非常に長いため、ドキュメントは新しいフォームに移動しました。

すべてがうまく機能します。ここで、ブートストラップ タブを使用してプロファイルを実行したいと考えています。ユーザーフレンドリーのためのドキュメント。

2 つの別々のフォームを使用しているため、ドキュメントを送信するとプロフィールの変更が保存されず、その逆も同様であることがわかりました。

を使用してタブにドキュメントフォームを追加しました

<div role="tabpanel" class="tab-pane" id="documents">
    {{ render(controller('ManyAppBundle:Document:createDocument', {'viewOnly': true})) }}
</div>

'viewOnly': true はクエリ パラメータであり、アクションには必要ありません。

私の質問は、プロファイルタブがドキュメントテンプレートをレンダリングする場合、アップロードウィジェットと送信のみを表示する必要があるのに対し、ドキュメントページに直接移動するときは、タイトルとサイドバーとすべてを表示する必要があります. だから私は試しました

{% if not viewOnly %}
    {% extends ... %}
{% endif %}

if 内で extends を使用できないため、問題が発生しました。他の回答で提案したように、使用してみてください

{% extends viewOnly == true ? ... %}

これにより、viewOnly が false の場合のコードの実行までの Twig の問題が解決されました。

viewOnly が false の場合、他のすべてのテンプレートで使用される基本テンプレートを拡張する必要がありますが、true の場合はこれだけを表示したい:

{{ form_start(form, { 'style': 'horizontal', 'col_size': 'sm' }) }}
    {% if form.documents is defined %}
        {{ form_row(form.documents) }}
    {% endif %}

    {{ form_row(form.submit, { 'attr': { 'class': 'btn btn-success' } }) }}
{{ form_end(form) }}

でも今はトップで

{% extends viewOnly == true ? ... %}

viewOnly が false になると、Template "" can't be found で失敗します。

テンプレートを拡張しない場合と同じ結果になる、この特定のテンプレートを拡張すると言う方法はありますか?

または、代わりに、viewOnly が true のときにこれを拡張すると言う方法がありますが、失敗しても何も起こりませんか?

于 2015-05-08T09:27:42.753 に答える