在Yii框架中使用PHP模板引擎Twig的例子
Twig是一款快速、安全、靈活的PHP模板引擎,它內(nèi)置了許多filter和tags,并且支持模板繼承,能讓你用最簡(jiǎn)潔的代碼來(lái)描述你的模板。他的語(yǔ)法和Python下的模板引擎Jinjia以及Django的模板語(yǔ)法都非常像。 比如我們?cè)赑HP中需要輸出變量并且將其進(jìn)行轉(zhuǎn)義時(shí),語(yǔ)法比較累贅:
<?php echo $var ?>
<?php echo htmlspecialchars(\$var, ENT_QUOTES, 'UTF-8') ?>
但是在Twig中可以這樣寫:
{{ var }}
{{ var|escape }}
{{ var|e }} {# shortcut to escape a variable #}
遍歷數(shù)組:
{% for user in users %}
* {{ user.name }}
{% else %}
No user has been found.
{% endfor %}
但是要在Yii Framework集成Twig就會(huì)遇到點(diǎn)麻煩了,官方網(wǎng)站中已經(jīng)有能夠集成Twig的方案,所以這里我也不再贅述。但是由于Twig中是不支持PHP語(yǔ)法的,所以在有些表達(dá)上會(huì)遇到困難,比如我們?cè)趯慒orm的視圖時(shí),經(jīng)常會(huì)這么寫:
<?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 class="last">
<button type="submit">Login</button>
</li>
</ul>
<?php echo $form->error($model,'password'); ?>
<?php $this->endWidget(); ?>
但是這樣的語(yǔ)法是沒(méi)法在twig中表達(dá)的,所以想去擴(kuò)展下Twig的功能,讓他能夠支持我們自定義的widget標(biāo)簽,然后自動(dòng)解析成我們需要的代碼。 總共需要兩個(gè)類: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("\n");
$compiler->indent()->subcompile($this->getNode('body'));
$compiler->raw('$context["this"]->endWidget();');
}
}
?>
然后在Twig初始化的地方增加我們的語(yǔ)法解析類:
$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 %}
- Yii2設(shè)置默認(rèn)控制器的兩種方法
- Yii2創(chuàng)建控制器(createController)方法詳解
- yii2控制器Controller Ajax操作示例
- Yii2使用$this->context獲取當(dāng)前的Module、Controller(控制器)、Action等
- Yii2框架控制器、路由、Url生成操作示例
- Yii控制器中filter過(guò)濾器用法分析
- yii2 在控制器中驗(yàn)證請(qǐng)求參數(shù)的使用方法
- Yii 框架控制器創(chuàng)建使用及控制器響應(yīng)操作示例
- PHP 基于Yii框架中使用smarty模板的方法詳解
- yii框架創(chuàng)建與設(shè)置默認(rèn)控制器并載入模板操作示例
相關(guān)文章
CodeIgniter擴(kuò)展核心類實(shí)例詳解
這篇文章主要介紹了CodeIgniter擴(kuò)展核心類,結(jié)合實(shí)例形式分析了CodeIgniter針對(duì)核心類的擴(kuò)展方法與擴(kuò)展CI類庫(kù)與輔助函數(shù)的實(shí)現(xiàn)技巧,需要的朋友可以參考下2016-01-01php計(jì)算當(dāng)前程序執(zhí)行時(shí)間示例
這篇文章主要介紹了php計(jì)算當(dāng)前程序執(zhí)行時(shí)間示例,需要的朋友可以參考下2014-04-04PHP中使用memcache存儲(chǔ)session的三種配置方法
下面簡(jiǎn)單說(shuō)下PHP項(xiàng)目分布式部署中,SESSION的同步方案中的一種,使用Memcache來(lái)存儲(chǔ)SESSION。并總結(jié)了三種配置方式,需要的朋友可以參考下2014-04-04微信公眾號(hào)之主動(dòng)給用戶發(fā)送消息功能
這篇文章主要介紹了微信公眾號(hào)之主動(dòng)給用戶發(fā)送消息,需要的朋友可以參考下2019-06-06支持中文和其他編碼的php截取字符串函數(shù)分享(截取中文字符串)
這篇文章主要介紹了支持中文和其他編碼的php截取字符串函數(shù)示例(截取中文字符串),需要的朋友可以參考下2014-03-03Win7環(huán)境下Apache連接MySQL提示連接已重置的解決辦法
這篇文章主要為大家詳細(xì)介紹了Win7環(huán)境下Apache連接MySQL提示“連接已重置”的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05PHP代碼判斷設(shè)備是手機(jī)還是平板電腦(兩種方法)
隨著互聯(lián)網(wǎng)移動(dòng)設(shè)備的普及,很多網(wǎng)站都兼容手機(jī)端瀏覽,為了更好的讓網(wǎng)頁(yè)在手機(jī)端顯示,我們都選擇了使用CSS媒體查詢制作響應(yīng)式模版。本文給大家介紹PHP代碼判斷設(shè)備是手機(jī)還是平板電腦(兩種方法),感興趣的朋友一起學(xué)習(xí)吧2015-10-10php 使用mpdf實(shí)現(xiàn)指定字段配置字體樣式的方法
前兩天在做一個(gè)pdf導(dǎo)出功能,使用的插件是kartik-v/yii2-mpdf,此插件使用的是mpdf。接下來(lái)通過(guò)本文給大家介紹php 使用mpdf實(shí)現(xiàn)指定字段配置字體樣式的方法,需要的朋友可以參考下2019-07-07