logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

PHPTemplate 与 Twig 范式对比

03/10/2025, by Ivan

关于 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 主题的人非常重要——你需要清理你自己的数据。↩︎︎

更多信息: