最終更新日 2018年1月20日
Twigについて
TwigはPHPへのコンパイルテンプレート言語です。Webページがレンダリングされるとき、Twigエンジンはテンプレートを、PHPTemplateにコンパイルします。コンパイルされたテンプレートは、保護ディレクトリ(sites/default/files/php/twig)に保存されます。1度コンパイルされたテンプレートファイルは、キャッシュ後再利用されます。Twigのキャッシュをクリアすると再コンパイルされます。
Drupal Twig の イニシアチブは、Symfonyイニシアチブと同じ目的を持っており、開発者がDrupalに適切に集中できるように、モダンで強力なOOPベースのエンジンを採用しています
1. Docblock
PHPTemplate:
<?php
/**
* @file
* File description
*/
?>
Twig:
{#
/**
* @file
* File description
*/
#}
2.ファイル名と関数名
PHPTemplateファイル:
node--article.tpl.php
Twigファイル:
node--article.html.twig
PHPTemplate関数:
THEME_node_links()
Twigファイル:
node-links.html.twig
3.変数
変数を出力:
PHPTemplate:
<div class="content"><?php print $content; ?></div>
Twig:
<div class="content">{{ content }}</div>
ハッシュキー項目の出力[1]
PHPTemplate:
<?php print $item['#item']['alt']; ?>
Twig:
{{ item['#item'].alt }}
変数の割り当て
PHPTemplate:
<?php $custom_var = $content->comments; ?>
Twig:
{% set custom_var = content.comments %}
配列の割り当て:
PHPTemplate:
<?php $args = array('@author' => $author, '@date' => $created); ?>
Twig:
{% set args = {'@author': author, '@date': created} %}
4.条件式
PHPTemplate:
<?php if ($content->comments): endif; ?>
Twig:
{% if content.comments %} {% endif %}
PHPTemplate:
<?php if (!empty($content->comments)): endif; ?>
Twig:
{% if content.comments is not empty %} {% endif %}
PHPTemplate:
<?php if (isset($content->comments)): endif; ?>
Twig:
{% if content.comments is defined %} {% endif %}
PHPTemplate:
<?php if ($count > 0): endif; ?>
Twig:
{% if count > 0 %} {% endif %}
5.ループ処理
PHPTemplate:
<?php foreach ($users as $user) {} ?>
Twig:
{% for user in users %} {% endfor %}
6.フィルタ処理
HTML特殊文字のエスケープ処理:
PHPTemplate:
<?php print check_plain($title); ?>
Twig[2]:
{{ title }}
未加工の値:
PHPTemplate:
<?php print $title; ?>
Twig:
{{ title|raw }}
多言語対応:
PHPTemplate:
<?php print t('Home'); ?>
Twig:
{{ 'Home'|t }}
置き換えを伴う多言語対応:
PHPTemplate:
<?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig:
{{ 'Welcome, @username'|t({ '@username': user.name }) }}
Drupal 8 Twig(trans タグによる拡張):
{% set username = user.name %}
{% trans %}
Welcome, {{ username }}
{% endtrans %}
リストを埋め込む:
PHPTemplate:
<?php echo implode(', ', $usernames); ?>
Twig:
{{ usernames | join(', ') }}
マークアップにリストを埋め込む:
Twig:
{{ usernames | safe_join(', ') }}
PHPTemplateの場合、文字列の配列・$usernamesが必要です。オリジナルのTwigの場合、「usernames」が文字列の配列となります。一方、Drupal 8 Twigの場合、レンダリング可能なオブジェクトの配列が必要になります。これは、Drupal 8 Twigと通常のTwigの明らかな違いです。Drupal 8 Twigはプレーンテキストとレンダリング可能な配列の両方を書き出します。
上記3つのパターンは、すべて同じ出力結果になるように思えますが、デフォルトではそうではありません。 以下のDrupal 8 Twigの例を考えてみましょう:
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers }}
上記の出力結果は「OneTwoThree」になります。
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers | safe_join(', ') }}
上記の出力結果は「One, Two, Three」になります。
7.スペースの制御
Twigでは、テンプレートファイルの構造化のために書かれたスペースを取り除くことができます。
<div class="body">
{{- block.content -}}
</div>
上記と同じ結果になります:
<div class="body">{{ block.content }}</div>
ノート
- ハッシュキー項目の例は将来変更される可能性があります ↩︎︎
- この例では、Twigが、データをサニタイズすることが書かれています。以前は、この処理には、テンプレートファイル、または前処理関数が必要でした。
重要:この変更から、Drupal 8テーマをPHPTemplateで作成する場合には、データをHTMLエスケープ処理する必要があります。↩︎︎