twig 归纳- 部分
资料
官网: http://twig.sensiolabs.org/documentation
http://www.qiqiuyu.com/course/401
basic
一般以 .twig 结尾的文件名: a.html.twig Readme.txt.twig
两种分隔符:
{% ... %} 用于 for 循环, set变量, 全部的tag大类.
{{ ... }} 输出结果
变量的实现
变量实现的顺序, 从上到下依次查找
对象 foo.bar
{{ foo.bar }}
$arr = array(
'aaa' => '1',
'bbb' => '2'
);
arr.aaa ok
arr['aaa'] 仅能用于 数组
symfony 默认严格模式 为true ,单一使用是 是false,差别就是 如果打印了不存在的 变量名,或者属性名,严格模式下会报错,而非严格模式不会报错
全局变量
1._self 没什么用
2._context 上下文(包含了当前twig 页面所有的传过来的变量, 比较有用)
3._charset 当前 字符集
{{ dump(_self) }}
(要使用 dump, debug设置为true ,并且增加 twig一个扩展)
{% for value in _context %}
{{ dump(value) }}
{% endfor %}
{{ _charset }}
Tags大类
autoescape
自动转义(默认开启的),防止跨站攻击
如果关闭,
比如: 传入的变量 是一个 js的脚本,或者一个 html代码,都会运行,这样很危险
{% set a = "<strong>abc</strong>" %}
上面的abc内容 在 autoescape 关闭时,就会变粗体字。
当然,某些特殊情况下我们希望 他不要转义。可以定义某块区域,并把他关闭
{% autoescape false %}
...
{% endautoescape %}
单个变量 不要转义(希望执行 变量的内容),可以使用 raw过滤
{{ a|raw }}
include
可以将其他模板包含进来, 注意区别 extend ,include不能加载其他模板时不能重写其他模板里面的内容
1.可以用with传递和重新命名变量
example
render(index.html.twig, array('a'=>'apple','b'=>'bear'))
index.html.twig:
{% include 'header.html.twig' with {'appleName':a} %}
<body>
<strong>hello world!</strong>
</body>
header.html.twig:
<strong>header</strong>
{{ a }}
{{ b }}
{{ appleName }}
example2:
index.html.twig:
{% include 'header.html.twig' with {'appleName':a} only %}
<body>
<strong>hello world!</strong>
</body>
header.html.twig:
<strong>header</strong>
{{ appleName }}
加only的时候, 子模板不能直接调用上一层的变量
2.模板的名字,是可以传达的变量
example1:
render(index.html.twig, array('template'=>'header.html.twig'))
index.html.twig:
{% include template %}
<body>
<strong>hello world!</strong>
</body>
example2:
// 或者一个表达式
{% templateToggle ? 't1.html.twig' : 't2.html.twig' %}
<body>
<strong>hello world!</strong>
</body>
ignore missing关键字
比如说 include 不存在的模板,就不会报错
example1:
a.html.twig 这个模板不存在,如果不使用 ignore missing 关键字,就会报错,如果使用,则不会
index.html.twig:
{% include 'a.html.twig' ignore missing %}
<body>
<strong>hello world!</strong>
</body>
include 模板数组
如果使用数组,那么会优先调用数组第一个元素的模板,如果该模板不存在,则调用下一个,依次下去,如果都不存在,则报错
index.html.twig:
<body>
<strong>hello world!</strong>
</body>
{% include ['a.html.twig', 'footer.html.twig', 'header.html.twig'] %}
当然使用 ignore missing 同样有效:
{% include ['a.html.twig', 'footer.html.twig', 'header.html.twig'] ignore missing with {'appleName':a} %}
extend
继承某个页面,并且复写或填充内容到父页面的某个模块
继承标签:
1.必须写在第一行
2.如果用了继承block的话,不能在block外面写内容,否则报错
3.{{ parent() }} 父继承
4.一个页面只能extend 一次
5.基本模板不能定义两个以上同名 block
同样和 include 一样,支持block名字作为变量传递,支持表达式
example1: 看 index.html.twig 继承 layout.html.twig
layout.html.twig:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{% block title %}parent title{% endblock %}</title>
</head>
<body>
{% block content %}
parent content
{% endblock %}
</body>
</html>html
index.html.twig
{% extend 'layout.html.twig' %}
{% block tilte %}
{{ parent() }}
i am child title
{% endblock %}
{% block content %}
i am child content
{% endblock content %}
embed
资源:
http://twig.sensiolabs.org/doc/tags/embed.html
embed 标签拥有include 和extends的行为,既允许include其他模板,有允许重写 block里面的内容。
一个模板里面只能用一次extends,但是可以使用多个embed标签,相当于 php面向对象里面的implement
使用它的时候,可以先写 a 和 b 两个页面,总结其中的共同点,再写embed,然后再将a和b嵌套这个模板,如果一开始就去写embed,难免考虑不周详。
set
现在用到比较多的是 tab页切换的时候,传递这个值,是和block组合着用
{% set foo = 'bar' %}
{% set foo = [1,2,3] %}
{% set foo = 'foo'~'bar' %} // 相当于 字符串链接符
{% set foo, bar, name = 'foo', 'bar', 'aa' %} // 分别赋值
像函数作用域一样,只在这个 范围内 foo有效
{% set foo %}
<div id="pagination">
<p>hellfsdlf</p>
</div>
{% endset %}
值得注意的是 如果开启了自动转义,set里面的内容是不会被转义的
如果在for循环里面调用set的话,该循环外是不能使用该set变量的,所以如果想要在 for循环外面也使用的话,就在for外面定义好
{% set foo = 3 %}
{% for i in 1..5 %}
{% set foo = 1+i %} //这样的foo可以在循环外面调用的
{% endfor %}
spaceless
去除html之间的空格, 还可以只用-
(通过右键看源码有何不同)
{% spaceless %}
<div>
<p>foo</p>
</div>
{% endspaceless %}
用-
,相当于 php里面的trim去除两端空格的函数
{% set value = 'no space' %}
xxx {{ value }} yyyyy
xxx {{- value -}} yyyyy
flush
没用过
verbatim
是将标签里面的内容直接输出,不解析
用于当作 一个模板,可以传入后台存储起来
{% verbatim %}
<ul>
{% for i in 1..5 %}
{% set foo = 1+i %} //这样的foo可以在循环外面调用的
{% endfor %}
</ul>
{% endverbatim %}
转义的简单例子:
有个字符串为: aaaaaaa&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;bbbbbb;
我们知道,如果把这个字符串直接写到html里面,他会显示为:
aaaaaaa bbbbbb
&nbps;
这个就是转义字符,在显示的过程中就被转义了,如果你不希望他转义,仍然显示为
aaaaaaa&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;bbbbbb;
就可以在html页面里这么写:
{% verbatim %}
aaaaaaa&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;&nbps;bbbbbb
{% endverbatim %}
if
用法基本和php相似
用not表示! 非
{% if == user.sub %}
{% if not user.sub %}
filter
标签内的内容,可以使用多个filter进行过滤
{% filter lower|excape %}
<strong>SOME TEXT</strong>
{% endfilter %}
macro
相当与 在twig使用方法
组成:
1.macro 的名字---input
2.变量----- name, value, type, size 变量可以使用 default 设置默认值, 在使用input的时候,也可以缺省变量
3.里面是html代码
macro不能使用当前模板的变量,可以使用_context传入
使用方法:
macroTest.html.twig
:
{% macro input(name, value, type, size, _context) %}
<input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" />
{% endmacro %}
usemacro.html.twig
:
{% import "macroTest.html.twig" as forms %}
<p>{{ forms.input('username') }}</p>
<p>{{ forms.input('password', null, 'password') }}</p>
如果说:想在 macro模板(macroTest.html.twig
)里面使用宏,可以用下面的方法
{% import _self as forms %}
<p>{{ forms.input('username') }}</p>
如果说:想在 macro模板(macroTest.html.twig)里面调用其他宏,可以用下面的方法
{% macro wrapped_input(name, value, type, size) %}
{% import _self as forms %}
<div class="field">
{{ forms.input(name, value, type, size) }}
</div>
{% endmacro %}
from import
结合上面的macro, import的用法就是macro提到的那样,而from 是可以将macro中的方法名重命名,节省了 form.input 之类的调用方式,用 input_field 调用更加整洁美观
{% from 'macroTest.html.twig' import input as input_field, textarea %}
<dl>
<dt>Username</dt>
<dd>{{ input_field('username') }}</dd>
<dt>Password</dt>
<dd>{{ input_field('password', '', 'password') }}</dd>
</dl>
<p>{{ textarea('comment') }}</p>
for
http://www.qiqiuyu.com/course/401/learn#lesson/1013
filter 大类
json_encode
可以将 数组等转换为json格式,twig的json_encode 过滤方法其实内部是通过 php的json_encode 来实现的。
http://twig.sensiolabs.org/doc/filters/json_encode.html
用法1;
在php文件中:
$data = array(
'a'=>"fjsdlf",
'b'=>12,
);
return $this->render('RedwoodWebBundle:Note:create.html.twig', array(
'data' => $data,
));
把data这个值传到页面上。
在html中:
{{ data|json_encode() }}
最后在页面上就会显示为
用法2;
在html页面中:
{%
set testJson = {
categoryUrl: "url:fjlsdfjlsdjflsdfjl",
tagMatchUrl: "url:111111111",
locationUrl: "url:222222222"
}
%}
{{ dump(testJson) }}
{{ testJson|json_encode() }}
页面显示为:
array(3) { ["categoryUrl"]=> string(22) "url:fjlsdfjlsdjflsdfjl" ["tagMatchUrl"]=> string(13) "url:111111111" ["locationUrl"]=> string(13) "url:222222222" }
{"categoryUrl":"url:fjlsdfjlsdjflsdfjl","tagMatchUrl":"url:111111111","locationUrl":"url:222222222"}
看出两者的不同了吗?
用途:
1.ajax数据提交。
有时候我们会用ajax传输数据,这里的数据要求是json格式的。
$.post(url, {'postData':data}, function(results){
...
});
那么我们在页面进行一些操作动态给某个input赋值,赋值以后再通过ajax提交时,就可以用到他:
<input id="lesson-media-field" type="hidden" name="media" value="{{ field_value(lesson, 'media')|json_encode }}">
2.在html页面中 使用twig的set 定义的json数据(如上用法2)。
3.在js中,对对象数据进行过滤
app.config = {{
{
api:'12346',
editor_upload_path: '456'
}|json_encode|raw
}};
console.log(app.config);
raw
一般放在所有过滤的最后。
和 verbatim 用法一样,就是不转义,只是一个是针对 变量,一个是针对整个闭合的块。
出现
app.arguments = {{ script_arguments|json_encode|raw }};
对于script_arguments不想转义就可以使用。