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

2015-01-24信息快讯网

这篇文章主要介绍了在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 %}

php采用ajax数据提交post与post常见方法总结
php学习笔记之面向对象
php学习笔记之基础知识
推荐一款MAC OS X 下php集成开发环境mamp
php使用fgetcsv读取csv文件出现乱码的解决方法
Codeigniter(CI)框架分页函数及相关知识
ThinkPHP模板之变量输出、自定义函数与判断语句用法
ThinkPHP模板中数组循环实例
Windows下的PHP安装pear教程
Windows下安装PHP单元测试环境PHPUnit图文教程
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
在Win7 中为php扩展配置Xcache
在win7中搭建Linux+PHP 开发环境
CodeIgniter错误mysql_connect(): No such file or directory解决方法
CodeIgniter框架URL路由总结
ThinkPHP模板替换与系统常量及应用实例教程
ThinkPHP多语言支持与多模板支持概述
从零开始学YII2框架(六)高级应用程序模板
Codeigniter中mkdir创建目录遇到权限问题和解决方法
codeigniter上传图片不能正确识别图片类型问题解决方法
Yii结合CKEditor实现图片上传功能
ThinkPHP中U方法的使用浅析
PHP实现单例模式最安全的做法
PHP5.5和之前的版本empty函数的不同之处
PHP输出英文时间日期的安全方法(RFC 1123格式)
PHP中多维数组的foreach遍历示例
Codeigniter上传图片出现“You did not select a file to upload”错误解决办法
CodeIgniter框架过滤HTML危险代码
让CodeIgniter的ellipsize()支持中文截断的方法
Codeigniter实现多文件上传并创建多个缩略图
让codeigniter与swfupload整合的最佳解决方案
Codeigniter出现错误提示Error with CACHE directory的解决方案
windwos下使用php连接oracle数据库的过程分享
模板引擎smarty工作原理以及使用示例
Smarty模板学习笔记之Smarty简介
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
win7计划任务定时执行PHP脚本设置图解
Windows中使用计划任务自动执行PHP程序实例
在PHP模板引擎smarty生成随机数的方法和math函数详解
PHP模板引擎Smarty的缓存使用总结
php smarty模板引擎的6个小技巧
©2014-2024 dbsqp.com