web-dev-qa-db-ja.com

Twig条件に応じてテンプレートを拡張する

私はSymfony 2をTwigで使用しています。私の質問は非常に簡単です:

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

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

{% block layout_extender %}

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

{% endblock %}

私はこのエラーを受け取ります:

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

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

46
Dan Cearnau

これを試してください:

{% 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/

51
Maerlyn

それをきちんと維持するには、コントローラで定義された変数を基本テンプレートとして使用することにより、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

16
svassr

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

条件付き継承

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

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

この例では、スタンドアロン変数がtrueと評価された場合、テンプレートは「minimum.html」レイアウトテンプレートを拡張し、そうでない場合は「base.html」を拡張します。

6
Benoit

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

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

ただし、Twigバージョン1.2を使用する必要があります。 twigのドキュメント

2
bazingabazinga

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

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

すべてがうまくいきます。ここで、bootstrapタブを使用して、ユーザーフレンドリーのためのプロファイル|ドキュメントを作成します。

ドキュメントを送信するとプロファイルの変更が保存されず、その逆も同様であるので、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になると、失敗してテンプレート ""が見つかりません。

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

または、viewOnlyがtrueのときにこれを拡張するという言い方はありますか?

2
dTHQb