当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2021-02-19 12:16:13 浏览: 评论:0 

这篇文章主要介绍了在Yii框架中使用PHP模板引擎Twig的例子,Twig是一款简洁的PHP模板引擎,在此小编也介绍一下,需要的朋友可以参考下。

Twig是一款快速、安全、灵活的PHP模板引擎,它内置了许多filter和tags,并且支持模板继承,能让你用最简洁的代码来描述你的模板。他的语法和Python下的模板引擎Jinjia以及Django的模板语法都非常像。 比如我们在PHP中需要输出变量并且将其进行转义时,语法比较累赘:

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

但是在Twig中可以这样写:

  1. {{ var }} 
  2. {{ var|escape }} 
  3. {{ var|e }}         {# shortcut to escape a variable #} 

遍历数组:

  1. {% for user in users %} 
  2.   * {{ user.name }} 
  3. {% else %} 
  4.   No user has been found. 
  5. {% endfor %} 

但是要在Yii Framework集成Twig就会遇到点麻烦了,官方网站中已经有能够集成Twig的方案,所以这里我也不再赘述。但是由于Twig中是不支持PHP语法的,所以在有些表达上会遇到困难,比如我们在写Form的视图时,经常会这么写:

  1. <?php $form=$this->beginWidget('CActiveForm'); ?> 
  2.     <span>Login</span> 
  3.     <ul> 
  4.   <li> 
  5.     <?php echo $form->label($model,'username'); ?> 
  6.                 <?php echo $form->textField($model,'username'); ?> 
  7.   </li> 
  8.  
  9.   <li> 
  10.     <?php echo $form->label($model,'password'); ?> 
  11.                 <?php echo $form->passwordField($model,'password'); ?> 
  12.  
  13.   </li> 
  14.  
  15.   <li class="last"
  16.     <button type="submit">Login</button> 
  17.  
  18.   </li> 
  19.  
  20. </ul> 
  21.     <?php echo $form->error($model,'password'); ?> 
  22. <?php $this->endWidget(); ?> 

但是这样的语法是没法在twig中表达的,所以想去扩展下Twig的功能,让他能够支持我们自定义的widget标签,然后自动解析成我们需要的代码。 总共需要两个类:TokenParser和Node,下面直接上代码:

  1. <?php 
  2. /* 
  3.  * This file is an extension of Twig. 
  4.  * 
  5.  * (c) 2010 lfyzjck 
  6.  */ 
  7. /** 
  8.  * parser widget tag in Yii framework 
  9.  * 
  10.  * {% beginwidget 'CActiveForm' as form %} 
  11.  *    content of form 
  12.  * {% endwidget %} 
  13.  * 
  14.  */ 
  15. class Yii_WidgetBlock_TokenParser extends Twig_TokenParser 
  16.     /** 
  17.      * Parses a token and returns a node. 
  18.      * 
  19.      * @param Twig_Token $token A Twig_Token instance 
  20.      * 
  21.      * @return Twig_NodeInterface A Twig_NodeInterface instance 
  22.      */ 
  23.     public function parse(Twig_Token $token
  24.     { 
  25.         $lineno = $token->getLine(); 
  26.         $stream = $this->parser->getStream(); 
  27.  
  28.         $name = $stream->expect(Twig_Token::STRING_TYPE); 
  29.         if($stream->test(Twig_Token::PUNCTUATION_TYPE)){ 
  30.             $args = $this->parser->getExpressionParser()->parseHashExpression(); 
  31.         } 
  32.         else
  33.             $args = new Twig_Node_Expression_Array(array(), $lineno); 
  34.         } 
  35.  
  36.         $stream->expect(Twig_Token::NAME_TYPE); 
  37.         $assign = $stream->expect(Twig_Token::NAME_TYPE); 
  38.         $stream->expect(Twig_Token::BLOCK_END_TYPE); 
  39.  
  40.         $body = $this->parser->subparse(array($this'decideBlockEnd'), true); 
  41.         $stream->expect(Twig_Token::BLOCK_END_TYPE); 
  42.  
  43.         return new Yii_Node_WidgetBlock(array
  44.             'alias' => $name->getValue(), 
  45.             'assign' => $assign
  46.         ), $body$args$lineno$this->getTag()); 
  47.     } 
  48.  
  49.     /** 
  50.      * Gets the tag name associated with this token parser. 
  51.      * 
  52.      * @param string The tag name 
  53.      */ 
  54.     public function getTag() 
  55.     { 
  56.         return 'beginwidget'
  57.     } 
  58.  
  59.     public function decideBlockEnd(Twig_Token $token
  60.     { 
  61.         return $token->test('endwidget'); 
  62.     } 
  63.  
  64. class Yii_Node_WidgetBlock extends Twig_Node 
  65.     public function __construct($attrs, Twig_NodeInterface $body, Twig_Node_Expression_Array $args = NULL, $lineno$tag
  66.     { 
  67.         $attrs = array_merge(array('value' => false),$attrs); 
  68.         $nodes = array('args' => $args'body' => $body); 
  69.         parent::__construct($nodes$attrs$lineno,$tag); 
  70.     } 
  71.  
  72.     public function compile(Twig_Compiler $compiler
  73.     { 
  74.         $compiler->addDebugInfo($this); 
  75.         $compiler->write('$context["'.$this->getAttribute('assign')->getValue().'"] = $context["this"]->beginWidget("'.$this->getAttribute('alias').'",'); 
  76.         $argNode = $this->getNode('args'); 
  77.         $compiler->subcompile($argNode
  78.                  ->raw(');'
  79.                  ->raw("\n"); 
  80.  
  81.         $compiler->indent()->subcompile($this->getNode('body')); 
  82.  
  83.         $compiler->raw('$context["this"]->endWidget();'); 
  84.     } 
  85. ?> 

然后在Twig初始化的地方增加我们的语法解析类:

$twig->addTokenParser(new Yii_WidgetBlock_TokenParser);

然后我们就可以在twig的模板里这么写了:

  1. {% beginwidget 'CActiveForm' as form %} 
  2. <ul> 
  3.   <li> 
  4.     {{ form.label(model, 'username') }} 
  5.     {{ form.textField(model, 'username') }} 
  6.   </li> 
  7.   <li> 
  8.     {{ form.label(model, 'password') }} 
  9.     {{ form.passwordField(model, 'password') }} 
  10.   </li> 
  11. </ul> 
  12. {% endwidget %} 

Tags: Yii框架 Twig

分享到: