Smarty でできること
{$var = 'bla' scope=parent}
Twigで可能ですか?
ブロックの使用を提案しないでください。知っている。変数が必要です。
Smarty でできること
{$var = 'bla' scope=parent}
Twigで可能ですか?
ブロックの使用を提案しないでください。知っている。変数が必要です。
フィルターを使用したくない場合default()
(つまり、親テンプレートと子テンプレート全体で変数を複数回使用したい場合) は、親テンプレートでページ全体を含むブロックを実際に定義してから、その中の他のブロック:
{# base.twig #}
{# Default page properties. You can override these in the `page` block of your child templates. #}
{% set page = page | default({}) | merge({
"title" : "My Default Title",
"description" : "Default description"
}) %}
{% block page %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="{{ page.description }}">
<title>{{ page.title }}</title>
...
</head>
<body>
{% block content %}{% endblock %}
</body>
</html>
{% endblock %}
次に、値を設定してから呼び出すことにより、子テンプレートpage
のブロック内の変数をオーバーライドできます。page
parent()
{# child.twig #}
{% extends "base.twig" %}
{% block page %}
{# By putting this in a special block, we ensure that it will be set AFTER the default values are set in the parent template,
but BEFORE the page itself is rendered. #}
{% set page = page | merge({
"title" : "Child Page",
"description" : "Welcome to the child page!"
}) %}
{{ parent() }}
{% endblock %}
{% block content %}
...
{% endblock %}
親テンプレートでpage
はブロックの外側で変数を定義page
し、子テンプレートではブロックの内側page
で変数を定義していることに注意してください。
したがって、Twig は次のことを行います。
child.twig
と、 の先頭から開始され、変数base.twig
のデフォルト値が設定されます。page
page
ブロックになると、child.twig
そのブロックをオーバーライドすることがわかります。page
そのため、代わりにブロックを実行しchild.twig
ます。page
ブロック内で、変数child.twig
の新しい値が設定されます。page
次に を呼び出し、親ブロックparent()
に戻ってbase.twig
レンダリングするように指示します。page
child.twig
(私の例では、content
ブロックをレンダリングします)。ここで実際の例を参照してください。複数の継承レイヤー (孫テンプレートなど) を追加し始めると、これがより複雑になる可能性があることに注意してください。
base.twig
<title>{{ title|default('example.com') }} - My cool site</title>
子小枝
{% set title = 'ChildTitle' %}
@n3xus は素晴らしい回答をくれました。実際に私も助けてくれました (ありがとう)。ドキュメントからこのページを参照することもできます: Twig docs
特に優れた機能の 1 つは、text/html のチャンクを設定する機能です。
{% set title %}
<i class="icon-user"></i>
{{ user.username | capitalize }}
<small>{{ user.email | lower }}</small>
{% endset %}
子テンプレートから特定のコンテンツを簡単に生成できます。
私が発見したこのようなことをする素晴らしい方法:
親.小枝
{% set subvar = block('subvar') %}
{# somewhere later #}
{{ subvar }}
子小枝
{% block subvar %}
anything you want
{% endblock %}
子テンプレートで block が定義されていない場合subvar
、変数 inparent.twig
は空になります。