twig 归纳- 部分

资料

官网: http://twig.sensiolabs.org/documentation
http://www.qiqiuyu.com/course/401

basic

一般以 .twig 结尾的文件名: a.html.twig Readme.txt.twig

两种分隔符:
{% ... %} 用于 for 循环, set变量, 全部的tag大类.

{{ ... }} 输出结果

变量的实现

变量实现的顺序, 从上到下依次查找

1

对象 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() }}

最后在页面上就会显示为
{"a":"fjsdlf","b":12}

用法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不想转义就可以使用。

转载于:https://www.cnblogs.com/tuziguaiguai/p/4287440.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值