Smartyでは次のことができます
{$var = 'bla' scope=parent}
Twigで可能ですか?
ブロックの使用を提案しないでください。知っている。変数が必要です。
base.twig
<title>{{ title|default('example.com') }} - My cool site</title>
child.twig
{% set title = 'ChildTitle' %}
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
変数を定義し、子テンプレートではinsidepage
ブロック。
したがって、Twigは次のことを行います:
child.twig
_をレンダリングすると、_base.twig
_の先頭から開始され、page
変数のデフォルト値が設定されます。page
blockになると、_child.twig
_がそのブロックをオーバーライドすることがわかります。したがって、代わりに_child.twig
_でpage
ブロックを実行します。child.twig
_のpage
ブロック内で、page
変数の新しい値を設定します。次に、parent()
を呼び出し、_base.twig
_に戻って、親のpage
ブロックをレンダリングするように指示します。child.twig
_で定義されている追加のブロックを置き換えます(私の例では、content
ブロックをレンダリングします)。実例を参照してください ここ 。複数の継承レイヤー(孫テンプレートなど)を追加し始めると、これがより複雑になる可能性があることに注意してください。
@ n3xusは素晴らしい答えを出しました、それは実際に私も助けました(ありがとう)、しかしあなたはまたドキュメントからこのページを見たいかもしれません: Twig docs
特に優れた機能の1つは、text/htmlのチャンクを設定する機能です。
{% set title %}
<i class="icon-user"></i>
{{ user.username | capitalize }}
<small>{{ user.email | lower }}</small>
{% endset %}
子テンプレートから非常に特定のコンテンツを簡単に生成できます。
変数をサブテンプレートから「オーバーライド可能」にしたいだけの場合は、次のように親に変数を設定できます。
{% set title = (title|default('My Page')) %}
だからあなたはこのような状況を設定することができます...
base.twig
<html>
<head>
<title>{{title}}</title>
</head>
<body>
{% block content %}
{% end block %}
</body>
</html>
parent.twig
{% extends 'base.twig' %}
{% set title = (title|default('My Page')) %}
child.twig
{% extends 'parent.twig' %}
{% set title='My Subpage' %}
{% block content %}
This is the Sub-page.
{% end block %}
最終結果は次のようになります。
<html>
<head>
<title>My Subpage</title>
</head>
<body>
This is the Sub-page.
</body>
</html>
私はそれがほとんどの状況でうまくいくと思います。親変数を子によって強制的にオーバーライドするのではなく、親は変数を子によってオーバーライドさせます。オーバーライドするのではなく、連結など、親でさまざまな動作を定義することもできます。
子ページでは次のものを使用できます。
{% set title = 'your desired title' %}
私がちょうど発見したこのようなことをするための素晴らしい方法:
parent.twig
{% set subvar = block('subvar') %}
{# somewhere later #}
{{ subvar }}
child.twig
{% block subvar %}
anything you want
{% endblock %}
子テンプレートでブロックsubvar
が定義されていない場合、parent.twig
の変数は空になります。
もう1つのアプローチは、アプリケーションでtwig構成をグローバルに確認することです。たとえば、Silexでは次のようになります。
$app['twig']->addGlobal('someuser', $user);
その後、すべてのテンプレートでその変数にアクセスできます。
Hello, {{someuser.name}}