PHPTemplate 与 Twig 范式对比
关于 Twig
Twig 是一个基于 PHP 的编译型模板语言。当你的网页被渲染时,Twig 引擎会获取模板并将其转换为“编译后的” PHP 模板,这些文件存储在受保护目录 sites/default/files/php/twig 中。编译只会执行一次,模板文件会被缓存以便重复使用,并在清除 Twig 缓存时重新编译。
Drupal Twig 的倡议与 Symfony 的动机相同:引入一个现代化、强大、基于 OOP 的引擎,使开发者能够专注于 Drupal 的正确开发。
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 示例也是如此。但 Drupal 8 Twig 示例要求是一个可渲染对象数组。这是 Drupal 8 Twig 与原始 Twig 的根本区别。Drupal 8 Twig 可以“打印”纯文本和渲染数组。
另一个需要注意的是,理论上这三个示例应该输出相同的结果,但实际上并不是这样。比如:
{% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
{{ numbers }}
上例预期是以逗号分隔输出,但实际输出为:OneTwoThree
7. 空格控制
Twig 提供空格控制,可以删除用于格式化模板文件的多余空格。
<div class="body">
{{- block.content -}}
</div>
等同于:
<div class="body">{{ block.content }}</div>
注意
- 哈希键元素示例未来可能会改变
- 在第二个示例中,我们展示了 Twig 如何负责数据清理。过去这是模板文件或预处理函数的职责。这个变化对那些希望在 Drupal 8 中构建 PHPTemplate 主题的人非常重要——你需要清理你自己的数据。↩︎︎