在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 class="last">
<button type="submit">Login</button>
</li>
</ul>
<?php echo $form->error($model,'password'); ?>
<?php $this->endWidget(); ?>
这样的语法是没法在twig中表达的,所以想去扩展下Twig的功能,让他能够支持我们自定义的widget标签,然后自动解析成我们需要的代码。 总共需要两个类TokenParser和Node,狼蚁网站SEO优化直接上代码
<?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 pile(Twig_Compiler $piler)
{
$piler->addDebugInfo($this);
$piler->write('$context["'.$this->getAttribute('assign')->getValue().'"] = $context["this"]->beginWidget("'.$this->getAttribute('alias').'",');
$argNode = $this->getNode('args');
$piler->subpile($argNode)
->raw(');')
->raw("\n");
$piler->indent()->subpile($this->getNode('body'));
$piler->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 %}
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程