上海戴文 - Drupal开发专家

你在这里

PHP模板与Twig制作主题范例的比较

原文链接:https://www.drupal.org/node/1918824

本页面比较了PHP模板和Twig。Twig工具还在制作过程中,所以本文将会有改动和添加。

更多信息:

在核心问题队列中的Twig问题

Drupal.org上的Twig转换指南

Twig文档

关于Twig

Twig是基于PHP编译的模板语言。当渲染你的网页时,Twig引擎接管模板并将其转化为编译的PHP模板,并存储在一个被保护的目录下sites/default/files/php_storage/… 编译被执行一次。模板文件将被缓存,或在清除Twig缓存后重新编译。

Drupal的Twig行动与Symfony行动有同样的目的: 采用一个现代的,强力的,基于OOP的引擎可以让开发者集中于Drupal本身

  1. Docblock

PHP模板:

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

Twig:

 {#
  /**
   * @file
   * File description
   */
  #}
  1. 文件和函数名:

PHP模板文件: node--article.tpl.php

Twig文件: node--article.html.twig

PHP模板函数: theme_node_links()

Twig函数: node-links.html.twig

  1. 变量

输出一个变量:

PHP模板: 

<div class="content"><?php print $content; ?></div>

Twig:

<div class="content">{{ content }}</div>

输出一个hash key对象:

PHP模板: 

<?php print $item['#item']['alt']; ?>

Twig:

{{ item['#item'].alt }}

分配变量:

PHP模板: <?php $custom_var = $content->comments; ?>

Twig:{% set custom_var = content.comments %}

分配数组:

PHP模板: 

<?php $args = array('!author' => $author, '!date' => $created); ?>

Twig:

{% set args = {'!author': author, '!date': created} %}
  1. 条件

PHP模板:

 <?php if ($content->comments): endif; ?>

Twig:

{% if content.comments %} {% endif %}

PHP模板:

 <?php if (!empty($content->comments)): endif; ?>

Twig:

{% if content.comments is not empty %} {% endif %}

PHP模板:

 <?php if (isset($content->comments)): endif; ?>

Twig:

{% if content.comments is defined %} {% endif %}

PHP模板: 

<?php if ($count > 0): endif; ?>

Twig:

{% if count > 0 %} {% endif %}
  1. 控制结构

PHP模板: <?php foreach ($users as $user) {} ?>

Twig:{% for user in users %} {% endfor %}

  1. 过滤器

Check_plain:

PHP模板:

 <?php print check_plain($title); ?>

Twig:

{{ title|striptags }}

翻译:

PHP模板: 

<?php print t('Home'); ?>

Twig:

{{ 'Home'|t }}

有替代变量的翻译:

PHP模板: 

<?php print t('Welcome, @username', array('@username' => $user->name)); ?>

Twig:

{{ 'Welcome, @username'|t({ '@username': user.name }) }}

Drupal 8 Twig (有翻译标签扩展):

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

展开列表:

PHP模板:

<?php echo implode(', ', $usernames); ?>

Twig:

{{ usernames | join(', ') }}

这个PHP模板的例子需要$usernames是一个字符数组。同样,原始的Twig例子中usernames也是一个字符数组。Drupal 8 Twig的例子则需要一个可渲染的对象。这个实际上是Drupal 8 Twig 和原始Twig的根本不同。Drupal 8 Twig 输出纯文本和可渲染数组。

这个例子的另一方面是3个例子被期待输出同样的结果,但是实际默认不是,看这个例子:

<?php
  {% set numbers = [{'#markup': 'One'}, {'#markup':'Two'}, {'#markup':'Three'}] %}
  {{ numbers }}
?>

上面企图输出被逗号隔开的元素,但实际输出是:OneTwoThree。

异常:

PHP模板:

<?php echo check_plain($title); ?>

原始Twig:

{{ title|e }}

Drupal 8 Twig:

{{ title }}
  1. 空白控制

Twig拥有空白控制功能,它允许将建立模板文件的空白移除。

<div class="body">
  {{- block.content -}}
</div>

等同于:

<div class="body">{{ block.content }}</div>

注意

  1. Hash key元素的例子在未来可能改变
  2. 在第二个例子中,我们展示了Twig也会负责净化数据。此前,这是模板文件或预处理函数的事。这个最后的改变值得所有希望为Drupal 8制作PHP模板主题的人着重关注——你需要自己净化你的数据,所有。