Twig в Drupal 8. Отличия от PHPTemplate

На смену обычным темлейтам в Drupal 8 явился Twig. И я постараюсь тезисно показать как с этим работать.

1. Шаблоны теперь обзываются немножко по другому
  • html.html.twig (Шаблон html)
  • page.html.twig (Шаблон страницы)
  • page--node.html.twig (Шаблон ноды)
  • page--node--1.html.twig (Шаблон ноды с идентификатором 1)
  • page--node--edit.html.twig (Шаблон редактирования ноды)
  • page--front.html.twig (Шаблон главной страницы)
  • block--module--delta.html.twig
  • block--module.html.twig
  • node--type.html.twig
  • ...
Ну и так далее. Думаю уже видно не вооружённым глазом, какие различия в именовании темлейтов между седьмой и восьмой версиями Drupal.

2. Комментарии

PHPTemplate:
  <?php 
  /** 
   * @file
   * File description
   */
  ?>
Twig:
  {# 
  /** 
   * @file
   * File description
   */
  #}


3. Переменные

Выводим простые переменные:

PHPTemplate:
<div class="content"><?php print $content; ?></div>
Twig:
<div class="content">{{ content }}</div>


Работа с массивами:

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.Фильтры:

Check_plain:

PHPTemplate:
<?php print check_plain($title); ?>
Twig:
{{ title|striptags }} 


Перевод строк:

PHPTemplate:
<?php print t('Home'); ?>
Twig:
{{ 'Home'|t }}
Drupal 8 Twig2:
{% trans %}
  Submitted by {{ author.name }} on {{ node.date }}
{% endtrans %}
 
{# Ниже пример с опциями #}
 
{% trans with {'context': 'My translate', 'langcode': 'fr'} %}
  Home
{% endtrans %}

PHPTemplate:
<?php print t('Welcome, @username', array('@username' => $user->name)); ?>
Twig:
{{ 'Welcome, @username'|t({ '@username': user.name }) }}


Implode:

PHPTemplate:
<?php echo implode(', ', $usernames); ?>
Twig:
{{ usernames | join(', ') }}


Escape:

PHPTemplate:
<?php echo check_plain($title); ?>
Original Twig:
{{ title|e }}
Drupal 8 Twig2:
{{ title }}


А вот пример node.tpl.php для Drupal 7:

<?php print render($title_prefix); ?>
 <?php if (!$page): ?>
 <h2<?php print $title_attributes; ?>>
 <a href="/<?php print $node_url; ?>"><?php print $title; ?></a>
 </h2>
 <?php endif; ?>
 <?php print render($title_suffix); ?>

И node.html.twig для Drupal 8:

 {{ title_prefix }}
 {% if not page %}
 <h2{{ title_attributes }}>
 <a href="/{{ node_url }}">{{ label }}</a>
 </h2>
 {% endif %}
 {{ title_suffix }}


Более детально с каждым типом шаблона можно ознакомиться, подсмотрев в оригинальные, которые находятся в типичном для себя месте:
  • core/modules/system/templates
  • core/modules/node/templates
  • core/modules/taxonomy/templates
  • и т.п...