2、来说明一些基础的东西htmlviewplaincopyprint1.2.3.4.MyWebpage5.6.7.8.%foriteminnavigation%9.item.caption10.%endfor%11.12.13.MyWebpage14.a_variable15.16.里面包含两种符号%.%和.第一种用来控制的比如for循环什么的,第二个是用来输出变量和表达式的ide支持很多ide都对twig进行高亮支持。大伙自己找需要的吧。TextmateviatheTwigbundleVimviatheJinjasyntaxpl
3、uginNetbeansviatheTwigsyntaxpluginPhpStorm(nativeasof2.1)EclipseviatheTwigpluginSublimeTextviatheTwigbundleGtkSourceViewviatheTwiglanguagedefinition(usedbygeditandotherprojects)CodaandSubEthaEditviatheTwigsyntaxmode变量程序会传递给模板若干变量,你需要在模板里输出他们。例如输出$hellohtmlviewplaincopy
4、print1.hello如果传递给模板的是对象或者数组,你可以使用点.来输出对象的属性或者方法,或者数组的成员。或者你可以使用下标的方式。htmlviewplaincopyprint1.foo.bar2.foobar如果你访问的值不存在就会返回null。TWIG有一整套的流程来确认值是否存在。for.bar会进行以下操作。如果foo是个数组,就尝试返回bar成员,如果不存在的话,往下继续。如果foo是个对象,会尝试返回bar属性,如果不存在的话,往下继续。会尝试运行bar方法,如果不存在的话,往下继续。会尝试运行getBar方法,如果不存在的话,往下继续。会尝试运行isBa
5、r方法,如果不存在的话,返回nullforbar就简单很多了for必须是个数组,尝试返回bar成员,如果不就返回null全局变量TWIG定义了有一些全局变量_self这个参看macro标签_context这个就是当前的环境_charset:当前的字符编码变量赋值具体参见set标签htmlviewplaincopyprint1.%setfoo=foo%2.%setfoo=1,2%3.%setfoo=foo:bar%过滤器Firters变量可以被过滤器修饰。过滤器和变量用(|)分割开。过滤器也是可以有参数的。过滤器也可以被多重使用。下面这例子就使用了两个过滤器。html
6、viewplaincopyprint1.name|striptags|titlestriptas表示去除html标签,title表示每个单词的首字母大写。更多过滤器参见我博客过滤器也可以用在代码块中,参见filter标签htmlviewplaincopyprint1.%filterupper%2.Thistextbecomesuppercase3.%endfilter%函数Function这个没什么好说的,会写程序的都知道,TWIG内置了一些函数,参考我的博客举个例子返回一个0到3的数组,就使用range函数htmlviewplaincopyprint1.%
7、foriinrange(0,3)%2.i,3.%endfor%流程控制支持for循环和if/elseif/else结构。直接看例子吧,没什么好说的。htmlviewplaincopyprint1.Members2.3.%foruserinusers%4.user.username|e5.%endfor%6.htmlviewplaincopyprint1.%ifusers|length0%2.3.%foruserinusers%4.user.username|e5.%endfor%6.7.%endif%注释#.#包围的内容会被注释掉,可以是单行
8、也可以是多行。载入其他模板详见include标签(我博客内已经翻译好哦),会返回经过渲染的内容到当前的模板里htmlviewplaincopyprint1.%includesidebar.html%当前模板的变量也会传递到被include的模板里,在那里面可以直接访问你这个模板的变量。比如htmlviewplaincopyprint1.%forboxinboxes%2.%includerender_box.html%3.%endfor%在render_box.html是可以访问box变量的加入其他参数可以使被载入的模板只访问部分变量,或者完全访问不到。参考手册模板
10、dblock%15.16.17.我们定义了4个block块,分别是blockhead,blocktitle,blockcontent,blockfooter注意1、block是可以嵌套的。2、block可以设置默认值(中间包围的内容),如果子模板里没有覆盖,那就直接显示默认值。比如blockfooter,大部分页面你不需要修改(省力),但你需要到时候仍可以方便到修改(灵活)下面我看下子模板应该怎么定义。htmlviewplaincopyprint1.%extendsbase.html%2.3.%blocktitle%Index%endblock%4.%
11、blockhead%5.parent()6.7..importantcolor:#336699;8.9.%endblock%10.%blockcontent%11.Index12.13.Welcomeonmyawesomehomepage.14.15.%endblock%注意%extendsbase.html%必须是第一个标签。其中blockfooter就没有定义,所以显示父模板中设置的默认值如果你需要增加一个block的内容,而不是全覆盖,你可以使用parent函数htmlviewplaincopyprint1.%blocksidebar%2.
12、TableOfContents3..4.parent()5.%endblock%extends标签只能有一个,所以你只能有一个父模板,但有种变通到方法来达到重用多个模板到目的,具体参见手册的use标签HTML转义主要是帮助转义尖括号等,&,可以有两种办法。一种是用标签,另一种是使用过滤器。其实TWIG内部就是调用php的htmlspecialchars函数htmlviewplaincopyprint1.user.username|e2.user.username|e(js)3.4.%autoescapetrue%5.Everythingwillbeautom
13、aticallyescapedinthisblock6.%endautoescape%因为是TWIG的操作符,如果你需要输出两个花括号,最简单到办法就是htmlviewplaincopyprint1.还可以使用raw标签和raw过滤器,详细参考手册htmlviewplaincopyprint1.%raw%2.3.%foriteminseq%4.item5.%endfor%6.7.%endraw%macros宏宏有点类似于函数,常用于输出一些html标签。这里有个简单示例,定义了一个输出input标签的宏。htmlviewplaincopyprint1.
14、%macroinput(name,value,type,size)%2.3.%endmacro%宏参数是没有默认值的,但你可以通过default过滤器来实现。一般来说宏会定义在其他到页面,然后通过import标签来导入,htmlviewplaincopyprint1.%importforms.htmlasforms%2.3.forms.input(username)你也可以只导入一个文件中部分宏,你还可以再重命名。htmlviewplaincopyprint1.%fromforms.htmlimportinputasinput_field,textarea%2.3.
15、4.Username5.input_field(username)6.Password7.input_field(password,type=password)8.9.textarea(comment)上面的代码表示从forms.html中导入了input和textarea宏,并给input重命名为input_field。表达式TWIG允许你在任何地方使用表达式,他的规则和PHP几乎一模一样,就算你不会PHP仍然会觉得很简单。最简单的有字符串:“helloworld”或者helloworld数字:42或者42.33数组:a,b,c哈希:a:av,b:bv
16、其中keys可以不要引号也可以是数字还可以是一个表达式,比如a:av,b:bv1:1v,2:2v1+2:12v逻辑:true或者false最后还有null你可以嵌套定义htmlviewplaincopyprint1.%setfoo=1,foo:bar%运算符包括数字运算+-*/%(求余数)/(整除)*(乘方)htmlviewplaincopyprint1.2*3=62.2*3=8逻辑运算andornot比较运算===!=包含运算in以下的代码会返回truehtmlviewplaincopyprint1.1in1,2
17、,32.cdinabcde测试运算is这个不用多说直接看代码htmlviewplaincopyprint1.nameisodd2.%ifloop.indexisdivisibleby(3)%3.%ifloop.indexisnotdivisibleby(3)%4.#isequivalentto#5.%ifnot(loop.indexisdivisibleby(3)%其他操作符.建立一个指定开始到结束的数组,他是range函数的缩写,具体参看手册htmlviewplaincopyprint1.%foriin0.3%2.i,3.%endfor%4.|使用一
18、个过滤器htmlviewplaincopyprint1.#outputwillbeHELLO#2.hello|upper强制字符串连接htmlviewplaincopyprint1.Helloname!:三元操作符htmlviewplaincopyprint1.fooyes:no.得到一个对象的属性,比如以下是相等的。htmlviewplaincopyprint1.foo.bar2.foobar你还可以在一个字符串内部插入一个表达式,通常这个表达式是变量。格式是#表达式htmlviewplaincopyprint1.foo#barbaz2.foo#1+2baz空白控制和php一样,在TWIG模板标签之后的第一个换行符会被自动删掉,其余的空白(包括空格tab换行等)都会被原样输出。使用spaceless标签就可以删除这些HTML标签之间的空白htmlviewplaincopyprint1.%spaceless%2.3.foo4.5.%endspaceless%6.7.#outputwillbef