twig for in 循环什么时候用?for in 循环跟jquery ajax for循环请求不能同时用为什么?

JavaScript 中 for in 循环和数组的问题 - WEB前端 - 伯乐在线
& JavaScript 中 for in 循环和数组的问题
JavaScript的for…in循环用于迭代访问对象中的可枚举(enumerable)属性:
JavaScript
var tMinus = {
two: "Two",
one: "One",
zero: "Blast off!"
var countdown = "";
for (var step in tMinus) {
countdown += tMinus[step] + "n";
console.log(countdown);
// =& "Two
Blast Off!
1234567891011121314151617
var tMinus = {&&&&two: "Two",&&&&one: "One",&&&&zero: "Blast off!"};&var countdown = "";&for (var step in tMinus) {&&&&countdown += tMinus[step] + "n";}&console.log(countdown);// =& "Two//&&&&One//&&&&Blast Off!//&&&&"
因为for…in循环支持所有的JavaScript对象,所以它同样可用于数组对象之中:
JavaScript
var tMinus = [
"Blast off!"
var countdown = "";
for (var step in tMinus) {
countdown += tMinus[step] + "n";
console.log(countdown);
// =& "Two
Blast Off!
1234567891011121314151617
var tMinus = [&&&&"Two",&&&&"One",&&&&"Blast off!"];&var countdown = "";&for (var step in tMinus) {&&&&countdown += tMinus[step] + "n";}&console.log(countdown);// =& "Two//&&&&One//&&&&Blast Off!//&&&&"
然而,以这样的方式遍历数组存在三个问题。首先,for…in循环会遍历数组对象的原型链中所有的可枚举属性:
JavaScript
Array.prototype.voice = "James Earl Jones";
var tMinus = [
"Blast off!"
var countdown = "";
for (var step in tMinus) {
countdown += tMinus[step] + "n";
console.log(countdown);
// =& "Two
Blast Off!
James Earl Jones
1234567891011121314151617181920
Array.prototype.voice = "James Earl Jones";&var tMinus = [&&&&"Two",&&&&"One",&&&&"Blast off!"];&var countdown = "";&for (var step in tMinus) {&&&&countdown += tMinus[step] + "n";}&console.log(countdown);// =& "Two//&&&&One//&&&&Blast Off!//&&&&James Earl Jones//&&&&"
不过,我们可以借助hasOwnProperty函数来避免这一问题:
JavaScript
Array.prototype.voice = "James Earl Jones";
var tMinus = [
"Blast off!"
var countdown = "";
for (var step in tMinus) {
if (tMinus.hasOwnProperty(step)) {
countdown += tMinus[step] + "n";
console.log(countdown);
// =& "Two
Blast Off!
123456789101112131415161718192021
Array.prototype.voice = "James Earl Jones";&var tMinus = [&&&&"Two",&&&&"One",&&&&"Blast off!"];&var countdown = "";&for (var step in tMinus) {&&&&if (tMinus.hasOwnProperty(step)) {&&&&&&&&countdown += tMinus[step] + "n";&&&&}}&console.log(countdown);// =& "Two//&&&&One//&&&&Blast Off!//&&&&"
此外,在中提到,for…in循环可能以任意顺序来遍历对象的属性。
对于无序的普通对象来说,属性的访问顺序无关紧要。但有时候你可能不想Javascript engine以随机顺序处理你的数组元素,因为它会导致不可预知的结果:
JavaScript
console.log(countdown);
// =& "Blast Off!
console.log(countdown);// =& "Blast Off!//&&&&One//&&&&Two//&&&&"
最后,for…in循环除了访问数组元素以外,还会访问其它的可遍历属性。正如我们在所提到的,我们可以向数组变量添加额外的属性。而这样的操作同样会导致不可预知的后果:
JavaScript
var tMinus = [
"Blast off!"
tMinus.announcer = "Morgan Freeman";
var countdown = "";
for (var step in tMinus) {
if (tMinus.hasOwnProperty(step)) {
countdown += tMinus[step] + "n";
console.log(countdown);
// =& "Two
Blast Off!
Morgan Freeman
12345678910111213141516171819202122
var tMinus = [&&&&"Two",&&&&"One",&&&&"Blast off!"];&tMinus.announcer = "Morgan Freeman";&var countdown = "";&for (var step in tMinus) {&&&&if (tMinus.hasOwnProperty(step)) {&&&&&&&&countdown += tMinus[step] + "n";&&&&}}&console.log(countdown);// =& "Two//&&&&One//&&&&Blast Off!//&&&&Morgan Freeman//&&&&"
由此可见,当你需要遍历数组元素的时候,应使用for循环或者数组对象的内置迭代函数(如forEach、map等),而不是for…in循环。
关于作者:
可能感兴趣的话题
关于伯乐前端
伯乐前端分享Web前端开发,包括JavaScript,CSS和HTML5开发技术,前端相关的行业动态。
新浪微博:
推荐微信号
(加好友请注明来意)
– 好的话题、有启发的回复、值得信赖的圈子
– 分享和发现有价值的内容与观点
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 翻译传播优秀的外文文章
– 国内外的精选文章
– UI,网页,交互和用户体验
– 专注iOS技术分享
– 专注Android技术分享
– JavaScript, HTML5, CSS
– 专注Java技术分享
– 专注Python技术分享
& 2016 伯乐在线twig模板获取全局变量的方法
本文实例讲述了twig模板获取全局变量的方法。分享给大家供大家参考,具体如下:
简单介绍下,twig是一模板引擎,可以简化php的编写过程,提高效率。
而Symfony模板里,就自带了twig这一模板引擎。
twig的语法用的多的,也就三种,也是比较容易的
1、{{..}},这个在twig里是代表输出变量的意思,举个例子:
2、{%…%},这个在twig里代表的是进行判断,举个例子(取自twig官方文档示例):
判断值是否为真:
{% if online == false %}
&p&Our website is in maintenance mode. Please, come back later.&/p&
判断值是否为空:
{% if users %}
{% for user in users %}
&li&{{ user.username|e }}&/li&
{% endfor %}
{% endif %}
判断能否找到这个值:
{% if users is defined %}
&li&{{ user.username|e }}&/li&
{% endif %}
3、{#…#},这个事注释的意思
大概的语法介绍完了,然后就是这个如何用twig输出全局变量。
搜了半天都没找到,最后翻墙找到了,下面上代码
{{ app.session.get('varname') }}
上面的varname 就是需要输出的session数组里对应的值的名字。
目前还在继续学习twig这个模板引擎。欢迎指正,补充。
本文永久地址:/6823.html
本文出自 IT985博客 ,转载时请注明出处及相应链接。
更多关于PHP模板相关内容感兴趣的读者可查看本站专题:《PHP模板技术总结》、《smarty模板入门基础教程》、《codeigniter入门教程》及《ThinkPHP入门教程》
希望本文所述对大家PHP程序设计有所帮助。
顶一下(0) 踩一下(0)
热门标签:【转】Twig模板引擎:模板设计者部分
这篇文档描述了模板引擎的语法。本文档将是制作Twig模板最有用的参考文档。&
  模板就是简单的文本文件。它可以生成任意基于文本的格式(例如:HTML,XML,CSV,LaTeX等等)。模板不具有特定的后缀名,无论是.html还是.xml都是一样的。&&
  &模板中包含变量或者表达式。这些变量或者表达式将会在模板被解析的时候被对应的值替换。同时模板中也包含可以控制模板逻辑结构的标签。
  下面是一个包含了一些基本要素的模板,在后面的文档中我们会涉及到它的详细内容:
&My&Webpage&
&&ul&id="navigation"&&
  &{%&for&item&in&navigation&%}&
  &&li&&a&href="{{&item.href&}}"&{{&item.caption&}}&/a&&/li&&
&{%&endfor&%}&
&&h1&My&Webpage&/h1&&
&{{&a_variable&}}&
  模板中有两种界定符,{%&…&%}&和&{{&…&}}。&第一种用来执行声明语句,例如for循环;后一种用来显示模板表达式的结果。&
  现代IDE对很多语言具有语法高亮和自动完成的功能。由于Twig的语法与Jinja和Django模板相当类似,只要支持上述两种Python模板的IDE应该都支持Twig。
  如果使用Textmate,可以使用代码片段(bundle)或者代码片段。
  如果使用Vim,可以使用&(注:原文对应的链接失效,故将链接修改为vim的插件链接)&
Variables变量&
  应用程序将那些可以改变模板显示结果的变量传给模板文件。如果变量具有属性或者元素的话,你同样可以访问到这些属性或者元素。变量是在应用程序中进行赋值的。
  你可以通过点号(.)来访问变量的属性,或者你也可以使用一种叫做“脚注”的语法([])的语法来对变量的属性进行访问。下面的几行作用相同:
&{{&foo.bar&}}&
&{{&foo['bar']&}}&
  注意:大括号不是变量的一部分,它仅仅是打印语句(此处类似于PHP代码的echo&$foo['bar'])。如果在tags中访问变量,千万不要在变量两端加上大括号。
  如果变量或者属性不存在,那么将会等到一个可以使用none表达式来测试的null值。
  根据惯例,foo.bar会以以下顺序执行:&
判断foo是否是个数组,bar是否是数组中的合法的元素(此处应该指的是键值吧)&
如果不是,继续判读foo是否是对象,bar是否是对象中合法的属性&
如果不是,继续判断foo是否是对象,bar是否是合法的方法(即使bar是构造函数,使用__construct()来代替就可以了)&
如果不是,继续判断foo是否是对象,判断getBar是否是合法的方法&
如果不是,继续判断foo是否是对象,判断isBar是否是合法的方法&
如果不是,返回null值
foo['bar']&基本上与foo.bar相同,仅仅是在顺序上面有些许不同:&
判断foo是否是数组、bar是否是合法的元素&
如果不是,返回null值
第二种语法在对动态获取数组属性中也很有用。
&&foo[bar]&
&&[/jinja]
Twig模板文件中可以引用下列模板变量:&
_self:当前模板
_context:当前的内容(模板内容?)&
_charset:当前的编码
变量可以被过滤器(filters)所修改。过滤器与模板变量之间以管道符号(|)进行分割,并且可以在圆括号中使用可选的参数。多个过滤器可以进行链式操作,一个过滤器的结果将传递给下一个过滤器作为参数。
  以{{&name|striptags|title&}}为例,这里的操作为“先将name变量中的HTML标签全部移除后,在进行标题化处理”。过滤器中可以使用参数,参数需要像函数调用一样放在圆括号内。下面这个例子就是讲列表中的元素用逗号(,)连接起来{{list|join(',')}}.。
  下面关于内置过滤器的章节将会对所有的内置过滤器进行详细描述。&
  如果需要在模板中进行代码注释,就需要使用注释语法{#&…&#}。注释在对模板进行调试、或者为其他模板开发人员或者你自己增加相关信息时非常有用。
  &{#&note:&disabled&template&because&we&no&longer&use&this&
  &{%&for&user&in&users&%}&
&…&&{%&endfor&%}&
&#}&&[/jinja]&
空字符控制&
和PHP一样,在模板标签后的第一个换行符会被自动的删除掉。空字符不再会被模引擎修改,所以每个空字符(空格、tab和换行符)都不会被修改。&
用spaceless标签来删除HTML标签之间的空字符:
&&{%&spaceless&%}&
&&&strong&foo&/strong&&
&&{%&endspaceless&%}
{#&输出结果&&div&&strong&foo&/strong&&/div&&#}&
&&[/jinja]&
  有时候,我们想要、甚至是必须是让Twig忽略那些作为变量或者区块的某些部分。比如,如果你要将{{作为原生字符而不是表示一个变量的起始符,那么就需要一点小技巧。
  最简单的方法就是将变量分隔符&({{)作为变量表达式来输出:
&{{&‘{{‘&}}&
  如果针对更大的段落的话,我们可以使用raw区块。以Twig语法作为例子,如果我们需要将它放入模板的话,我们可以使用下面的代码片段:
&{%&raw&%}&
&&ul&&&{%&for&item&in&seq&%}&
&&li&{{&item&}}&/li&&
&{%&endfor&%}&
&{%&endraw&%}&
&[/jinja]&
Twig最为强大的地方就是它的模板继承机制。模板继承使得我们可以建立一个包含着所有站点需要的通用元素的“框架”模板,同时定义可以被复写的区块(blocks)。&
Base&Template&
  在这个叫做base.html的模板中,我们定义了一个简单两栏布局的HTML框架文档。而“子模板”的工作就是将空白的区块(blocks)(blocks)用需要的内容进行填充。&
  &听起来很复杂,其实是非常的基础。理解它的最简单方法就是从一个实例看一下。
  &&!DOCTYPE&HTML&PUBLIC&"-//W3C//DTD&HTML&4.01//EN"&&
&&html&lang="en"&&
&{%&block&head&%}&
  &&link&rel="stylesheet"&href="style.css"&/&&
  &&title&{%&block&title&%}{%&endblock&%}&&&My&Webpage&/title&&
&{%&endblock&%}&
  &&div&id="content"&{%&block&content&%}{%&endblock&%}&/div&&
&&div&id="footer"&&
&{%&block&footer&%}&
  &&&Copyright&2009&by&&a&href="http://domain.invalid/"&you&/a&.&
&{%&endblock&%}&
  在这个示例中,{%&block&%&}标签定义了四个可以被子模板填充区块。所有的区块标签做的事情就是告诉模板引擎,子模板将会复写模板上的这些部分。&
Child&Template&
  子模板看起来应该是这样子:
  &{%&extends&"base.html"&%}
  {%&block&title&%}Index{%&endblock&%}&
&{%&block&head&%}&
&{{&parent()&}}&
  &&style&type="text/css"&&
  &.important&{&color:񒌻&}&
&&/style&&
&{%&endblock&%}&
&{%&block&content&%}&
&&h1&Index&/h1&&
  &&p&class="important"&&
  &Welcome&on&my&awesome&homepage.&
&&/p&&&{%&endblock&%}&
  在这里,{%&extends&%}标签是关键。他告诉模板引擎当前模板“继承自”另一个模板。当模板系统解析当前模板时,它会第一时间定位到父模板。{%&extends&%}标签应该是模板文件中的第一个标签。
  模板的文件名由模板加载器(template&loader)决定。比如Twig_Loader_Filesystem就可以让你通过给定的文件名来获取其他的模板,通过这种方法你可以获取在子目录中的模板:
  &{%&extends&"layout/default.html"&%}&
  此处”layout/default.html”是相对于模板程序,也就是php文件的相对路径,而不是父模板相对于子模板的相对路径。(原文为But&this&behavior&can&depend&on&the&application&embedding&Twig.无法直译)注意,如果子模板中没有定义footer区块,模板引擎会使用父模板中相应的区块来替代。&
  &在相同的模板中,不能定义多个相同名字的{%&block&%}标签。这个限制是由于区块(block)标签是一个“双向”的解析过程。也就是说,一个区块不仅仅提供一个空白去被填充,也需要填充父模板中的空白。如果一个模板中,有两个相同名称的{%&block&%}标签,父模板就会不知道选择哪一个区块去填充对应的区域。&
  &如果你需要对一个区块进行多次使用,可以使用block方法:
  &&title&{%&block&title&%}{%&endblock&%}&/title&&
  &&h1&{{&block(‘title’)&}}&/h1&&
  &{%&block&body&%}{%&endblock&%}&
  与PHP同样,Twig不支持多重继承。所以在每次的模板渲染中,只能出现一个extends标签。&
Parent&Blocks&
在模板中,可以使用parent方法来调用父模板对应的区块。下面的例子演示了这个过程:
&&{%&block&sidebar&%}&
&&&h3&Table&Of&Contents&/h3&&
&&…&&{{&parent()&}}&
&&{%&endblock&%}&
&&[/twig]&
区块闭合标签&
  Twig中可以在区块闭合标签中加上区块名称,从而增加代码的可读性:
&{%&block&sidebar&%}&
  &{%&block&inner_sidebar&%}&
&…&&{%&endblock&inner_sidebar&%}&
  &{%&endblock&sidebar&%}&
  需要注意的是,在endblock后面跟随的名称必须要匹配区块(block)名称&
Block&Nesting&and&Scope区块嵌套与作用范围&
  在更加复杂的布局中,我们可以使用区块的嵌套来达到我们的要求。每次嵌套中,区块都可以从外部获取到相应的变量。
  &{%&for&item&in&seq&%}&
  &&li&{%&block&loop_item&%}{{&item&}}{%&endblock&%}&/li&&
&{%&endfor&%}&
&[/jinja]&
区块简化语法&
对于含有较少内容的区块而言,可以使用简化语法。下面的结构做的事情完全一致:&
&&[jinja]&
&&{%&block&title&%}&
&&{{&page_title|title&}}&
&&{%&endblock&%}&
&&[/jinja]&
&&{%&block&title&page_title|title&%}&
&&[/jinja]&
Twig可以使用变量作为父模板达到动态继承的效果:
&&{%&extends&some_var&%}&
&&[/jinja]
如果变量值是一个Twig_Template对象的话,Twig将会使用它作为父模板:&
//&{%&extends&layout&%}&&
$layout&=&$twig-&loadTemplate('some_layout_template.twig');&&
$twig-&display('template.twig',&array('layout'&=&&$layout));&&
  事实上,模板名称可以使用任意的表达式。据此,可以实现条件继承:
  &{%&extends&standalone&?&"minimum.html"&:&"base.html"&%}&
  在这个例子中,如果变量standalone值为true的话,模板将会继承自minimum.html;反之,继承自base.html。&
文件导入Import&Context&Behavior&
  默认被包含进来的模板将被加载到当前的模板中去。&
  &Per&default&included&templates&are&passed&the&current&context.&
  &当前模板中的变量,可以在被包含到当前文件中的子模板直接访问。&
  &{%&for&box&in&boxes&%}&
  &{%&include&"render_box.html"&%}&
&{%&endfor&%}&
  render_box.html此时可以直接对box变量进行访问。&
HTML&Escaping&HTML转义&
  当从模板生成HTML时,模板变量中总是有可能会包含着影响最终HTML生成的字符。现在有两种解决方法:手动对每个变量进行转移过滤或者使用默认的自动转移过滤&
  &Twig两种方法都提供,自动转义过滤在Twig中是默认开启的功能。&
  &Twig&supports&both,&automatic&escaping&is&enabled&by&default.&
  &注意:自动转移过滤仅仅在escaper扩展开启的时候才会生效。(escaper扩展默认开启)&
Working&with&Manual&Escaping&
  如果使用手动转义过滤,那么用户就需要负责对所有需要转义的变量进行转义操作。哪些需要转义?如果有一个变量,可能包含如下字符(&,&,&或者”),除非这个变量包含组织好并且值得信任的HTML,否则就需要对此变量进行转义操作。转义操作通过将变量传递给|e过滤器来实现:{{&user.username|e&}}&
  无论自动转义是否启用,都可以在模板中使用autoescape标签来对模板的部分内容进行转义。
  &{%&autoescape&true&%}&
  &Everything&will&be&automatically&escaped&in&this&block&
&{%&endautoescape&%}
  {%&autoescape&false&%}&
  &Everything&will&be&outputed&as&is&in&this&block&
&{%&endautoescape&%}
  {%&autoescape&true&js&%}&
  &Everything&will&be&automatically&escaped&in&this&block&
  &using&the&js&escaping&strategy&
&{%&endautoescape&%}&
  当自动转义被启用时,除了被明确标记为安全的值之外,所有的内容都将被进行转义操作。这些可以在模板中使用|raw过滤器来得以实现。&
  &方法返回的模板数据(比如macros和parent)总是返回安全的标记。&
  &注意:Twig不会对已经使用escape进行过滤的值进行再度转义。&
  &注意:开发者章节会介绍更多关于自动转义的内容。&
流程控制列表&
控制结构指的是所有控制程序执行流程的内容,包括:条件(比如if/elseif/else)、for循环、还包括区块等等。控制结构出现在{%&…&%}块中。&
  循环会输出结构中每一个元素。例如,显示users列表,列表的数据由变量users提供。
&&h1&Members&/h1&&
&&ul&&&{%&for&user&in&users&%}&
  &&li&{{&user.username|e&}}&/li&&
&{%&endfor&%}&
  注意:序列既可以是数组,也可以是继承了Traversable接口的对象&
  &如果需要对一组连续的数字进行迭代,可以使用“..”操作符:&
&{%&for&i&in&0..10&%}&
&*&{{&i&}}&
&{%&endfor&%}&
  上面的代码片段将会打印出从0到10的数字。&
  &同时,该操作符对字母也同样有效:
  &{%&for&letter&in&‘a’..’z’&%}&
&*&{{&letter&}}&
&{%&endfor&%}&
  “..”操作符的两侧可以添加任意的表达式:
  {%&for&letter&in&‘a’|upper..’z'|upper&%}&
&*&{{&letter&}}&
&{%&endfor&%}
  在步进不是1的迭代中,可以使用range函数:
  {%&for&i&in&range(0,&10,&2)&%}&
&*&{{&i&}}&
&{%&endfor&%}
  for循环区块内部,有一些特殊的变量:&
loop.index&
当前迭代的索引(以1为起始索引)&&
loop.index0&
当前迭代的索引(以0为起始索引)&&
loop.revindex&
逆向迭代时,当前的索引(以1为起始索引)&&
loop.revindex0&
逆向迭代时,当前的索引(以0为起始索引)&&
loop.first&
是否是首次迭代。&&
loop.last&
是否为最后一次迭代。&&
loop.length&
序列中元素的数量。&&
loop.parent&
当前循环的父元素。The&parent&context&&
  注意:loop.length,&loop.revindex,&loop.revindex0,&and&loop.last这些变量只能在PHP数组中,或者是实现了Countable接口的对象中才能使用。&
  &注意:与PHP不同,在Twig的循环中,不可以使用break或者continue函数。&
  &如果由于序列为空导致没有迭代的过程,可以使用else去显示一个不同的块。
&&ul&&&{%&for&user&in&users&%}&
  &&li&{{&user.username|e&}}&/li&&
&{%&else&%}&
  &&li&&em&no&user&found&/em&&/li&&
&{%&endfor&%}&
  默认情况下,循环迭代器针对序列的值进行循环。也可以使用keys过滤器从而对迭代器的键值进行循环。
&&h1&Members&/h1&&
&&ul&&&{%&for&key&in&users|keys&%}&
&&li&{{&key&}}&/li&&
&{%&endfor&%}&
  也可以同时使用键值和值:
&&h1&Members&/h1&&
&&ul&&&{%&for&key,&user&in&users&%}&
  &&li&{{&key&}}:&{{&user.username|e&}}&/li&&
&{%&endfor&%}&
  if语句在Twig中与PHP中很接近。最简单的用法就是可以使用if来判断某个值是否为空:
&{%&if&users&%}&
&&ul&&&{%&for&user&in&users&%}&
  &&li&{{&user.username|e&}}&/li&&
&{%&endfor&%}&
&{%&endif&%}&
  注意:如果要判断变量是否存在,可以使用if&user&is&defined。
  多分支条件判断可以像PHP中一样使用elseif和else,同时可以使用更多更加复杂的表达式:
&{%&if&kenny.sick&%}&
&Kenny&is&sick.&
  &{%&elseif&kenny.dead&%}&
  &You&killed&Kenny!&You&bastard!!!&
&{%&else&%}&
  &Kenny&looks&okay&—&so&far&
&{%&endif&%}&
宏指令Macros&
  宏指令的作用类似于普通编程语言的方法(functions)。在重复使用常用的HTML代码片段时,宏指令非常有用。
  下面是一个用宏指令来显示表单元素的例子:
  &{%&macro&input(name,&value,&type,&size)&%}&
  &&input&type="{{&type|default(‘text’)&}}"&name="{{&name&}}"&value="{{&value|e&}}"&size="{{&size|default(20)&}}"&/&&
&{%&endmacro&%}&
  宏指令与原生的PHP函数在下面部分有区别:&
默认参数值是通过宏指令中default过滤器来定义&
宏指令中的参数都是可选的&
  与PHP函数相同,宏指令不能得到当前模板变量。&
  &提示:可以使用_context变量将context作为宏指令的参数传递。&
  &You&can&pass&the&whole&context&as&an&argument&by&using&the&special&_context&variable.
  宏指令可以在任意的模板中定义,在使用之前需要“导入(import)”到当前的模板文件。(详细信息可以查看“导入”章节):
  &{%&import&"forms.html"&as&forms&%}&
  上面import导入了“forms.html”文件(该文件可以仅仅包含宏指令,或者包含模板和宏指令),同时将方法(此处应该指的是宏指令Macros吧)作为form变量的内容导入。&
  &The&above&import&call&imports&the&“forms.html”&file&(which&can&contain&only&macros,&or&a&template&and&some&macros),&and&import&the&functions&as&items&of&the&forms&variable.
  然后宏指令就可以根据需要进行调用:
  &&p&{{&forms.input(‘username’)&}}&/p&&
  &&p&{{&forms.input(‘password’,&none,&‘password’)&}}&/p&&
  如果宏指令的定义和使用在同一个模板中,此时可以使用_self变量来进行调用,而不需要进行import操作:
  &&p&{{&_self.input(‘username’)&}}&/p&&
  如果在同一个文件中,需要在一个宏指令中调用另一个宏指令,此时也可以使用_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)&}}&
&{%&endmacro&%}&
  当宏指令是在另一个文件中定义的时候,此时需要对其进行导入:
&{#&forms.html&#}
  {%&macro&input(name,&value,&type,&size)&%}&
  &&input&type="{{&type|default(‘text’)&}}"&name="{{&name&}}"&value="{{&value|e&}}"&size="{{&size|default(20)&}}"&/&&
&{%&endmacro&%}
{#&shortcuts.html&#}
  {%&macro&wrapped_input(name,&value,&type,&size)&%}&
  &{%&import&"forms.html"&as&forms&%}&
&&div&class="field"&&
  &{{&forms.input(name,&value,&type,&size)&}}&
&{%&endmacro&%}&
过滤器Filters&
  在本节中,将会介绍如何在代码数据区块中使用Twig过滤器。调用方法就是用特定的过滤器标签将代码包裹起来:
&{%&filter&upper&%}&
  &This&text&becomes&uppercase&
&{%&endfilter&%}&
  也可以使用链式过滤器:
  &{%&filter&lower|escape&%}&
  &&strong&SOME&TEXT&/strong&&
&{%&endfilter&%}&
  &{%&#&将会返回&strong&some&text&/strong&&#&%}&
赋值Assignments&
  在代码区块中同样可以对变量进行赋值。赋值需要使用set标签。在赋值过程中,可以有多个赋值对象。
  &{%&set&foo&=&‘foo’&%}
  {%&set&foo&=&[1,&2]&%}
  {%&set&foo&=&{‘foo’:&‘bar’}&%}
  {%&set&foo&=&‘foo’&~&‘bar’&%}
  {%&set&foo,&bar&=&‘foo’,&‘bar’&%}&
  使用set标签赋值,可以对大段HTML代码进行赋值:
&{%&set&foo&%}&
  &&div&id="pagination"&&
&…&&&/div&&
&{%&endset&%}&
extends标签用来从其他模板中继承模板内容。虽然可以在一个模板文件中多次使用继承,但是只有一个会被执行。Twig不支持多重继承。可以从上面提到的“模板继承”章节获取更加详细的信息。&
区块Block&
Block在继承中被使用,Block的意义是作为一个占位符,同时在显示的时候被替换成相应的内容。具体细节可以参照上文的“模板继承”部分。&
包含Include&
如果需要在当前的命名空间中将其他模板包含到当前模板中的时候,include语句就显得非常有用了:&
  &{%&include&‘header.html’&%}&
&Body&&{%&include&‘footer.html’&%}&
  被包含进来的模板,可以对当前模板所有的变量进行访问。
  通过with关键字,我们可以增加额外的模板变量。
  &{#&the&foo&template&will&have&access&to&the&variables&from&the&current&context&and&the&foo&one&#}&
  &{%&include&‘foo’&with&{‘foo’:&‘bar’}&%}
  {%&set&vars&=&{‘foo’:&‘bar’}&%}&
  &{%&include&‘foo’&with&vars&%}&
  可以使用only关键词取消对当前模板变量的访问权限。
  &{#&只能访问foo模板变量&#}&
  &{%&include&‘foo’&with&{‘foo’:&‘bar’}&only&%}&
  &{#&任何模板变量都不能被访问&#}&
  &{%&include&‘foo’&only&%}&
  注意:当包含一个由最终用户产生的模板文件时,应当考虑将其放到沙箱中处理。更多信息请参照“Twig&for&Developers”章节。
  模板名称可以是任意有效的Twig表达式。
  &{%&include&some_var&%}&
  &{%&include&ajax&?&‘ajax.html’&:&‘not_ajax.html’&%}&
  如果表达式是Twig_Template对象,Twig将会直接使用它:&
//&{%&include&template&%}&&
$template&=&$twig-&loadTemplate('some_template.twig');&&
$twig-&loadTemplate('template.twig')-&display(array('template'&=&&$template));&&
  Twig支持将常用的代码放入宏指令中。这些宏指令可以被导入到不同的模板中以供使用。
  导入模板有两种方法。可以将完整的模板(这里应该指的是宏指令吧?)导入到变量中,或者仅仅是从模板文件中请求一个特定的宏指令。
  假设有一个可以生成表单的helper模块(名字是forms.html):
  &{%&macro&input(name,&value,&type,&size)&%}&
  &&input&type="{{&type|default(‘text’)&}}"&name="{{&name&}}"&value="{{&value|e&}}"&size="{{&size|default(20)&}}"&/&&
&{%&endmacro&%}
  {%&macro&textarea(name,&value,&rows)&%}&
  &&textarea&name="{{&name&}}"&rows="{{&rows|default(10)&}}"&cols="{{&cols|default(40)&}}"&{{&value|e&}}&/textarea&&
&{%&endmacro&%}&
  最简单、最灵活的做法就是将整个模块导入到一个变量中。如此一来,可以通过属性的方式来对其进行访问:
  &{%&import&‘forms.html’&as&forms&%}
&dl&&&&dt&Username&/dt&&
  &&dd&{{&forms.input(‘username’)&}}&/dd&&
&&dt&Password&/dt&&
  &&dd&{{&forms.input(‘password’,&none,&‘password’)&}}&/dd&&
  &&p&{{&forms.textarea(‘comment’)&}}&/p&&
  或者也可以从模板文件中导入到当前命名空间中:
  &{%&from&‘forms.html’&import&input&as&input_field,&textarea&%}
&dl&&&&dt&Username&/dt&&
  &&dd&{{&input_field(‘username’)&}}&/dd&&
&&dt&Password&/dt&&
  &&dd&{{&input_field(‘password’,&type=’password’)&}}&/dd&&
  &&p&{{&textarea(‘comment’)&}}&/p&&
  当宏指令和模板文件定义在同一个文件中时,没有必要进行导入操作。此时可以使用_self变量:
  &{#&index.html&template&#}
  {%&macro&textarea(name,&value,&rows)&%}&
  &&textarea&name="{{&name&}}"&rows="{{&rows|default(10)&}}"&cols="{{&cols|default(40)&}}"&{{&value|e&}}&/textarea&&
&{%&endmacro&%}
  &p&{{&_self.textarea(‘comment’)&}}&/p&&
  你也可以通过导入操作给_self变量设置一个别名:
  &{#&index.html&template&#}
  {%&macro&textarea(name,&value,&rows)&%}&
  &&textarea&name="{{&name&}}"&rows="{{&rows|default(10)&}}"&cols="{{&cols|default(40)&}}"&{{&value|e&}}&/textarea&&
&{%&endmacro&%}
  {%&import&_self&as&forms&%}
  &p&{{&forms.textarea(‘comment’)&}}&/p&&
表达式Expressions&
  在Twig模板中,你可以任意的使用表达式,这些表达式的工作方式与常规的PHP方式非常接近。即使你不曾使用PHP工作,你也会觉得Twig使用起来很舒服。&
  &操作符的优先级按照下面顺序由高到低:or,&and,&==,&!=,&&,&&,&&=,&&=,&in,&+,&-,&~,&*,&/,&%,&//,&is,&..,&和&**。&
最简单的表达式形式就是常量。常量表现为字符串、数字、数组等PHP变量类型。看一下下面的几种常量:&
“Hello&World”:&在两个双引号或者单引号之间的值就是字符串。当你需要在模板中使用字符串的时候(例如调用函数时需要的参数、过滤器、继承或者包含模板文件时),它将会非常有用。&
42&/&42.23:&直接写出来的数字就是整型或者浮点型。如果数字中有小数点,它就是浮点型;反之就是整型。&
["foo","bar"]:&数组使用中括号([])括起来,数组中各个值之间使用逗号(,)进行分割。&
{“foo”:&“bar”}:&哈希表使用大括号({})括起来,值之间使用逗号(,)进行分割。哈希表的值可以是任意可用的表达式。&
true&/&false&:true表示布尔值的“真”,false表示布尔值的“假”。&
none:&none表示空值(与PHP中的null等同)。当一个变量不存在的时候将会返回该值。&
数组和哈希表可以进行嵌套:
&&{%&set&foo&=&[1,&{"foo":&"bar"}]&%}&
&&[/twig]&
在Twig中可以对变量的值进行计算。虽然这变量的值计算很少会被使用到,但是也有其存在的意义。在Twig中提供了一下操作符:&
+:&将两个对象进行相加计算(操作对象将被转化成数字类型){{&1&+&1&}}结果是2。&
-:&将第二数字从第一个数字上面减掉。{{&3-2&}}结果为1。&
/:&将两个数进行相除。返回值是一个浮点型数字。{{&1&/&2}}结果是0.5。&
%:&对两个值相除的结果取余数。{{&11&%&7&}}结果是4。&
//:&对两个数进行除法操作,取结果的整数部分。{{&20&//&7&}}结果是2。&
*:&将左侧对象与右侧对象进行乘法操作。{{&2&*&2&}}的结果返回4。&
**:&对第一个操作数取第二个操作数的指数。{{&2&**&3&}}的结果是8。&
逻辑操作符Logic&
在if声明、for过滤器或者if表达式中,可以使用逻辑操作符对多个表达式进行组合:&
and:&如果操作符两侧的操作对象都为真,返回布尔值“真”。&
or:&操作符两侧只要有一个操作对象为真,则返回布尔值“真”。&
not:&否定声明语句。
(expr):&对表达式分组操作。&
比较操作符Comparisons&
在任何表达式中都可以使用下列比较操作符:==,&!=,&&,&&,&&=,&and&&=。&
包含操作符Containment&Operator&
  in操作符进行包含测试。&
  &如果左侧的操作对象包含在右侧的操作对象中,则返回布尔值“真”:
  &{#&返回布尔值“真”&#}
{{&1&in&[1,&2,&3]&}}
  {{&‘cd’&in&‘abcde’&}}&
  &注意:在字符串、数组或者实现了Traversable接口的对象中可以用当前过滤器进行包含测试。
  可以使用not&in操作符进行否定包含测试:&
  &{%&if&1&not&in&[1,&2,&3]&%}
  {#&下面的表达式与上面的等同&#}&
  &{%&if&not&(1&in&[1,&2,&3])&%}&
  is操作符进行测试操作。测试可以对一个变量和通用表达式进行测试。右侧的操作符为测试表达式:&
  &{#&测试变量是否为奇数&#}
{{&name&is&odd&}}&
  测试表达式也可以带参数:&
  &{%&if&loop.index&is&divisibleby(3)&%}&
  not&is将测试结果取反:&
  &{%&if&loop.index&is&not&divisibleby(3)&%}
  {#&下面的表达式与上面的等同&#}&
  &{%&if&not&(loop.index&is&divisibleby(3))&%}&
Other&Operators&
下面的操作符很有用,但是不适合嵌套入其他两类(这句话不明白意思):&
&&The&following&operators&are&very&useful&but&don’t&fit&into&any&of&the&other&two&categories:&
..:&根据操作符前后的操作对象生成序列。(具体可以参照看for标签章节)&
|:&使用过滤器。
~:&将素有操作对象转化成字符串并将其连接起来。{{&“Hello&”&~&name&~&“!”&}}&将会返回&(将name变量赋值为’John’)&Hello&John!.&
.或者[]:&获取对象的属性。&
?:&:类似于PHP的三元操作符&
  &{{&foo&?&‘yes’&:&‘no’&}}
  &h2&内建过滤器列表List&of&built-in&Filters&/h2&&
  &&tt&&span&date&/span&&/tt&&
  &date过滤器可以将日期格式化成给定的格式:&
  &{{&post.published_at|date("m/d/Y")&}}&
  date过滤器可以接受任意被支持的格式和DateTime实例。例如,可以通过对now进行过滤从而获得当前日期。
  &{{&"now"|date("m/d/Y")&}}&
  &format通过替换占位符的方式来格式化给定的字符串(占位符与printf语句中占位符保持一致):&
  &{{&"I&like&%s&and&%s."|format(foo,&"bar")&}}
  {#&返回&I&like&foo&and&bar.&(当前模板变量foo被赋值为"foo"字符串)&#}&
  &replace与foramt基本类似,不同点在于replace替换的占位符可以为任意格式:
  &{{&"I&like&%this%&and&%that%."|replace({‘%this%’:&foo,&‘%that%’:&"bar"})&}}
  {#&返回&I&like&foo&and&bar.&(当前模板变量foo被赋值为“foo”字符串)&#}&
url_encode&
  &url_encode过滤器对给定的字符串进行URL编码。&
  &The&url_encode&filter&URL&encodes&a&given&string.
json_encode&
  &json_encode过滤器将字符串格式化为JSON格式。&
  &The&json_encode&filter&returns&the&JSON&representation&of&a&string.
  &title过滤器将给定值格式化适合标题的格式。也就是说,单词的首字母被转变成大写,其余的字符为小写。
capitalize&
  &capitalize过滤将给定值首字母大写。只有首字母变成大写,其余的为小写。
  &uppper过滤器将给定值所有字符都转变成大写。
  &lower过滤器将给定值所有字符都转变成小写。
striptags&
  &striptags过滤器将会移除SGML/XML标签,并且将连续的空格替换为一个空格。
join&&join过滤器将序列中所有字符串(数字会不会自动被转化成字符串?待测试)连接后并返回。元素之间默认的分隔符为空字符,可以通过可选参数进行定义:
  &{{&[1,&2,&3]|join('|')&}}&
&{#&返回&1|2|3&#}
{{&[1,&2,&3]|join&}}&
&{#&返回&123&#}&
  &reverse过滤器将数组或者实现了Iterator接口的对象进行反转操作。
  &length过滤器返回序列或者mapping(这个是什么数据结构?)的元素个数,或者字符串的长度。
sort&&sort过滤器对数组进行排序。
  &如果变量没有定义或者为空时,使用default过滤器则会返回通过default过滤器传递的值;反之返回变量的值:&
  &{{&var|default('var&is&not&defined')&}}
  {{&var.foo|default('foo&item&on&var&is&not&defined')&}}
  {{&''|default('passed&var&is&empty')&}}&
  注意:阅读下面关于defined和empty测试的文档去了解它们的语义。
keys&&keys过滤器返回数组的键值。当需要对数组的键值进行循环时,可以使用keys过滤:
  &{%&for&key&in&array|keys&%}&
&...&&{%&endfor&%}&
escape,&e&
  &escape过滤器将&、&、&、'和"字符转译成HTML的安全字符。如果你在HTML中可能出现上述字符的话,请使用escape过滤器来对其进行过滤。
  注意:从程序角度来说,escape过滤器使用了PHP中的htmlspecialchars函数。
raw&&raw过滤器将当前值标记为安全的值。这意味着,如果对于一个变量来说,只要raw过滤器是它最后一个过滤器,那么即使在配置为自动转义的环境中,该值都不会被转义
&{%&autoescape&true&}&
  &{{&var|raw&}}&{#&var&不会被转义&#}&
&{%&endautoescape&%}&
  &merge过滤器将变量的值与相关的数组或者哈希表进行合并操作。[jinja]&
  &{%&set&items&=&{&'apple':&'fruit',&'orange':&'fruit'&}&%}
  {%&set&items&=&items|merge({&'peugeot':&'car'&})&%}
  {#&items&现在包含了&{&'apple':&'fruit',&'orange':&'fruit',&'peugeot':&'car'&}&#}&
&[/jinja]&
内置测试列表List&of&built-in&Tests&
divisibleby&
  &divisibleby检测变量是否可以被某个数整除:[jinja]&
  &{%&if&loop.index&is&divisibleby(3)&%}&
none&&如果当前变量为none(未赋值或者空值?)值的时候,返回布尔值“真”:
&{{&var&is&none&}}&
even&&如果给定值为偶数,则返回布尔值“真”:&
&{{&var&is&even&}}&
odd&&如果给定的值为奇数,则返回布尔值“真”:&
&{{&var&is&odd&}}&
  &sameas判断变量值是否与另一个变量有着相同的内存地址(此处有些疑惑,内存地址?还是变量类型?):&
  &sameas&checks&if&a&variable&points&to&the&same&memory&address&than&another&variable:
  &{%&if&foo.attribute&is&sameas(false)&%}&
  &{#&the&foo变量的attribute属性就是PHP中的false值&#}&
&{%&endif&%}&
  &constant判断变量是否与某个常量完全相等(===??)。此处的常量,既可以是全局常量也可以是类定义中的常量:
  &{%&if&post.status&is&constant('Post::PUBLISHED')&%}&
  &{#&status属性与Post::PUBLISHED完全相等&#}&
&{%&endif&%}&
&[/jinja]&
&&defined判断一个变量是否在当前的环境中被定义过了。当使用strict_variables选项时,该测试十分有用&
&&{#&defined&works&with&variable&names&#}&
&&{%&if&foo&is&defined&%}&
&&...&&{%&endif&%}&
{#&and&attributes&on&variables&names&#}&
&&{%&if&foo.bar&is&defined&%}&
&&...&&{%&endif&%}&
&&[/jinja]&
&&empty判断变量是否为空:[twig]&
&&{#&当foo变量的值为&null,&false,&或者空字符串时,返回true&#}&
&&{%&if&foo&is&empty&%}&
&&...&&{%&endif&%}&
&&[/twig]&
全局方法列表List&of&Global&Functions&
  下面的方法,默认在全局都可以使用:
  &返回包含整数的等差数列的列表。当设定了步进(step)时,步进则指定了等差数列的差值:&
  &{%&for&i&in&range(0,&3)&%}&
&{{&i&}},&
&{%&endfor&%}
  {#&返回&0,&1,&2,&3&#}
  {%&for&i&in&range(0,&6,&2)&%}&
&{{&i&}},&
&{%&endfor&%}
  {#&返回&0,&2,&4,&6&#}&
  注意:range函数使用PHP原生的range函数。
  ..操作符是range函数(步进为1)的语法糖:&
&{%&for&i&in&0..10&%}&
&{{&i&}},&
&{%&endfor&%}&
  &cycle函数用来对数组的值进行循环:&
&{%&for&i&in&0..10&%}&
  &{{&cycle(['odd',&'even'],&i)&}}&
&{%&endfor&%}&
&[/twig]  数组可以包含任意数量的值:
  &{%&set&fruits&=&['apple',&'orange',&'citrus']&%}
{%&for&i&in&0..10&%}&
  &{{&cycle(fruits,&i)&}}&
&{%&endfor&%}&
  &constant返回指定字符串所代表的常量值:&
  &{{&some_date|date(constant('DATE_W3C'))&}}&
扩展Extensions&
可以轻松的对Twig进行扩展。如果需要新的标签或者过滤器,去看看Twig的.&
Filed&under:&,,,&—&腾风现踪&@&00:26
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 ajax循环请求数据 的文章

 

随机推荐