最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2014年06月13日 10:59:28   投稿:junjie  
這篇文章主要介紹了在Yii框架中使用PHP模板引擎Twig的例子,Twig是一款簡(jiǎn)潔的PHP模板引擎,在此小編也介紹一下,需要的朋友可以參考下

Twig是一款快速、安全、靈活的PHP模板引擎,它內(nèi)置了許多filter和tags,并且支持模板繼承,能讓你用最簡(jiǎn)潔的代碼來描述你的模板。他的語法和Python下的模板引擎Jinjia以及Django的模板語法都非常像。 比如我們?cè)赑HP中需要輸出變量并且將其進(jìn)行轉(zhuǎn)義時(shí),語法比較累贅:

復(fù)制代碼 代碼如下:

<?php echo $var ?>
<?php echo htmlspecialchars(\$var, ENT_QUOTES, 'UTF-8') ?>

但是在Twig中可以這樣寫:
復(fù)制代碼 代碼如下:

{{ var }}
{{ var|escape }}
{{ var|e }}         {# shortcut to escape a variable #}

遍歷數(shù)組:
復(fù)制代碼 代碼如下:

{% 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語法的,所以在有些表達(dá)上會(huì)遇到困難,比如我們?cè)趯慒orm的視圖時(shí),經(jīng)常會(huì)這么寫:

復(fù)制代碼 代碼如下:

<?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(); ?>


但是這樣的語法是沒法在twig中表達(dá)的,所以想去擴(kuò)展下Twig的功能,讓他能夠支持我們自定義的widget標(biāo)簽,然后自動(dòng)解析成我們需要的代碼。 總共需要兩個(gè)類:TokenParser和Node,下面直接上代碼:
復(fù)制代碼 代碼如下:

<?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初始化的地方增加我們的語法解析類:
復(fù)制代碼 代碼如下:

$twig->addTokenParser(new Yii_WidgetBlock_TokenParser);

然后我們就可以在twig的模板里這么寫了:
復(fù)制代碼 代碼如下:

{% 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 %}

相關(guān)文章

  • 判斷、添加和刪除WordPress置頂文章的相關(guān)PHP函數(shù)小結(jié)

    判斷、添加和刪除WordPress置頂文章的相關(guān)PHP函數(shù)小結(jié)

    這篇文章主要介紹了判斷、添加和刪除WordPress置頂文章的相關(guān)PHP函數(shù)小結(jié),需要的朋友可以參考下
    2015-12-12
  • phpMyAdmin 安裝配置方法和問題解決

    phpMyAdmin 安裝配置方法和問題解決

    今天在自己的本本上裝好了PHP的環(huán)境,于是就下載了個(gè)phpadmin來管理數(shù)據(jù)庫。安裝過程中卻發(fā)現(xiàn)了很多問題。
    2009-06-06
  • 深入解析php之a(chǎn)pc

    深入解析php之a(chǎn)pc

    本篇文章是對(duì)php中apc的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 淺談laravel數(shù)據(jù)庫查詢返回的數(shù)據(jù)形式

    淺談laravel數(shù)據(jù)庫查詢返回的數(shù)據(jù)形式

    今天小編就為大家分享一篇淺談laravel數(shù)據(jù)庫查詢返回的數(shù)據(jù)形式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-10-10
  • 利用PHP如何寫APP接口詳解

    利用PHP如何寫APP接口詳解

    很多朋友在開發(fā)時(shí)遇到過這樣的問題:后臺(tái)什么時(shí)候提供接口?怎么才提供一個(gè)接口,其他接口什么時(shí)候給出來?沒有接口我們前端怎么能做得了?那學(xué)完本篇就可以自己搞個(gè)接口來返回固定的死數(shù)據(jù)來測(cè)試了!
    2016-08-08
  • ubuntu12.04使用c編寫php擴(kuò)展模塊教程分享

    ubuntu12.04使用c編寫php擴(kuò)展模塊教程分享

    php語言自帶了很多的擴(kuò)展模塊,諸如mbstring、gd、pdo等等。有時(shí)為了提高效率,需要用C實(shí)現(xiàn)其中的一些功能,就可以自行編寫php的擴(kuò)展模塊
    2013-12-12
  • php使用正則表達(dá)式去掉html中的注釋方法

    php使用正則表達(dá)式去掉html中的注釋方法

    下面小編就為大家?guī)硪黄猵hp使用正則表達(dá)式去掉html中的注釋方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-11-11
  • PHP縮略圖生成和圖片水印制作

    PHP縮略圖生成和圖片水印制作

    這篇文章主要為大家詳細(xì)介紹了PHP縮略圖生成和圖片水印制作過程,php實(shí)現(xiàn)水印添加與縮略圖生成的相關(guān)步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Laravel模糊查詢區(qū)分大小寫的實(shí)例

    Laravel模糊查詢區(qū)分大小寫的實(shí)例

    今天小編就為大家分享一篇Laravel模糊查詢區(qū)分大小寫的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • php 將json格式數(shù)據(jù)轉(zhuǎn)換成數(shù)組的方法

    php 將json格式數(shù)據(jù)轉(zhuǎn)換成數(shù)組的方法

    今天小編就為大家分享一篇php 將json格式數(shù)據(jù)轉(zhuǎn)換成數(shù)組的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評(píng)論

灵璧县| 宜黄县| 贵港市| 赣榆县| 青海省| 峨眉山市| 漳浦县| 周至县| 行唐县| 高州市| 平远县| 门头沟区| 唐海县| 乳山市| 通城县| 江北区| 多伦县| 神农架林区| 连南| 武安市| 五华县| 无为县| 德阳市| 宜宾县| 阿拉尔市| 宝鸡市| 三河市| 新竹县| 湖北省| 林口县| 吉首市| 铜山县| 桐梓县| 卢湾区| 白朗县| 晋江市| 花莲市| 临颍县| 仁怀市| 洞口县| 雷山县|