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のブロック内の変数をオーバーライドできます。pageparent()
{# 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のデフォルト値が設定されます。pagepage ブロックになると、child.twigそのブロックをオーバーライドすることがわかります。pageそのため、代わりにブロックを実行しchild.twigます。pageブロック内で、変数child.twigの新しい値が設定されます。page次に を呼び出し、親ブロックparent()に戻ってbase.twigレンダリングするように指示します。pagechild.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は空になります。