Twigテンプレートで利用できるタグについて説明します。
※ ドキュメントの準備ができていない項目については、Twigの公式サイトへのリンクを用意しています。
デフォルトでは自動エスケープ設定が有効になっているため、{{ value }} のような記述で変数を出力すると自動的にHTMLエスケープが適用されます。 自動エスケープ設定が有効か無効かにかかわらず、autoescapeタグで囲った範囲を自動エスケープするかどうかを指定できます。
{% autoescape %}
このセクション内で出力する値は、HTMLとしてエスケープされます。
{% endautoescape %}
{% autoescape 'html' %}
このセクション内で出力する値は、HTMLとしてエスケープされます。
{% endautoescape %}
{% autoescape 'js' %}
このセクション内で出力する値は、JSとしてエスケープされます。
{% endautoescape %}
{% autoescape false %}
自動エスケープを無効にして、そのままの値を出力します。
{% endautoescape %}
自動エスケープが有効な場合でも、raw フィルターを指定するとそのままの値を出力することができます。
{% autoescape %}
{{ safe_value|raw }}
{% endautoescape %}
for タグを使うと、配列などをループ(繰り返し)処理することができます。
例:
<h1>Members</h1>
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
users変数の要素を user変数にセットして、 for タグと endfor タグの間を繰り返し出力します。
次は、「..」 演算子を使って 0から10まで繰り返し出力する例です。
{% for i in 0..10 %}
* {{ i }}
{% endfor %}
a から z まで順番に出力する例:
{% for letter in 'a'..'z' %}
* {{ letter }}
{% endfor %}
「..」演算子の両側に式を書くこともできます。
{% for letter in 'a'|upper..'z'|upper %}
* {{ letter }}
{% endfor %}
ループ変数:
for から endfor の間のループブロック内では次の特別な変数を利用することができます。
変数 | 説明 |
---|---|
loop.index | 現在のループ番号( 1 から数える) |
loop.index0 | 現在のループ番号( 0 から数える) |
loop.revindex | 現在のループ番号の逆順( 1 から数える) |
loop.revindex0 | 現在のループ番号の逆順( 0 から数える) |
loop.first | 最初のループの場合は True になります |
loop.last | 最後のループの場合は True になります |
loop.length | ループ処理対象のアイテム数 |
loop.parent | ループブロック外(親・外側)のコンテキスト変数。 ループブロック外で定義された変数はループブロック内でアクセスできます。 しかし、ループ変数や for タグの後に指定したループアイテムを格納する変数と同じ名前の変数には直接アクセスできません。 そのようなケースで loop.parent を活用できます。 |
※ loop.length と loop.revindex, loop.revindex0, loop.last 変数は、PHPの配列か Countable インターフェースを実装したオブジェクトの場合のみ利用できます。また、それらは条件付きループの場合は利用できません。
ループ変数利用例:
{% for user in users %}
{{ loop.index }} - {{ user.username }}
{% endfor %}
条件付きループ:
filterというフィルターを使ってループさせる要素を絞り込むことができます。
{% for v in sizes|filter(v => v > 38) -%}
{{ v }}
{% endfor %}
{# output 40 42 #}
※ loop.index などはループ処理した件数のみ正しくカウントします。しかし、loop.length と loop.revindex, loop.revindex0, loop.last は利用できないことに注意してください。
else:
else タグを使うと、forループの対象要素が空の場合に、代わりの内容を出力することができます。
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% else %}
<li><em>ユーザーは見つかりません。</em></li>
{% endfor %}
</ul>
キーをループする:
通常は配列の値をループ処理しますが、keys フィルターを使うとキーをループ処理することができます。
<h1>Members</h1>
<ul>
{% for key in users|keys %}
<li>{{ key }}</li>
{% endfor %}
</ul>
キーと値の両方を取り出したい場合は次のように指定します。for タグの後の変数にキーが渡されます。カンマの後の変数に値が渡されます。
<h1>Members</h1>
<ul>
{% for key, user in users %}
<li>{{ key }}: {{ user.username|e }}</li>
{% endfor %}
</ul>
部分的なループ処理:
配列の一部だけを取り出したい場合は、次のように slice フィルターを活用できます。
<h1>Top Ten Members</h1>
<ul>
{% for user in users|slice(0, 10) %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
if文は式を評価して処理を分岐することができます。 次は、式の評価結果が真(true)になる場合に if タグから endif タグの間を出力するシンプルな例です。
{% if online == false %}
<p>online 変数が false と判定される場合は、この内容が表示されます。</p>
{% endif %}
次は、配列が空ではないことをif文で確認する例です。
{% if users %}
<ul>
{% for user in users %}
<li>{{ user.username|e }}</li>
{% endfor %}
</ul>
{% endif %}
※変数が定義されていることを確認する場合は defined を使用してください。
式の評価結果が偽(false)になることを確認したい場合は not を使用することができます。
{% if not user.subscribed %}
<p>user.subscribed が true と判定されない場合は、この内容が表示されます。</p>
{% endif %}
and や or を使って複数の条件を指定することもできます。
{% if temperature > 18 and temperature < 27 %}
<p>temperature 変数が 18 より大きく、かつ 27 より小さい場合は、この内容が表示されます。</p>
{% endif %}
elseif や else を使って複数の条件で分岐させることもできます。
{% if kenny.sick %}
kenny.sick が true と判定される場合は、この内容が表示されます。
{% elseif kenny.dead %}
kenny.dead が true と判定される場合は、この内容が表示されます。
{% else %}
上の条件に一致しない場合は、この内容が表示されます。
{% endif %}
式を評価するルールはPHPと同じです。
値 | ブール評価 |
---|---|
空文字 | false |
数値の0 | false |
空白だけの文字 | true |
空配列 | false |
null | false |
空ではない配列 | true |
オブジェクト | true |
set タグを使うと、変数に値を割り当てることができます。
変数 foo に 'bar' という値を割り当てる例:
{% set foo = 'bar' %}
割り当てられた変数はテンプレート内で利用できます。次は「bar」という文字列が表示されます。
{{ foo }}
Twigで有効なさまざまな式で値を割り当てることができます。
{% set foo = [1, 2] %}
{% set foo = {'foo': 'bar'} %}
{% set foo = 'foo' ~ 'bar' %}
※ 配列・連想配列・文字列連結の例です。
いくつかの変数を1つのブロックで割り当てることができます。
{% set foo, bar = 'foo', 'bar' %}
set タグはテキストのかたまりを値として取り込むことができます。次の set から endset までの複数行が foo 変数にセットされます。
{% set foo %}
<div id="pagination">
...
</div>
{% endset %}
※ 自動エスケープを有効にしている場合、取り込まれた値は安全であると判断します。foo 変数を出力する際には自動エスケープは行いません。
次のように for ループ内で宣言された変数はループの外では利用できません。
{% for item in list %}
{% set foo = item %}
{% endfor %}
変数にアクセスしたい場合は、ループの前に宣言します。
{% set foo = "" %}
{% for item in list %}
{% set foo = item %}
{% endfor %}
このHTMLファイルは Twig Team の著作物を複製・改変したドキュメントが含まれています。
著作物:https://twig.symfony.com/
著作権:Copyright (c) 2009-2020 by the Twig Team
ライセンス:https://twig.symfony.com/license