国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > 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教程

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 盖州市| 沁源县| 泸水县| 定兴县| 赫章县| 太湖县| 太仆寺旗| 巴楚县| 建瓯市| 宜良县| 怀安县| 上蔡县| 将乐县| 易门县| 额济纳旗| 南安市| 木兰县| 读书| 太保市| 芦山县| 额尔古纳市| 汨罗市| 阿勒泰市| 临城县| 溧水县| 德江县| 巴林右旗| 湘阴县| 南丰县| 栖霞市| 华安县| 通榆县| 黑龙江省| 曲周县| 桂林市| 黑山县| 白朗县| 民勤县| 垣曲县| 平利县| 长阳|