转自 :http://pengbotao.cn/twig-template-language.html

Twig中有两种定界符{% ... %} 和 {{ ... }} , 前一种用来执行语句,比如for循环、IF判断、过滤等操作,后一种模版中用来显示变量。

Twig常用用法

可用符号

== != < > >= <= + - ~ * / // % ** | [] . .. and or not in is b-and b-or b-xor
部分符号的含义如下

~:连接两字符串,相当于 PHP 中的点号
//:整除
**:乘方,相当于 PHP 中的 ^
b-and、b-or、b-xor:按位与、按位或、按位异或
-:减法以及去除空白的简写用法,如 {{- 数据 }} => 去除左边的空白、{{ 数据 -}} => 去除右边的空白、{{- 数据 -}} => 去除两边的空白

注释

{# This is Twig Comment #}

变量

foo 为PHP赋值变量, 则模版中可以使用 {{ foo }}
如果该变量为数组或者对象,则可以使用 {{ foo.bar }}来表示,也可以直接调用类中的方法,如 {{ foo.getName }} 或当有参数传递时使用 {{ foo.getName(p1, p2, p3) }}

当模版中使用{{ foo.bar }}时,PHP会做如下判断来检测对应变量的值:
1. 检测foo是否是数组,并且bar是一个有效的KEY
2. 如果foo为对象,则检测bar是否为有效的属性
3. 如果foo为对象,但bar不是一个有效的属性,则检测bar是否为有效方法
4. 如果foo为对象,但bar不是一个有效的方法,则检测getBar是否为有效方法
5. 如果foo为对象,但getBar不是有效方法,则检测isBar是否为有效方法
6. 如果没有,则返回null

当foo为数组时,模版也可以这样使用:{{ foo['bar'] }}

变量未定义默认值设置:
{{ var|default('var is not defined') }}

可使用 {% set 变量名=变量值 %} 声明变量,也可写成 {% set 变量名 %} 变量值 {% endset %}

PHP 中非关联数组被映射成 [元素1, 元素2, ...],关联数组则被映射成 {键1: 值1, 键2: 值2, ...}

数组遍历

-- 按数组value遍历:

1
2
3
{% for value in foo %}
    {{ value }}
{% endfor %}

-- 按数组key遍历:

1
2
3
{% for key in foo|keys %}
    {{ key }}
{% endfor %}

-- 按key,value遍历

1
2
3
{% for key, value in foo %}
    {{ key}}:{{value }}
{% endfor %}

-- 如果 foo 非数组,还可以使用else语句,如:

1
2
3
4
5
{% for key, value in foo %}
    {{ key}}:{{value }}
{% else %} 
    foo is Not a Array
{% endfor %}

-- 也可以直接带条件,遍历二维数组时比较有用,可用value.field来判断:

1
2
3
{% for key, value in foo if value == 1%}
    {{ key}}:{{value }}
{% endfor %}

循环体内部变量:
loop.index 循环的次数(从1开始)
loop.index0 循环的次数(从0开始)
loop.revindex 循环剩余次数(最小值为1)
loop.revindex0 循环剩余次数(最小值为0)
loop.first 当第一次循环的时候返回true
loop.last 当最后一次循环的时候返回true
loop.length 循环的总数
loop.parent 被循环的数组

条件语句

-- 需要使用 or 和 and 代替 ||、&&

1
2
3
{% if a == '1' or b == '2' %}
a = 1 or b = 2
{% endif %}

-- 判断变量是否定义

1
2
3
{% if var is not defined %}
    {# do something #}
{% endif %}

-- 是否为NULL

1
2
3
{% if var is null %}
    {# do something #}
{% endif %}

-- 是否为false

1
2
3
{% if var is sameas(false) %}
    {# do something %}
{% endif %}

解析定界符

1
2
3
4
5
6
7
8
9
{{ '{{' }}
 
{% raw %}
    <ul>
    {% for item in seq %}
        <li>{{ item }}</li>
    {% endfor %}
    </ul>
{% endraw %}

控制结构

{% if aaa %} xxx {% elseif bbb %} yyy {% else %} zzz:判断语句
{% for %} xxx {% endfor %}:迭代变量
{% do %}:没什么其他含义,{% do 1+2 %} 等同于 {{ 1+2 }}
{% flush %}:刷新输出缓冲,等同于 flush
{% include %}:包含模板
{% extends %}:扩展模板
{% embed %} xxx {% endembed %}:包含模板并扩展该模板的内容,相当于 include 和 extends 的结合体
{% use %}:包含模板,近似于多重继承
{% from aaa import bbb as ccc %}:从指定模板导入宏并设置别名
{% macro %} xxx {% endmacro %}:定义宏以便多次调用,与定义 PHP 函数无异
{% sandbox %} {% include xxx %} {% endsandbox %}:对导入的模板指定沙箱模式,只对 include 语句有效,只在沙箱模式已开启的情况下生效
{% block xxx %} 或 {% block %} xxx {% endblock %}:定义代码块或覆盖代码块
{% set xxx %} 或 {% set %} xxx {% endset %}:在模板内定义变量
{% filter %} xxx {% endfilter %}:多行过滤器
{% spaceless %} xxx {% endspaceless %}:去除 HTML 片段中的空格
{% autoescape %} xxx {% endautoescape %}:将字符串安全地处理成合法的指定数据
{% verbatim %} xxx {% endverbatim %}:阻止模板引擎的编译,是 raw 的新名字

内建过滤器

过滤器用来修饰数据,各过滤器可以用竖线分隔进行链式调用,用括号传递参数

也可以将过滤器当成单独的函数来用,形式如下:

1
2
3
{% filter 过滤器名 %}
待处理的数据
{% endfilter %}

batch:将数组按指定的个数分割成更小的数组,可选的第二个参数用来在元素不够的情况下进行填充。如 {{ [1, 2, 3, 4, 5]|batch(2, 'NoItem') }} => [[1, 2], [3, 4], [5, 'NoItem']]
date_modify:修改时间,常与 date 联用。如 {{ ''|date_modify('+3 days')|date('Y-m-d') }} => 将当前时间加3天后显示
default:当所修饰的数据不存在或为空时,提供默认值。如 {{ ''|default('Ruchee') }} => 'Ruchee'
escape:将字符串安全地处理成合法的指定数据,可简写为 e,支持多种转换模式,默认模式为 html,其他可选模式有 html_attr、js、css、url
first:返回数组的第一个元素或字符串的第一个字符。如 {{ {a: 1, b: 2, c: 3}|first }} => 1
last:返回数组的最后一个元素或字符串的最后一个字符。如 {{ {a: 1, b: 2, c: 3}|last }} => 3
replace:替换一个字符串中的指定内容。如 {{ '%s1 love %s2'|replace({'%s1': 'Ruchee', '%s2': 'Vim'}) }} => 'Ruchee love Vim'
raw:让数据在 autoescape 过滤器里失效

借用自PHP自带函数的过滤器

abs:取绝对值
nl2br:将字符串里的 \n 替换成 <br/>
join:将数组的各个元素按指定分隔符组成字符串
sort:对数组排序
trim:去除字符串首尾的指定字符,默认为空格
date:格式化时间,可处理与 strtotime 兼容的字符串,或 DateTime/DateInterval 的实例,可选的第二个参数用于指定时区,如果所修饰的数据为空则默认为当前时间
reverse:反转一个数组或字符串,在 array_reverse 的基础上增加了对字符串的处理
slice:截取数组或字符串的一部分,在 array_slice 的基础上增加了对字符串的处理
keys:将数组的全部键名提取成一个数组,等同于 array_keys
merge:合并两数组,近似于 array_merge 。如 {{ 数组1|merge(数组2) }}
length:返回数组元素的个数或字符串的长度,等同于 count 和 strlen 的结合体
capitalize:将字符串的首字母大写,等同于 ucfirst
title:将字符串中每个单词的首字母大写,等同于 ucwords
lower:将字符串所有字母全部变成小写,等同于 strtolower
upper:将字符串所有字母全部变成大写,等同于 strtoupper
split:将字符串分割成数组,等同于 str_split
striptags:去除字符串中的 HTML/PHP 标记,等同于 strip_tags
url_encode:编码链接字符串,等同于 urlencode
json_encode:编码 JSON 格式,等同于 json_encode
format:格式化一个字符串,近似于 printf 。如 {{ 'My name is %s, and I love %s'|format('Ruchee', 'Vim') }} => 'My name is Ruchee, and I love Vim'
number_format:格式化数值,等同于 number_format
convert_encoding:编码转换,第一个参数指定转换后的编码,第二个参数指定转换前的编码,近似于 iconv

内建函数

even:是否为偶数
odd:是否为奇数
empty:是否为空
null:是否为 null
defined:是否已定义
sameas:目标变量与指定值是否指向的是内存中的同一个地址,使用形式 if 变量值 is sameas(指定值)
divisibleby:目标数值是否能够被指定值整除,使用形式 if 目标数值 divisibleby(指定值),其中指定值不能为 0
iterable:目标变量是否是数组或者是否可迭代,使用形式 if 变量值 is iterable
attribute:动态获取变量属性值,两种使用形式为 attribute(数组, '元素名') 和 attribute(对象, '方法名', 可选参数)
block:重复引用指定代码块,如 {{ block('title') }}
constant:从字符串或对象取得常量值
cycle:循环显示一个数组的元素,调用形式为 cycle(数组, 一个循环变量)
date:格式化时间
dump:在开启调试模式的情况下显示详细的变量信息,等同于 var_dump
include:包含其他模板文件
parent:在覆盖代码片段时用于引用父片段的内容
random:制造一个随机数
range:返回一个指定区间的数组,可指定步长,Twig 使用 .. 作为其简用法,等同于 range
template_from_string:根据字符串加载模板

Twig模版语言入门的更多相关文章

  1. Django模版语言 格式化显示 后台datatime()时间

    Django模版语言 格式化显示 后台datatime()时间 场景描述:

  2. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  3. 我为什么反对推荐新人编程C/C++语言入门?

    虽然我接触编程以及计算机时间比较早,但是正式打算转入程序员这个行当差不多是大学第四年的事情 从03年接触计算机,07年开始接触计算机编程, 期间接触过的技术包括 缓冲区溢出(看高手写的shellcod ...

  4. 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书

    <C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...

  5. c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码初级:C语言入门必备(以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言的数 ...

  6. 【转】c语言入门教程 / c语言入门经典书籍

    用C语言开始编写代码 初级:C语言入门必备 (以下两本书任选一本即可) C语言是作为从事实际编程工作的程序员的一种工具而出现的,本阶段的学习最主要的目的就是尽快掌握如何用c语言编写程序的技能.对c语言 ...

  7. Swift语言入门之旅

    Swift语言入门之旅  学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...

  8. Jinja2模版语言自定义filter的使用

    Jinja2模版语言,自带有一些filter,能够在前端的模版中控制数据按照相应的方式显示.比如以下两种filter,分别能在前端控制数字的近似精度显示和根据字符串长度补齐: round(value, ...

  9. 《Ruby语言入门教程v1.0》学习笔记-01

    <Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...

随机推荐

  1. spring mvc 配置对静态资源的访问

    在spring mvc的配置文件中做如下配置: 1. <?xml version="1.0" encoding="UTF-8"?> <bean ...

  2. ASP.NET 5系列教程 (三):view components介绍

    在ASP.NET MVC 6中,view components (VCs) 功能类似于虚拟视图,但是功能更加强大. VCs兼顾了视图和控制器的优点,你可以把VCs 看作一个Mini 控制器.它负责控制 ...

  3. Windows 8.1——将网站固定到开始菜单,自定义图标、颜色和Windows推送通知

    记得在IE 9和Windows 7刚出来那会儿我写过一篇文章来介绍如何自定义网站将其固定到Windows的任务栏上,同时自定义图标及任务内容.那个功能在IE 9中被称之为JumpList.http:/ ...

  4. 【Android】Eclipse Memory Analyzer 进行堆内存溢出分析

    MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件.     不同厂家的 JVM 所生成的堆转储文件在数据存储格式以及数据存储内容上有很多区别,但是比较主流的厂家和格式,例如 Sun, HP, ...

  5. D. Book of Evil

    D. Book of Evil time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  6. Android组件Spinner使用

    Spinner组件是Android当中非常常用的一种用于下拉选择的组件. 本blog当中主要解决的几个问题: 如何在XML中初始化Spinner选项 如何使用代码的方式初始化Spinner选项 一个A ...

  7. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  8. android: startActivityForResult用法详解

    一.如果想在Activity中得到新打开Activity 关闭后返回的数据,需要使用系统提供的startActivityForResult(Intent intent, int requestCode ...

  9. InstallShield 2012 Spring优惠升级到最新版本(2015.4.30之前)

    InstallShield 2012 Spring即将EOF,所以仍在使用InstallShield 2012 Spring的用户请注意下面内容: InstallShield 2012 Spring升 ...

  10. [转]office2010一直卡在“正在受保护的视图中打开”

    用Office 2010 打开文件遇到“”,如下图: 转自: 解决办法: 还可以使用下面的方法打开上图的受保护视图设置界面:   1. 启动 Word 2010 应用程序,单击[文件]按钮并选择[选项 ...