如何在VPS上使用Twig设计模板页面

来自菜鸟教程
跳转至:导航、​搜索

关于树枝

Twig 是一个为 PHP 设计的现代模板引擎,对设计人员和开发人员都很友好。 它是构建 Web 应用程序的表示逻辑的 PHPTemplate 方法的一个很好的替代方案,因为它代表了更清晰的模板体验。 在这方面,它带有非常易于理解的语法,并限制您在模板文件中执行动态 PHP 操作。

之前的教程 中,我们已经了解了如何使用 Composer 设置 Twig 并开始在最基本的级别上使用它。 在本教程中,我们将深入探讨它的语法以及如何使用它来构建模板文件。

评论

您需要知道的第一件事是如何向您的页面添加评论。 它有一个简单的语法:{# #}。 您放入此块中的所有内容都不会被解析。 它也可以在多行上:

{# 
  This is a comment that won’t be parsed. 
#}

变量

我们已经看到了如何将变量传递给模板文件以及如何将其打印出来(在双花括号之间)。 我们看到的是一个非常简单的字符串 PHP 变量。 但是,您也可以通过 render() 方法传递数组或对象。

假设我们的应用程序中有以下 PHP 类:

class Box
{

    public $shape = 'square';

    public function displayShape() {
        return $this->shape;
    }
}

如果我们基于这个类实例化一个新对象(我们称之为 myBox)并将它传递给 Twig 模板,我们可以通过以下方式使用它。 如果我们想打印出 $shape 属性,我们这样做:

{{ myBox.shape }}

如果我们想要返回 displayShape() 方法,我们这样做:

{{ myBox.displayShape() }}

使用数组,它非常相似。 假设 myBox 是一个数组,其中一个元素的键为 shape。 我们使用与对象属性相同的语法将其打印出来:

{{ myBox.shape }}

此外,您可以使用其他 Twig 分隔符 {%%} 在模板文件中设置新变量:

{% set shape = 'square' %}

过滤器

Twig 的一个很酷的地方是提供了许多非常有用且易于使用的过滤器。 你问的是什么过滤器? 最简单的解释方法是举个例子:

{{ shape|upper }}

这将以所有大写字母输出形状变量的值。 如果需要,您甚至可以组合多个过滤器:

{{ shape|upper|trim }}

这也修剪了变量值开头和结尾的空格。 此外,您可以将过滤器应用于整个块:

{% filter upper %}
  This box is {{ shape }}.
{% endfilter %}

?上述语句会将过滤器块中的所有内容都转换为大写字母。

您可以在 Twig 文档 网站上查看大量方便的过滤器。 有些甚至接受参数,例如 date 过滤器,您可以在其中指定要显示日期变量的格式。 如果你正在学习 Twig,你会发现你经常去那里检查东西。

控制结构

由于没有循环或 if/else 语句,任何模板文件都不能使用,Twig 还允许您对数据使用各种控制结构。 例如,这是您进行常规 foreach 迭代的方式:

{% for shape in shapes %}
  {{ shape }} 
{% endfor %}

这将遍历 shapes 数组并打印出每个 shape。 if/else 语句如下所示:

{% if shape is defined %}
  {{ shape }}
{% endif %}

仅当设置了 shape 变量时,它才会打印出来。 有关控制结构的更多信息,您可以在 Twig 文档 页面上找到。

包含和继承模板

Twig 有一个非常强大的功能,允许您在彼此之间包含模板。 让我们举例说明:

{% include 'header.html' %}

此语句将加载 header.html 文件并在包含它的模板的当前上下文中呈现它。 这意味着它可以访问包含模板的所有可用变量。 这是一个很棒的功能,可让您保留多个但更干净的文件。

此外,继承是 Twig 中另一个甚至更强大的功能。 它允许您创建定义块的模板,然后让它们被其他模板扩展,这些模板可以覆盖这些块中的默认内容或向它们添加新内容。 一个简单的例子:

模板 A (layout.html) 包含以下内容(请记住,这只是一个示例):

<div class=”eight columns”>{% block mainContent %}{% endblock %}</div>
<div class=”four columns”>{% block rightSidebar %}{% endblock %}</div>

如您所见,定义的块中没有内容。 如果我们愿意,我们可以添加一些。 但模板 B 也可以扩展此模板并将内容添加到这些块中:

{% extends "layout.html" %}

{% block mainContent %}Some page text{% endblock %}
{% block rightSidebar %}Some sidebar content{% endblock %}

这里发生的是模板 B 扩展了模板 A(基本上将模板 A 加载并呈现到页面上),但也填充了它定义的当前为空的块。 如果模板 A 中的块有内容,则模板 B 将覆盖上面示例中的内容。 要添加到现有内容而不是覆盖,它必须是这样的:

{% block mainContent %}
  {{ parent() }}
  Some page text
{% endblock %}

所以 mainContent 块现在加载它扩展的父级中的内容,打印出来并在下面添加更多内容。

一些要提的关键点。 如果要扩展模板,extends 块应该是页面上的第一件事。 此外,如果您这样做,您不能在您正在扩展的模板中定义的块之外拥有内容。 因此,在模板 B 中,您添加的所有内容都必须进入模板 A 中定义的块之一。

有关通过扩展标签继承的更多信息,您可以在 Twig 文档 页面上阅读。

结论

在本文中,我们更深入地使用 Twig 构建模板页面。 我们已经看到了如何使用注释系统、打印出变量(简单和复杂,例如数组和对象)、使用控制结构来获得更多动态结果以及如何包含和扩展模板。 您可以在 twig 文件中执行更多操作,我鼓励您查看它们。

如果你喜欢使用 PHP 框架,Twig 是 Symfony2 的默认模板引擎,所以请记住这一点。 此外,即将发布的主要 Drupal 8 版本也将使用 Twig 作为模板。

文章提交者:Danny