欢迎关注微信公众号:chave-cn

Drupal8 PHPTemplate与Twig主题范式的比较及用法

关于Twig

Twig是一种基于PHP的编译模板语言。当您的网页呈现时,Twig引擎将采用该模板并将其转换为存储在受保护目录中的“已编译”PHP模板。编译完成一次,模板文件被缓存以供重用,并在清除Twig缓存时重新编译。sites/default/files/php/twig

Drupal Twig倡议与Symfony倡议有相同的动机:采用现代化的,功能强大的基于OOP的引擎,使开发人员能够集中精力使用Drupal。

1. Docblock

PHPTemplate:

<?php 
/** 
 * @file
 * File description
 */
?>

枝条:

{# 
/** 
 * @file
 * File description
 */
#}

2.文件和函数名称

PHPTemplate file: node--article.tpl.php
Twig file: node--article.html.twig

PHPTemplate function: THEME_node_links()
Twig file: node-links.html.twig

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.过滤器

转义HTML特殊字符:

PHPTemplate: <?php print check_plain($title); ?>
Twig: {{ 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 (with trans tag extension):

{% set username = user.name %}
{% trans %}
  Welcome, {{ username }}
{% endtrans %}

组合一个数组列表:

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

用标记组合数组列表:
Twig:{{ usernames | safe_join(', ') }}

PHPTemplate示例要求$usernames是一个字符串数组。Original 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>

笔记

  1. 哈希关键项目的例子可能在未来改变 ↩︎︎
  2. 在第二个例子中,我们展示了Twig如何负责清理数据。以前它取决于模板文件或预处理函数来处理这个问题。对于希望为Drupal 8创建PHPTemplate主题的任何人来说,这个最后的改变是非常重要的 - 您需要清理自己的数据。

 

微信号
微信公众号