私は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行目で、複数の拡張タグが禁止されています
これを達成する他の方法はありますか?
これを試してください:
{% 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/
それをきちんと維持するには、コントローラで定義された変数を基本テンプレートとして使用することにより、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 ));
公式ドキュメント からの回答:
条件付き継承
親のテンプレート名には有効なTwig式を使用できるため、継承メカニズムを条件付きにすることが可能です。
{% extends standalone ? "minimum.html" : "base.html" %}
この例では、スタンドアロン変数がtrueと評価された場合、テンプレートは「minimum.html」レイアウトテンプレートを拡張し、そうでない場合は「base.html」を拡張します。
複数のテンプレートを拡張することはできません。そのため、エラーが発生します。必要な場合は、以下のように配列にプッシュする必要があります。
{% extends ['MyAppCustomBundle::Layout/layout.html.twig', 'FOSUserBundle::layout.html.twig'] %}
ただし、Twigバージョン1.2を使用する必要があります。 twigのドキュメント
これはすべて、このテンプレートまたはそのテンプレートのいずれかを実行することに意味があります。
しかし、別の状況について説明させてください。プロファイルフォームと、ユーザーが個人プロファイルに関連するドキュメントをアップロードできるフォームがあります。プロファイルフォームは既に非常に長いため、ドキュメントは新しいフォームに移動しました。
すべてがうまくいきます。ここで、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のときにこれを拡張するという言い方はありますか?