一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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

Twig是一款快速、安全、靈活的php模板引擎,它內(nèi)置了許多filter和tags,并且支持模板繼承,能讓你用最簡(jiǎn)潔的代碼來描述你的模板。他的語(yǔ)法和Python下的模板引擎Jinjia以及Django的模板語(yǔ)法都非常像。 比如我們?cè)?a href=/itjie/phpjishu/ target=_blank class=infotextkey>php中需要輸出變量并且將其進(jìn)行轉(zhuǎn)義時(shí),語(yǔ)法比較累贅:
復(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語(yǔ)法的,所以在有些表達(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(); ?>
但是這樣的語(yǔ)法是沒法在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初始化的地方增加我們的語(yǔ)法解析類:
復(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 %}

php技術(shù)在Yii框架中使用PHP模板引擎Twig的例子,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 国产一级二级在线观看 | 91最新在线观看 | 中文字幕第13亚洲另类 | www.在线观看视频 | 伊人婷婷色 | 国产亚洲综合成人91精品 | 久久精品久久久久久久久人 | 精品国产91久久久久 | 国产伦精品一区二区三区女 | 久久免费精彩视频 | 欧美变态老妇重口与另类 | 国产精品亚洲片夜色在线 | 婷婷玖玖 | 91在线视频导航 | 在线看91| 欧美性一区 | 日本高清一区二区三区不卡免费 | 一区二区午夜 | 久久伊人精品青青草原2021 | 成人免费午夜视频 | 欧美激情图片小说 | 色哟哟在线网站 | 精品中文字幕久久久久久 | 色播亚洲精品网站 亚洲第一 | 午夜看大片 | 999影院成 人在线影院 | 亚洲第9页| 热99re久久精品2久久久 | 一级毛毛片毛片毛片毛片在线看 | 国内精品免费一区二区三区 | 久久综合久久久 | 国产精品亚洲一区二区三区正片 | 中文字幕在线有码 | 六月色婷婷 | 一级片美女| 美女又胸大又黄的网站 | 亚色网址| 欧美极品欧美精品欧美图片 | 久久婷婷一区二区三区 | 欧美videos极品另类 | 国产午夜免费视频 |