当前位置: 首页 > 编程笔记 >

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

翟淮晨
2023-03-14
本文向大家介绍在Yii框架中使用PHP模板引擎Twig的例子,包括了在Yii框架中使用PHP模板引擎Twig的例子的使用技巧和注意事项,需要的朋友参考一下

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("\n");

        $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的Yii框架的基本使用示例,包括了PHP的Yii框架的基本使用示例的使用技巧和注意事项,需要的朋友参考一下 在 Yii 自动生成的代码里,我们总能在 admin 的界面看到 CGridView 的身影。这是一个很好用的展示数据的表格控件,用的好可以明显地加快开发进度。下面就让我们来探索一下 CGridView 的基本使用吧:      简单起见,我们的代码就用 Yii demo

  • 本文向大家介绍在 Express 中使用模板引擎,包括了在 Express 中使用模板引擎的使用技巧和注意事项,需要的朋友参考一下 需要在应用中进行如下设置才能让 Express 渲染模板文件: views, 放模板文件的目录,比如: app.set('views', './views') view engine, 模板引擎,比如: app.set('view engine', 'jade') 然

  • 本文向大家介绍Python的Flask框架标配模板引擎Jinja2的使用教程,包括了Python的Flask框架标配模板引擎Jinja2的使用教程的使用技巧和注意事项,需要的朋友参考一下 Jinja2需要Python2.4以上的版本。 安装 按照Jinja有多种方式,你可以根据需要选择不同的按照方式。 使用easy_install 或pip: 这两个工具可以自动从网站上下载Jinja,并安装到py

  • EasySwoole虽说是专为API打造,但难免有些用户想一站全撸,本例介绍了如何集成模板引擎,配合Apache或者是Nginx做静态服务器,构建全站开发示例。 本示例介绍两种模板引擎的集成,分别是Smarty引擎和来自Laravel的Blade引擎 集成前准备 由于swoole_http_server对Http协议的支持并不完整,建议仅将easySwoole作为后端服务,并且在前端增加Nginx

  • 问题: 怎样在webpy中使用Cheetah模板引擎? 解决: 您需要先安装webpy(0.3)和Cheetah:http://www.cheetahtemplate.org/. 然后尝试使用下面的代码段: # encoding: utf-8 # File: code.py import web from web.contrib.template import render_cheetah r

  • 问题 如何在webpy中使用Mako模板引擎? 解决方案 首先需要安装Mako和web.py(0.3):http://www.makotemplates.org/ 然后尝试下面的代码: # encoding: utf-8 # File: code.py import web from web.contrib.template import render_mako urls = (