亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

在Yii框架中使用PHP模板引擎Twig的例子

2020-03-22 19:32:58
字體:
來源:轉載
供稿:網友
Twig是一款快速、安全、靈活的PHP模板引擎,它內置了許多filter和tags,并且支持模板繼承,能讓你用最簡潔的代碼來描述你的模板。他的語法和Python下的模板引擎Jinjia以及Django的模板語法都非常像。 比如我們在PHP中需要輸出變量并且將其進行轉義時,語法比較累贅:
復制代碼 代碼如下:
?php echo $var ?
?php echo htmlspecialchars($var, ENT_QUOTES, 'UTF-8') ?
但是在Twig中可以這樣寫:
復制代碼 代碼如下:
{{ var }}
{{ var|escape }}
{{ var|e }} {# shortcut to escape a variable #}
遍歷數組:
復制代碼 代碼如下:
{% for user in users %}
* {{ user.name }}
{% else %}
No user has been found.
{% endfor %} 但是要在Yii Framework集成Twig就會遇到點麻煩了,官方網站中已經有能夠集成Twig的方案,所以這里我也不再贅述。但是由于Twig中是不支持PHP語法的,所以在有些表達上會遇到困難,比如我們在寫Form的視圖時,經常會這么寫:
復制代碼 代碼如下:
?php $form=$this- beginWidget('CActiveForm'); ?
span Login /span
ul
li
?php echo $form- label($model,'username'); ?
?php echo $form- textField($model,'username'); ? /li li
?php echo $form- label($model,'password'); ?
?php echo $form- passwordField($model,'password'); ? /li li
button type="submit" Login /button /li /ul
?php echo $form- error($model,'password'); ?
?php $this- endWidget(); ?
但是這樣的語法是沒法在twig中表達的,所以想去擴展下Twig的功能,讓他能夠支持我們自定義的widget標簽,然后自動解析成我們需要的代碼。 總共需要兩個類:TokenParser和Node,下面直接上代碼:
復制代碼 代碼如下:
?php
/*
* This file is an extension of Twig.
*
* (c) 2010 lfyzjck
*/ /**
* parser widget tag in Yii framework
*
* {% beginwidget 'CActiveForm' as form %}
* content of form
* {% endwidget %}
*
*/
class Yii_WidgetBlock_TokenParser extends Twig_TokenParser
{
/**
* Parses a token and returns a node.
*
* @param Twig_Token $token A Twig_Token instance
*
* @return Twig_NodeInterface A Twig_NodeInterface instance
*/
public function parse(Twig_Token $token)
{
$lineno = $token- getLine();
$stream = $this- parser- getStream(); $name = $stream- expect(Twig_Token::STRING_TYPE);
if($stream- test(Twig_Token::PUNCTUATION_TYPE)){
$args = $this- parser- getExpressionParser()- parseHashExpression();
}
else{
$args = new Twig_Node_Expression_Array(array(), $lineno);
} $stream- expect(Twig_Token::NAME_TYPE);
$assign = $stream- expect(Twig_Token::NAME_TYPE);
$stream- expect(Twig_Token::BLOCK_END_TYPE); $body = $this- parser- subparse(array($this, 'decideBlockEnd'), true);
$stream- expect(Twig_Token::BLOCK_END_TYPE); return new Yii_Node_WidgetBlock(array(
'alias' = $name- getValue(),
'assign' = $assign,
), $body, $args, $lineno, $this- getTag());
} /**
* Gets the tag name associated with this token parser.
*
* @param string The tag name
*/
public function getTag()
{
return 'beginwidget';
} public function decideBlockEnd(Twig_Token $token)
{
return $token- test('endwidget');
}
} class Yii_Node_WidgetBlock extends Twig_Node
{
public function __construct($attrs, Twig_NodeInterface $body, Twig_Node_Expression_Array $args = NULL, $lineno, $tag)
{
$attrs = array_merge(array('value' = false),$attrs);
$nodes = array('args' = $args, 'body' = $body);
parent::__construct($nodes, $attrs, $lineno,$tag);
} public function compile(Twig_Compiler $compiler)
{
$compiler- addDebugInfo($this);
$compiler- write('$context["'.$this- getAttribute('assign')- getValue().'"] = $context["this"]- beginWidget("'.$this- getAttribute('alias').'",');
$argNode = $this- getNode('args');
$compiler- subcompile($argNode)
- raw(');')
- raw(" "); $compiler- indent()- subcompile($this- getNode('body')); $compiler- raw('$context["this"]- endWidget();');
}
}
?
然后在Twig初始化的地方增加我們的語法解析類:
復制代碼 代碼如下:
$twig- addTokenParser(new Yii_WidgetBlock_TokenParser);
然后我們就可以在twig的模板里這么寫了:
復制代碼 代碼如下:
{% beginwidget 'CActiveForm' as form %}
ul
li
{{ form.label(model, 'username') }}
{{ form.textField(model, 'username') }}
/li
li
{{ form.label(model, 'password') }}
{{ form.passwordField(model, 'password') }}
/li
/ul
{% endwidget %}PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美日韩亚洲一区二区| 亚洲人成绝费网站色www| 国产精品国产三级国产aⅴ9色| 国产精品久久久久久av福利| 精品欧美aⅴ在线网站| 久久成人免费视频| 国产亚洲精品va在线观看| 国产成人一区二区| 日韩电影在线观看免费| 影音先锋欧美精品| 日本高清久久天堂| 国产精品电影观看| 亚洲福利视频网站| 最近2019免费中文字幕视频三| 米奇精品一区二区三区在线观看| 97在线观看视频| 久久综合伊人77777| 亚洲第一页在线| 日本精品一区二区三区在线播放视频| 久久99精品久久久久久琪琪| 欧美国产极速在线| 成人写真福利网| 国产欧美亚洲视频| 国产中文字幕91| 日韩视频免费大全中文字幕| 日韩中文字幕欧美| 久久久精品久久久久| 日韩精品免费在线视频| 成人性教育视频在线观看| 1769国内精品视频在线播放| 亚洲一区www| 欧美国产精品va在线观看| 欧日韩不卡在线视频| 国产成人97精品免费看片| 国产激情视频一区| 欧美视频在线看| 亚洲色图15p| 亚洲一区二区精品| 91久久精品久久国产性色也91| 午夜精品免费视频| 97婷婷涩涩精品一区| 在线色欧美三级视频| 久久九九有精品国产23| 亚洲国产天堂久久综合网| 国产精品极品在线| 欧美性感美女h网站在线观看免费| 亚洲区一区二区| 日韩av手机在线| 91av视频在线免费观看| 欧美性20hd另类| 欧美精品videos另类日本| 亚洲欧美日韩天堂一区二区| 国产成人久久久| 精品久久久av| 日韩电视剧在线观看免费网站| 欧美性做爰毛片| 国产视频在线观看一区二区| 国产欧美日韩中文字幕| 97久久久久久| 色与欲影视天天看综合网| 黑人精品xxx一区一二区| 日韩av综合网站| 美乳少妇欧美精品| 国产精品高潮呻吟视频| 国产日产久久高清欧美一区| 日韩av免费在线观看| 91在线免费观看网站| 精品国产乱码久久久久酒店| 欧美多人爱爱视频网站| 欧洲日韩成人av| 欧美性猛交xxxx| 欧美黄色www| 国产成人在线精品| 91啪国产在线| 韩国精品美女www爽爽爽视频| 黄色一区二区三区| 欧美一区二区三区艳史| 国产日产欧美精品| 日韩a**站在线观看| 国产中文字幕日韩| 亚洲精品aⅴ中文字幕乱码| 91久久久久久| 国产97在线视频| 欧美华人在线视频| 国产精品亚洲综合天堂夜夜| 国产精品久久久久av免费| 日韩视频中文字幕| 午夜精品免费视频| 欧美在线观看视频| 欧美电影第一页| 国产日韩欧美电影在线观看| 亚洲一区二区三区视频| 欧美亚洲另类在线| 亚洲无限乱码一二三四麻| 久久av中文字幕| 成人久久一区二区| 国内精品久久久久伊人av| 国产精品丝袜白浆摸在线| 欧美大奶子在线| 国产97人人超碰caoprom| 高清欧美一区二区三区| 亚洲激情在线观看视频免费| 国产成人精品a视频一区www| 亚洲一区二区黄| 91免费欧美精品| 国产精品午夜一区二区欲梦| 日韩中文综合网| 九九热视频这里只有精品| 久久久久国产一区二区三区| 日本久久久久久| 亚洲欧美国产日韩中文字幕| 亚洲天堂网在线观看| 亚洲情综合五月天| 日韩高清av在线| 51久久精品夜色国产麻豆| 欧美激情欧美激情| 欧美日韩国产成人在线观看| 国产精品一久久香蕉国产线看观看| 成人动漫网站在线观看| 成人国产亚洲精品a区天堂华泰| 国产精品久久久久久av福利软件| 亚洲人成伊人成综合网久久久| 97成人精品视频在线观看| 欧美性受xxxx白人性爽| 亚洲人高潮女人毛茸茸| 精品久久久免费| 久久久久久久久久久久久久久久久久av| 91免费国产网站| 国产精品xxxxx| 国产精品久久婷婷六月丁香| 日韩欧美在线国产| 国产成人精品在线观看| 欧美成人合集magnet| 久久久免费精品| 欧美一区在线直播| 成人网在线免费看| 欧美精品videosex性欧美| 亚洲第一男人天堂| 欧美成人免费播放| 国产91精品视频在线观看| 久久精品成人欧美大片| 欧美一级淫片丝袜脚交| 91精品国产高清久久久久久| 欧美色视频日本版| 成人黄色激情网| 久久久久久有精品国产| 狠狠色狠狠色综合日日五| 一本一道久久a久久精品逆3p| 91系列在线观看| 亚洲综合在线中文字幕| 日韩中文字幕视频| 国模精品视频一区二区| 国产视频丨精品|在线观看| 国产精品永久免费观看| 久久久久久这里只有精品| 26uuu国产精品视频| 国产丝袜视频一区| 第一福利永久视频精品| 成人伊人精品色xxxx视频| 在线国产精品播放| 国产精品成av人在线视午夜片| 久久久亚洲影院你懂的| 国产xxx69麻豆国语对白| 久久频这里精品99香蕉|