
(訳注: PHPTemplate は Drupal 7 まで使用されていたテーマエンジンです。この記事は、Drupal 7 のテーマシステムを理解している開発者が Drupal 8 または 9 へ移行するためのリファレンスとして書かれたものです)
最終更新日 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エスケープ処理する必要があります。↩︎︎
詳細は、以下を参照してください。
関連コンテンツ
Drupal 8初心者講座バックナンバー
Drupal初心者講座について
第1回 歴史に見るDrupal のDNA
第2回 Drupalはフレームワークか?CMSか?
第3回 Drupalの特徴
第4回 Drupal 8のインストール(1)
第5回 Drupal 8のインストール(2)
第6回 コンテンツを投稿してみる
第7回 ボキャブラリとタクソノミーを使う
第8回 コンテンツ管理におけるDrupalと他のCMSとの比較
第9回 Drupal 8のブロックシステム
第10回 Drupalの標準クエリービルダ Views
第11回 Drupalと他のCMSのクエリビルダー機能を比較
第12回 Drupal 8の多言語機能と他のCMSやサービスとの比較
第13回 Drupalの権限設定とWordPressやMovable Typeとの比較
第14回 Drupalのテーマシステムについて
第15回 Drupalの拡張モジュールの選定と利用方法
第16回 Drupalをもっと知りたい方に向けた各種情報