在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中需要输出变量并且将其进行转义时,语法比较累赘:
- <?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 class="last">
- <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 %}
Tags: Yii框架 Twig
相关文章
- ·详解PHP的Yii框架中扩展的安装与使用(2019-10-20)
- ·PHP的Yii框架中过滤器相关的使用总结(2019-10-31)
- ·简介PHP的Yii框架中缓存的一些高级用法(2019-10-31)
- ·深入解析PHP的Yii框架中的缓存功能(2019-11-05)
- ·PHP的Yii框架中创建视图和渲染视图的方法详解(2019-11-05)
- ·PHP的Yii框架中Model模型的学习教程(2019-11-05)
- ·详解PHP的Yii框架中的Controller控制器(2019-11-05)
- ·yii框架表单模型使用及以数组形式提交表单数据示例(2020-11-25)
- ·yii框架通过控制台命令创建定时任务示例(2020-11-25)
- ·yii框架配置默认controller和action示例(2020-11-25)
- ·Yii框架登录流程分析(2021-05-02)
- ·Yii框架中memcache用法实例(2021-05-02)
- ·Yii框架form表单用法实例(2021-05-02)
- ·Yii框架在页面输出执行sql语句以方便调试的实现方法(2021-05-04)
- ·Yii框架调试心得--在页面输出执行sql语句(2021-05-04)
- ·PHP的Yii框架使用中的一些错误解决方法与建议(2021-06-16)
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)