Twig模板引擎快速入门

作者:南丞 时间:2018-01-13 05:00

Twig模板引擎简单解析

前言

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。

twig 的模板就是普通的文本文件,也不需要特别的扩展名,.html .htm .twig 都可以。

定界符

{  % ... %  }
{ { ... } }

代码

{  % for item in list %  }
    <tr>
	    <td>{ { item.id } }</td>
	    <td>{ { item.username } }</td>
	    <td>{ { item.email } }</td>
	    <td>{ { item.statusAlias() } }</td>
	    <td>{ { item.created_at|date('Y-m-d') } }</td>
	    <td>
	        <a href="{ { url('admin/user/update', {'id': item.id }) } }">编辑</a>
	        <a class="pfinal-confirm" href="{ { url('admin/user/delete', {'id': item.id }) } }">删除</a>
	    </td>
    </tr>
{  % endfor %  }

注释

{# 这是注释 #}

变量

1.id 为PHP赋值变量,则模板中可以使用 { { id } }

2.arr 为PHP中数组,则模板中可以使用 { { arr.id } } 或者 { { arr['id'] } }

3.obj 为PHP赋值对象,则模板中可以使用 { { obj. 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

变量赋值

1.{  % set id=1 %  }
2.{  % set arr=[1,2,3] %  }
3.{  % set obj={'name':'san'} %  }

###数组遍历

– 按数组value遍历:

{  % for value in foo %  }
    { { value } }
{  % endfor %  }

– 按数组key遍历:

{  % for key in foo|keys %  }
    { { key } }
{  % endfor %  }

– 按key,value遍历

{  % for key, value in foo %  }
    { { key} }:{ {value } }
{  % endfor %  }

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

{  % for key, value in foo %  }
    { { key} }:{ {value } }
{  % else %  }  
    foo is Not a Array
{  % endfor %  }

###条件语句 – 需要使用 or 和 and 代替 ||、&&

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

– 判断变量是否定义

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

– 是否为NULL

{  % if var is null %  }
	{# do something #}
{  % endif %  }

– 是否为false

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

– 控制结构

1.判断语句

{  % if aaa %  }
 xxx
 {  % elseif bb %  }
 yyy
 {  % else %  }
 zzz

2.循环语句

{  % for %  }
	xxx
{  % endfor %  }

3.包含模板

 {  % include %  }

4.模板继承

 {  % extends %  }

5.定义代码块或覆盖代码块

{  % block xxx %  } 或 {  % block %  } xxx {  % endblock %  }

###过滤器 过滤器用来修饰数据,各过滤器可以用竖线分隔进行链式调用,用括号传递参数,也可以将过滤器当成单独的函数来用,形式如下:

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

1.batch:将数组按指定的个数分割成更小的数组。如:

{ {[1,2,3,4,5]|batch(2,'demo') } }
运行的结果:
[[1,2],[3,4],[5,'demo']]

2.date_modify: 修改时间, 常与date联用。如:

	{ { ''|date_modify('+3 days')|date('Y-m-d') } }
	显示后3天的时间

3.default: 当所修饰的数据不存在或为空时,提供默认值。如

	{ { ''|default('没有数据') } }

4.escape: 将字符串安全地处理成合法的指定数据 默认的为html 5.first: 返回数组的第一个元素或字符串的第一个字符。如:

	{ { {a:1,b:2,c:3}|first } }
	结果为: 1

6.last: 返回数组的最后一个元素或字符串的最后一个字符.如:

	{ { {a:1,b:2,c:3}|last } }
	结果为: 3

7.replace: 替换一个字符串中的指定内容. 如

{ { '%s1 love %s2' |replace({'%s1':'dou','%s2':'demo'}) } }
结果为
dou love demo

###PHP函数的过滤器

abs:取绝对值

nl2be:将字符串里的\n替换

join: 将数组的各个元素按指定分隔符组成字符串

sort: 对数组排序

trim: 去除字符串首尾的指定字符 默认为空格

date: 格式化时间,可处理与strtotime兼容的字符串

reverse: 反转一个数组或字符串

slice: 截取数组或字符串的一部分

keys: 将数组的全部键名提取成一个数组,等同于array_keys

merge:合并两数组,近似于array_merge。如{ { 数组1 merge(数组2)} }

length: 返回数组元素的个数或字符串的长度,等同于count和s†rlen的结合体

capitalize: 将字符串的首字母大写,等同于 ucfirst

title: 将字符串中每个单词的首字母大写,等同于 ucwords

lower: 将字符串所有字母全部变成小写,等同于 strtolower

upper: 将字符串所有字母全部变成大写,等同于 strtoupper

split: 将字符串分割成数组,等同于urlencode

striptags: 去除字符串中的HTML/PHP标记,等同于strip_tags

url_encode: 编码连接字符串,等同于urlencode

json_encode: 编码JSON格式,等同于json_encode

###macro标签 macro(宏标签)类似于其他语言中的函数,常用于填充html标签,比如用来渲染]<input>

{  % macro input(name,value,type.size) %  }
{  % macro input(name, value, type, size) %  }  
    <input type="{ { type|default('text') } }" name="{ { name } }" value="{ { value|e } }" size="{ { size|default(20) } }" />  
{  % endmacro %  }  
{  % endmacro %  }

macro与函数的不同之处在于:

参数的默认值是通过macro块内部的 default过滤器来定义的。

参数总是可选的。

另外,就跟php函数一样,macro内部是无法使用外部的变量的。但你可以传递一个特殊变量_context作为参数来获取整个内容。

macro可以被定义在任何的模板内,但在你使用之前需要使用 imported[html]

    {#// 导入 forms.html 然后 取个别保叫做 forms #}
    {  % import "forms.html" as forms %  }  #}

    {#// 然后就可以像下面那样使用了 #}
    <p>{ { forms.input('username') } }</p>  
    <p>{ { forms.input('password', null, 'password') } }</p>  

    {#// 如果你要在定义macro的模板里使用,就不需要imported 可以使用特殊变量_self#}
    <p>{ { _self.input('username') } }</p>

如果你要定义一个macro里 包含另一个macro,并且两个macro在同一个文件里,可以使用特殊变量_self

	{  % macro input(name, value, type, size) %  }  
		<input type="{ { type|default('text') } }" name="{ { name } }" value="{ { value|e } }" size="{ { size|default(20) } }" /> 
		 
	{  % endmacro %  }  
		
	{  % macro wrapped_input(name, value, type, size) %  }  
		<div class="field">  
		    { { _self.input(name, value, type, size) } }  
		</div>  
	{  % endmacro %  }  

评论:

回到顶部
回到顶部