[twig官方文档]为模版设计师而生的Twig(上)-Twig使用指南
2015-06-30 11:24
253 查看
掌握了如何安装Twig模版引擎之后,接下里就要学习Twig的语法和语义,然后创建Twig模版。而本文的将花费较大的篇幅来介绍模板引擎的语法和语义,这对于模版设计师将会是非常有用的参考。由于本文的原文篇幅较长,所以就分成两部分进行翻译。本文为第一部分。本文的内容较多,主要包括Tiwg的IDEs
集成,变量,全局变量,设置变量,过滤器,函数,命名参数,控制结构,注释,包含模板等内容。
1. 概要
模板是一个简单的文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV等)。它不具有特定扩展名,html或xml都OK。 模板中包含的变量或表达式,用来控制模板的逻辑。当模版被预处理时,它们会被替换为变量值。
下面是说明了一些基本要素的最小模板。稍后我们将介绍更多细节:
Twig有两种类型的分隔符:{%…%}和{{…}}。第一个是用于执行诸如for循环的控制语句,后者则在模板中打印一个表达式的结果。
2. IDEs 集成
许多IDE支持Twig语法高亮和自动完成标签:
※ TextMate 通过 Twig Bundle
※ Vim 通过 Jinja syntax 插件或vim-twig 插件
※ NetBeans 通过 Twig syntax 插件(7.2+)
※ PhpStorm(原生2.1+)
※ Eclipse 通过 Twig plugin
※ Sublime 通过 Twig bundle
※ GtkSourceView 通过 Twig language definition
※ Coda and SubEthaEdit 通过 Twig syntax mode
※ Coda 2 通过 other Twig syntax mode
※ Komodo and Komodo Edit 通过 Twig highlight/syntax check mode
※ Notepad++ 通过 Notepad++ Twig Highlighter
※ Emacs 通过 web-mode.el
3. 变量
应用程序将变量传递到操作的模板中。你也可以访问变量的属性或元素。一个变量的可视化表示在很大程度上依赖于应用程序提供的值。你可以使用点(.)或所谓的下标语法([])来访问变量的属性(PHP对象的方法或属性,PHP数组的元素)。
当属性中包含特殊字符(如 – 这会被解释为减号操作符),使用attribute()函数来替代使用点(.)访问变量属性:
重要提示:要知道,大括号不是变量的一部分,print语句除外。当访问标签内的变量,不要把大括号加在变量上。
如果一个变量或属性不存在,strict_variables选项设置为false时,您将收到一个空值;另外,如果strict_variables设置为true,Twig将会抛出一个错误(参照见environment options)
变量调用机制
为了方便起见,在PHP表现层调用foo.bar时,会进行以下操作:
a.1 检查foo是否是个数组,并检查bar是否是有效的元素
a.2 如果不是,foo是个对象,并检查bar是否是有效的属性
a.3 如果不是,foo是个对象,并检查bar是否是有效方法。(即使bar是一个构造器。那么请使用__construct()方法替代)
a.4 如果不是,foo是个对象,会检查getBar()是否是有效的方法
a.5 如果不是,foo是个对象,会检查isBar()是否是有效的方法
a.6 如果不是,返回空值(null)
a.7 检查foo是一个数组和bar是一个有效的元素;
a.8 如果没有,则返回null值。
提示:如果你想访问一个变量的动态属性,使用attribute()函数来代替。
4. 全局变量
下面的变量在模板中总是可用:
_self: 引用当前模版;
_context: 引用当前的上下文;
_charset: 引用当前的字符集。
5. 设置变量
您可以将值赋给内部代码块中的变量。赋值使用set标签:
6. 过滤器
变量可以通过过滤器进行修改。过滤器和变量之间使用管道符号(也就是竖线 | )分隔开,过滤器括号中可能有可选的参数。多个过滤器可以串连使用,滤波器的输出会被应用于下一个过滤器。
下面的示例是从名称中删除所有的HTML标签并应用title-cases格式化:
过滤器接受括号中的参数。 这个例子将用逗号连接一个列表:
要对一段代码应用过滤器,只要使用filter标签把它包起来:
访问过滤器页面,以了解更多关于内置过滤器。
7. 函数
函数可以被调用来生成内容。函数是通过它们的[函数名+()]进行调用的,可能还带有参数。
例如,range()函数返回一个包含一个整数等差数列的列表:
访问函数页面,以了解更多关于内置函数。
8. 命名参数
1.12版本新特性:对命名参数的支持被添加到Twig 1.12版。
使用命名参数,让你的模板更明确的了解,您作为参数传递的值的含义:
命名参数还允许您跳过一些你不希望更改默认值的参数:
您也可以在一个调用中使用占位参数和命名参数,在这种情况下,占位参数必须在命名参数之前:
提示:每个函数和过滤器的文档页面,都有一段内容,列出它们支持的所有参数名称。
9. 控制结构
控制结构指的是所有这些控制程序流程的代码:条件语句(如:if/elseif/else)、for循环以及类似的代码块。控制结构出现在{%…%}块内。
例如,要显示一个由变量(users)提供的用户列表,使用for标签:
if标签可以用于测试表达式:
访问tags页面,以了解更多关于内置标签。
10. 注释
要在模板中注释掉一部分,使用注释语法{#…#}。这对于调试或添加信息给其他模板设计者或自己看会很有用:
11. 包含其他模板
包含一个模板时,include标签很有用,它会返回该模板(子模版)的内容呈现到当前模版(父模版):
默认情况下每个被包含的模板都会传递当前上下文(context)。传递给父模板的上下文,还包括在子模板中定义的变量:
被包含的模板 render_box.html 能够访问变量 box。
模板的文件名取决于模板加载器。例如,Twig_Loader_Filesystem允许你通过给文件名来访问其他模板。您可以访问以斜线分隔的子目录中的模板:
此行为取决于应用程序中嵌入Twig。
12. 模板继承
Twig最强大的部分是模板继承。模板继承允许你建立一个基本的”骨架”模板,包含您的网站的所有公用的元素,并定义一些区块(block)让子模板可以覆盖。
听起来似乎很复杂,但其实这是非常基本的。通过一个例子将容易理解它。
让我们定义一个基本模板:base.html。它定义了一个简单的HTML框架文档,假设是你要使用的一个简单的两列分布的页面:
在这个例子中,block标签定义了四个可让子模板填充的区块(block)。所有的blcok标签的作用是告诉模板引擎:一个子模板可能会覆盖模板的那些部分(也就是会覆盖区块)。
一个子模板看起来可能像这样:
扩展标签(extends)是这里的关键。它告诉模板引擎,这个模板扩展于另一个模板。当模板系统评估此模板时,它首先会找到当前模版的父模版。扩展标签(extends)必须是在模板中的第一个标签。
请注意,由于子模板没有定义 footer 区块,所以将会使用父模板中的值来代替。
是有可能通过使用 parent函数来呈现父区块的内容。这使得你可以返回父区块的结果:
提示1:在扩展标签(extends)文档页面介绍了更高级的功能,如块嵌套,适用范围,动态继承和有条件的继承。
提示2:在use标签的帮助下,通过所谓的横向重用Twig还支持多重继承。这是常规模板很少需要使用到的高级功能。
13. HTML转义
当从模版生成的HTML时,总有一个风险,即一个变量将包含某些影响最终HTML的字符。有两种方法解决此问题:手动转义每个变量或默认地自动转义一切。
两种方法Twig都支持,并且自动转义是默认启用的。
提示:escaper扩展是启用状态的时候(默认是这样),自动转义才有效。
13.1 使用手动转义工作
如果手动转义被启用,转义变量就是你的责任了,如果你需要的话。需要转义什么呢?任何你不信任的变量。
转义功能通过 escape 或 e 过滤器来转义变量:
转义过滤器默认使用的HTML策略,但根据转义的上下文,你可能会想要明确地使用任何其他可用的策略:
13.2 使用自动转义工作
无论自动转义启用与否,你都可以使用autoescape标签来标记模板的一部分进行转义或不转义:
默认情况下,自动转义使用HTML转义的策略。如果您在其他情况下输出变量,你需要明确地使用适当的转义策略来转义他们:
13.3 转义
有时希望或必需让Twig忽略将其他处理作为变量或区块(block)。例如,如果使用默认的语法,想要使用 {{ 作为原始模板中的字符串,而并不是作为使用变量的分隔符,你必须使用一个技巧。
最简单的方法是通过使用一个变量表达式来输出变量的分隔符({{):
对于更大的部分,使用verbatim标签进行标记才是有意义的。
14. 宏(Macros)
提示:版本1.12新特性:在Twig 1.12 中添加了对默认参数值的支持。
宏是可以和常规的编程语言相媲美的功能。它们对于常用的HTML片段的重用非常有用,而不需要不断重复自己。宏通过macro 标签定义。下面是由宏来渲染一个表单元素的例子(称为forms.html):
宏可以在任何模板中定义,并且在使用之前,需要通过 import 标签来导入:
或者,您也可以通过from标签从一个模版中导入单独的宏名称到当前模版,并且可选地使用别名来命名它们:
宏调用时,如果没有提供宏参数的话,默认值将会被定义:
15. 表达式
Twig允许在任何地方使用表达式。这和常规的PHP非常类似,甚至如果你并不使用PHP的话,你会感觉很舒服。
提示:运算符优先级如下,首先列出的是最低优先级的操作:
b-and, b-xor, b-or, or, and, ==, !=, <, >, >=,
<=, in, matches, starts with, ends with, .., +,
-, ~, *, /, //, %, is, **, |, [], and
15.1 文本
提示:版本1.5新特性:Twig 1.5中对哈希键作为名称和表达式添加了支持。
表达式的最简单形式是文本。文本在PHP类型中表示,如字符串,数字和数组。存在下面这些文本:
※ “Hello World”:两个双引号或单引号之间的任何内容都是一个字符串。当你在模版中需要一个字符串的时候(例如:函数调用的参数、过滤器或者仅仅只是扩展或包含一个模版),它们非常有用。一个字符串可以包含一个分隔符,如果它前面有一个反斜杠(\)的话,例如:’It\’s good’。
※ 42 / 42.23:整数和浮点数是由刚写下的数字创建的。如果一个数存在一个点,那它就是一个浮点数,否则是个整数。
※ ["foo", "bar"]: 数组被定义为由逗号(,)分隔开、被方括号([])包裹着的表达式序列。
※ {“foo”: “bar”}:哈希表被定义为一个由逗号(,)分隔开、被花括号({})包裹着的、由[键]和[值]组成的列表。
※ true / false: true 代表值为真,false 代表值为假。
※ null:null表示没有特定的值。这是当一个变量不存在时返回的值。none 是 null 的一个别名。
数组和哈希可以嵌套:
提示:使用双引号或单引号字符串对性能没有影响,但只支持在双引号字符串的插入变量值。
15.2 计算
Twig允许你对值进行计算。在模板中虽然很少有用,但因为完整性的缘故而存在。下面是被支持的操作符:
※ + :将两个对象加在一起(操作数被强制转换为数字)。 {{1+1}}是2。
※ - :从第一个数减去第二个数字。 {{3 – 2}}为1。
※ / :两个数相除。返回的值将是一个浮点数。 {{1/2}}是{{0.5}}。
※ % :计算一个整数被除的余数。 {{11%7}}是4。
※ // :两个数相除并返回的向下取整的整数结果。 {{20//7}}为2,{{-20//7}}是-3(这只是round过滤器的语法修饰)。
※ * :左操作数与右操作数相乘。 {{2*2}}将返回4。
※ ** :左操作数(n)的右操作数(m)次幂。(也就是n的m次方,n^m) {{2 ** 3}}将返回8。
15.3 逻辑
您可以将多个表达式使用下列运算符:
※ and: 如果左边和右边的操作数都为真,则返回true。
※ or: 如果左边或右边的操作数为真,则返回true。
※ not: 否定一个声明。
※ (expr): 构成一组表达式。
提示:Twig还支持位运算符(b-and, b-xor, and b-or)。
15.4 比较
以下比较操作符在任何表达式中都支持: ==, !=, <, >, >=, <=。
您也可以检查一个字符串是否以另一个字符串开头或结尾:
对于复杂的字符串比较时,matches操作符允许你使用正则表达式:
15.5 包含操作符
in 操作符进行包含测试。 如果左操作数是包含在左操作数,则返回true:
提示:您可以使用此过滤器来对字符串、数组或实现Traversable接口的对象进行包含测试。
要执行一个反面测试,使用 not in 操作符:
15.6 测试操作符
is 操作符可以进行测试。测试可以用于测试针对一种常见的表达式的变量。右操作数是测试的名称:
测试也可以接受参数:
通过使用 is not 操作符,测试可以被否定:
访问tests页面,以了解更多关于内置的测试。
15.7 其它操作符
提示:1.12.0版本新特性:Twig 1.12.0 版本对扩展的三元运算符中添加了支持。
下列运算符是非常有用的,但不属于任何其他类别:
※ .. :创建一个基于前操作数和后操作数的序列(这只是range函数的语法修饰)。
※ | :应用一个过滤器。
※ ~ :所有的操作数转换为字符串并将其连接起来。{{ “Hello ” ~ name ~ “!” }} 将返回 (假设名字是’John’) Hello John!.
※ . , [] :获取一个对象的属性。
※ ?: :三元运算符(?:)。
15.8 字符串插值
提示:1.5版本新特性: 字符串插值被添加到了 Twig 1.5版本中。
字符串插值(#{表达式})允许任何有效的表达式出现在双引号包裹字符串中。运行的结果中该表达式会被插入字符串:
16. 空白符控制
提示:1.1版本新特性: 标记级别的空白符控制被添加到了 Twig 1.1版本中。
模板标签后的第一个换行符会被自动移除(就像在PHP中)。其它的空白符就不再被模板引擎修改,所以每个空白符(空格,制表符,换行符等)将会原封不动地被返回(给view)。
使用 spaceless 标签可以把HTML标签之间的空白符去掉:
另外,对于 spaceless 标签,你也可以在每个标签级别上控制空白符。通过在你的标签上使用空白符控制修饰,你可以去掉领先或尾随空白符:
在上面的示例中显示了默认的空白符控制修饰符,以及如何使用它来除去标签周围的空白符。不过默认会去掉标签两边的所有的空白符。实际上,你也可以使用它只去掉标签一侧的空白符:
17. 扩展
Twig可以很容易被扩展。如果你正在寻找新的标签,过滤器,或函数,你看看Twig官方扩展库。
如果你想创建自己的扩展,请阅读创建一个扩展的篇章。
集成,变量,全局变量,设置变量,过滤器,函数,命名参数,控制结构,注释,包含模板等内容。
1. 概要
模板是一个简单的文本文件。它可以生成任何基于文本的格式(HTML、XML、CSV等)。它不具有特定扩展名,html或xml都OK。 模板中包含的变量或表达式,用来控制模板的逻辑。当模版被预处理时,它们会被替换为变量值。
下面是说明了一些基本要素的最小模板。稍后我们将介绍更多细节:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE html> <html> <head> <title>My Webpage</title> </head> <body> <ul id="navigation"> {% for item in navigation %} <li><a href="{{ item.href }}">{{ item.caption }}</a></li> {% endfor %} </ul> <h1>My Webpage</h1> {{ a_variable }} </body> </html> |
2. IDEs 集成
许多IDE支持Twig语法高亮和自动完成标签:
※ TextMate 通过 Twig Bundle
※ Vim 通过 Jinja syntax 插件或vim-twig 插件
※ NetBeans 通过 Twig syntax 插件(7.2+)
※ PhpStorm(原生2.1+)
※ Eclipse 通过 Twig plugin
※ Sublime 通过 Twig bundle
※ GtkSourceView 通过 Twig language definition
※ Coda and SubEthaEdit 通过 Twig syntax mode
※ Coda 2 通过 other Twig syntax mode
※ Komodo and Komodo Edit 通过 Twig highlight/syntax check mode
※ Notepad++ 通过 Notepad++ Twig Highlighter
※ Emacs 通过 web-mode.el
3. 变量
应用程序将变量传递到操作的模板中。你也可以访问变量的属性或元素。一个变量的可视化表示在很大程度上依赖于应用程序提供的值。你可以使用点(.)或所谓的下标语法([])来访问变量的属性(PHP对象的方法或属性,PHP数组的元素)。
1 2 | {{ foo.bar }} {{ foo['bar'] }} |
1 2 | {# equivalent to the non-working foo.data-foo #} {{ attribute(foo, 'data-foo') }} |
如果一个变量或属性不存在,strict_variables选项设置为false时,您将收到一个空值;另外,如果strict_variables设置为true,Twig将会抛出一个错误(参照见environment options)
变量调用机制
为了方便起见,在PHP表现层调用foo.bar时,会进行以下操作:
a.1 检查foo是否是个数组,并检查bar是否是有效的元素
a.2 如果不是,foo是个对象,并检查bar是否是有效的属性
a.3 如果不是,foo是个对象,并检查bar是否是有效方法。(即使bar是一个构造器。那么请使用__construct()方法替代)
a.4 如果不是,foo是个对象,会检查getBar()是否是有效的方法
a.5 如果不是,foo是个对象,会检查isBar()是否是有效的方法
a.6 如果不是,返回空值(null)
a.7 检查foo是一个数组和bar是一个有效的元素;
a.8 如果没有,则返回null值。
提示:如果你想访问一个变量的动态属性,使用attribute()函数来代替。
4. 全局变量
下面的变量在模板中总是可用:
_self: 引用当前模版;
_context: 引用当前的上下文;
_charset: 引用当前的字符集。
5. 设置变量
您可以将值赋给内部代码块中的变量。赋值使用set标签:
1 23 | {% set foo = 'foo' %} {% set foo = [1, 2] %} {% set foo = {'foo': 'bar'} %} |
变量可以通过过滤器进行修改。过滤器和变量之间使用管道符号(也就是竖线 | )分隔开,过滤器括号中可能有可选的参数。多个过滤器可以串连使用,滤波器的输出会被应用于下一个过滤器。
下面的示例是从名称中删除所有的HTML标签并应用title-cases格式化:
1 | {{ name|striptags|title }} |
1 | {{ list|join(', ') }} |
1 23 | {% filter upper %} This text becomes uppercase {% endfilter %} |
7. 函数
函数可以被调用来生成内容。函数是通过它们的[函数名+()]进行调用的,可能还带有参数。
例如,range()函数返回一个包含一个整数等差数列的列表:
1 23 | {% for i in range(0, 3) %} {{ i }}, {% endfor %} |
8. 命名参数
1.12版本新特性:对命名参数的支持被添加到Twig 1.12版。
1 23 | {% for i in range(low=1, high=10, step=2) %} {{ i }}, {% endfor %} |
1 23 | {{ data|convert_encoding('UTF-8', 'iso-2022-jp') }} {# versus (对比) #} {{ data|convert_encoding(from='iso-2022-jp', to='UTF-8') }} |
1 23 | {# the first argument is the date format, which defaults to the global date format if null is passed #} {{ "now"|date(null, "Europe/Paris") }} {# or skip the format value by using a named argument for the time zone #} {{ "now"|date(timezone="Europe/Paris") }} |
1 | {{ "now"|date('d/m/Y H:i', timezone="Europe/Paris") }} |
9. 控制结构
控制结构指的是所有这些控制程序流程的代码:条件语句(如:if/elseif/else)、for循环以及类似的代码块。控制结构出现在{%…%}块内。
例如,要显示一个由变量(users)提供的用户列表,使用for标签:
1 23 | <h1>Members</h1> <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul> |
1 23 | {% if users|length > 0 %} <ul> {% for user in users %} <li>{{ user.username|e }}</li> {% endfor %} </ul> {% endif %} |
10. 注释
要在模板中注释掉一部分,使用注释语法{#…#}。这对于调试或添加信息给其他模板设计者或自己看会很有用:
1 23 | {# note: disabled template because we no longer use this {% for user in users %} ... {% endfor %} #} |
包含一个模板时,include标签很有用,它会返回该模板(子模版)的内容呈现到当前模版(父模版):
1 | {% include 'sidebar.html' %} |
1 23 | {% for box in boxes %} {% include "render_box.html" %} {% endfor %} |
模板的文件名取决于模板加载器。例如,Twig_Loader_Filesystem允许你通过给文件名来访问其他模板。您可以访问以斜线分隔的子目录中的模板:
1 | {% include "sections/articles/sidebar.html" %} |
12. 模板继承
Twig最强大的部分是模板继承。模板继承允许你建立一个基本的”骨架”模板,包含您的网站的所有公用的元素,并定义一些区块(block)让子模板可以覆盖。
听起来似乎很复杂,但其实这是非常基本的。通过一个例子将容易理解它。
让我们定义一个基本模板:base.html。它定义了一个简单的HTML框架文档,假设是你要使用的一个简单的两列分布的页面:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1617 | <!DOCTYPE html> <html> <head> {% block head %} <link rel="stylesheet" href="style.css" /> <title>{% block title %}{% endblock %} - My Webpage</title> {% endblock %} </head> <body> <div id="content">{% block content %}{% endblock %}</div> <div id="footer"> {% block footer %} © Copyright 2011 by <a href="http://domain.invalid/">you</a>. {% endblock %} </div> </body> </html> |
一个子模板看起来可能像这样:
1 23 | {% extends "base.html" %} {% block title %}Index{% endblock %} {% block head %} {{ parent() }} <style type="text/css"> .important { color: #336699; } </style> {% endblock %} {% block content %} <h1>Index</h1> <p class="important"> Welcome to my awesome homepage. </p> {% endblock %} |
请注意,由于子模板没有定义 footer 区块,所以将会使用父模板中的值来代替。
是有可能通过使用 parent函数来呈现父区块的内容。这使得你可以返回父区块的结果:
1 23 | {% block sidebar %} <h3>Table Of Contents</h3> ... {{ parent() }} {% endblock %} |
提示2:在use标签的帮助下,通过所谓的横向重用Twig还支持多重继承。这是常规模板很少需要使用到的高级功能。
13. HTML转义
当从模版生成的HTML时,总有一个风险,即一个变量将包含某些影响最终HTML的字符。有两种方法解决此问题:手动转义每个变量或默认地自动转义一切。
两种方法Twig都支持,并且自动转义是默认启用的。
提示:escaper扩展是启用状态的时候(默认是这样),自动转义才有效。
13.1 使用手动转义工作
如果手动转义被启用,转义变量就是你的责任了,如果你需要的话。需要转义什么呢?任何你不信任的变量。
转义功能通过 escape 或 e 过滤器来转义变量:
1 | {{ user.username|e }} |
1 23 | {{ user.username|e('js') }} {{ user.username|e('css') }} {{ user.username|e('url') }} {{ user.username|e('html_attr') }} |
无论自动转义启用与否,你都可以使用autoescape标签来标记模板的一部分进行转义或不转义:
1 23 | {% autoescape %} Everything will be automatically escaped in this block (using the HTML strategy) {% endautoescape %} |
1 23 | {% autoescape 'js' %} Everything will be automatically escaped in this block (using the JS strategy) {% endautoescape %} |
有时希望或必需让Twig忽略将其他处理作为变量或区块(block)。例如,如果使用默认的语法,想要使用 {{ 作为原始模板中的字符串,而并不是作为使用变量的分隔符,你必须使用一个技巧。
最简单的方法是通过使用一个变量表达式来输出变量的分隔符({{):
1 | {{ '{{' }} |
14. 宏(Macros)
提示:版本1.12新特性:在Twig 1.12 中添加了对默认参数值的支持。
宏是可以和常规的编程语言相媲美的功能。它们对于常用的HTML片段的重用非常有用,而不需要不断重复自己。宏通过macro 标签定义。下面是由宏来渲染一个表单元素的例子(称为forms.html):
1 23 | {% macro input(name, value, type, size) %} <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" /> {% endmacro %} |
1 23 | {% import "forms.html" as forms %} <p>{{ forms.input('username') }}</p> |
1 23 | {% from 'forms.html' import input as input_field %} <dl> <dt>Username</dt> <dd>{{ input_field('username') }}</dd> <dt>Password</dt> <dd>{{ input_field('password', '', 'password') }}</dd> </dl> |
1 23 | {% macro input(name, value = "", type = "text", size = 20) %} <input type="{{ type }}" name="{{ name }}" value="{{ value|e }}" size="{{ size }}" /> {% endmacro %} |
Twig允许在任何地方使用表达式。这和常规的PHP非常类似,甚至如果你并不使用PHP的话,你会感觉很舒服。
提示:运算符优先级如下,首先列出的是最低优先级的操作:
b-and, b-xor, b-or, or, and, ==, !=, <, >, >=,
<=, in, matches, starts with, ends with, .., +,
-, ~, *, /, //, %, is, **, |, [], and
1 23 | {% set greeting = 'Hello ' %} {% set name = 'Fabien' %} {{ greeting ~ name|lower }} {# Hello fabien #} {# use parenthesis to change precedence #} {{ (greeting ~ name)|lower }} {# hello fabien #} |
提示:版本1.5新特性:Twig 1.5中对哈希键作为名称和表达式添加了支持。
表达式的最简单形式是文本。文本在PHP类型中表示,如字符串,数字和数组。存在下面这些文本:
※ “Hello World”:两个双引号或单引号之间的任何内容都是一个字符串。当你在模版中需要一个字符串的时候(例如:函数调用的参数、过滤器或者仅仅只是扩展或包含一个模版),它们非常有用。一个字符串可以包含一个分隔符,如果它前面有一个反斜杠(\)的话,例如:’It\’s good’。
※ 42 / 42.23:整数和浮点数是由刚写下的数字创建的。如果一个数存在一个点,那它就是一个浮点数,否则是个整数。
※ ["foo", "bar"]: 数组被定义为由逗号(,)分隔开、被方括号([])包裹着的表达式序列。
※ {“foo”: “bar”}:哈希表被定义为一个由逗号(,)分隔开、被花括号({})包裹着的、由[键]和[值]组成的列表。
1 23 | {# keys作为字符串 #} { 'foo': 'foo', 'bar': 'bar' } {# keys 作为名称(相当于以前的哈希表) -- as of Twig 1.5 #} { foo: 'foo', bar: 'bar' } {# keys 作为整数 #} { 2: 'foo', 4: 'bar' } {# keys 作为表达式 (表达式必须用括号包裹起来) -- as of Twig 1.5 #} { (1 + 1): 'foo', (a ~ 'b'): 'bar' } |
※ null:null表示没有特定的值。这是当一个变量不存在时返回的值。none 是 null 的一个别名。
数组和哈希可以嵌套:
1 | {% set foo = [1, {"foo": "bar"}] %} |
15.2 计算
Twig允许你对值进行计算。在模板中虽然很少有用,但因为完整性的缘故而存在。下面是被支持的操作符:
※ + :将两个对象加在一起(操作数被强制转换为数字)。 {{1+1}}是2。
※ - :从第一个数减去第二个数字。 {{3 – 2}}为1。
※ / :两个数相除。返回的值将是一个浮点数。 {{1/2}}是{{0.5}}。
※ % :计算一个整数被除的余数。 {{11%7}}是4。
※ // :两个数相除并返回的向下取整的整数结果。 {{20//7}}为2,{{-20//7}}是-3(这只是round过滤器的语法修饰)。
※ * :左操作数与右操作数相乘。 {{2*2}}将返回4。
※ ** :左操作数(n)的右操作数(m)次幂。(也就是n的m次方,n^m) {{2 ** 3}}将返回8。
15.3 逻辑
您可以将多个表达式使用下列运算符:
※ and: 如果左边和右边的操作数都为真,则返回true。
※ or: 如果左边或右边的操作数为真,则返回true。
※ not: 否定一个声明。
※ (expr): 构成一组表达式。
提示:Twig还支持位运算符(b-and, b-xor, and b-or)。
15.4 比较
以下比较操作符在任何表达式中都支持: ==, !=, <, >, >=, <=。
您也可以检查一个字符串是否以另一个字符串开头或结尾:
1 23 | {% if 'Fabien' starts with 'F' %} {% endif %} {% if 'Fabien' ends with 'n' %} {% endif %} |
1 2 | {% if phone matches '{^[\d\.]+$}' %} {% endif %} |
in 操作符进行包含测试。 如果左操作数是包含在左操作数,则返回true:
1 23 | {# returns true #} {{ 1 in [1, 2, 3] }} {{ 'cd' in 'abcde' }} |
要执行一个反面测试,使用 not in 操作符:
1 23 | {% if 1 not in [1, 2, 3] %} {# 以上等同于以下 #} {% if not (1 in [1, 2, 3]) %} |
is 操作符可以进行测试。测试可以用于测试针对一种常见的表达式的变量。右操作数是测试的名称:
1 2 | {# 找出是奇数的变量 #} {{ name is odd }} |
1 | {% if post.status is constant('Post::PUBLISHED') %} |
1 23 | {% if post.status is not constant('Post::PUBLISHED') %} {# 以上等同于以下 #} {% if not (post.status is constant('Post::PUBLISHED')) %} |
15.7 其它操作符
提示:1.12.0版本新特性:Twig 1.12.0 版本对扩展的三元运算符中添加了支持。
下列运算符是非常有用的,但不属于任何其他类别:
※ .. :创建一个基于前操作数和后操作数的序列(这只是range函数的语法修饰)。
※ | :应用一个过滤器。
※ ~ :所有的操作数转换为字符串并将其连接起来。{{ “Hello ” ~ name ~ “!” }} 将返回 (假设名字是’John’) Hello John!.
※ . , [] :获取一个对象的属性。
※ ?: :三元运算符(?:)。
1 23 | {{ foo ? 'yes' : 'no' }} {# as of Twig 1.12.0 #} {{ foo ?: 'no' }} is the same as {{ foo ? foo : 'no' }} {{ foo ? 'yes' }} is the same as {{ foo ? 'yes' : '' }} |
提示:1.5版本新特性: 字符串插值被添加到了 Twig 1.5版本中。
字符串插值(#{表达式})允许任何有效的表达式出现在双引号包裹字符串中。运行的结果中该表达式会被插入字符串:
1 2 | {{ "foo #{bar} baz" }} {{ "foo #{1 + 2} baz" }} |
提示:1.1版本新特性: 标记级别的空白符控制被添加到了 Twig 1.1版本中。
模板标签后的第一个换行符会被自动移除(就像在PHP中)。其它的空白符就不再被模板引擎修改,所以每个空白符(空格,制表符,换行符等)将会原封不动地被返回(给view)。
使用 spaceless 标签可以把HTML标签之间的空白符去掉:
1 23 | {% spaceless %} <div> <strong>foo bar</strong> </div> {% endspaceless %} {# 输出将会是:<div><strong>foo bar</strong></div> #} |
1 23 | {% set value = 'no spaces' %} {#- 没有领先或尾随的空白符 -#} {%- if true -%} {{- value -}} {%- endif -%} {# 输出:'no spaces' #} |
1 23 | {% set value = 'no spaces' %} <li> {{- value }} </li> {# 输出:'<li>no spaces </li>' #} |
Twig可以很容易被扩展。如果你正在寻找新的标签,过滤器,或函数,你看看Twig官方扩展库。
如果你想创建自己的扩展,请阅读创建一个扩展的篇章。
相关文章推荐
- ImageLoader开源项目学习
- OC-设计模式KVC+KVO定义及使用
- To Find or Update customer primary Address in Ax 2012
- 代码实现android手机信号监听
- Android高效显示图片详解(二)
- springMVC+Hibernate的配置
- What is Complex Event Processing? (Part 1)
- dubbo+zookeeper小例子
- Android系列---JSON数据解析
- Shell脚本学习
- 2015-06-29
- 深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接
- ArduinoYun教程之Arduino编程环境搭建
- 安卓有道词典开发实例
- Nagios 监控redis
- 06-图7. How Long Does It Take (25)
- easyui-datagrid高度放大或缩小动态设置分页参数
- Jquery操作DOM
- window命令修改ip,dns,查看适配器名称
- Python读写Redis数据库