首页 >

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

后端开发|php教程在Yii框架中使用PHP模板引擎Twig的例子【PHP】
Yii框架,Twig模板引擎
后端开发-php教程
Twig是一款快速、安全、灵活的PHP模板引擎,它内置了许多filter和tags,并且支持模板继承,能让你用最简洁的代码来描述你的模板。他的语法和Python下的模板引擎Jinjia以及Django的模板语法都非常像。 比如我们在PHP中需要输出变量并且将其进行转义时,语法比较累赘:
5173游戏平台源码,vscode前端常用的设置,ubuntu 建账户,tomcat遇到错误重启,反爬虫收入,php 多语言cms,外贸网店专业词汇seo,在线交易网站源码,咨询语言模板lzw

但是在Twig中可以这样写:
短信群发网站程序源码,ubuntu 个目录,f14tomcat场景,抓取小说爬虫,php判断月份有多少天,站长之家 seo查询官方网站lzw
{{ var }}
{{ var|escape }}
{{ var|e }} {# shortcut to escape a variable #}
遍历数组:
ybi互助平台源码,vscode调试窗口,grub> ubuntu,tomcat内嵌开发,sqlite数据库替换,jquery 用户引导 插件,h-ui前端框架视频系统,爬虫下来的数据如何清洗,rbac php,石家庄seo付费,医疗网站侧边浮层,dede 输入网址采集单个网页,企业后台管理系统模板lzw
{% for user in users %}
* {{ user.name }}
{% else %}
No user has been found.
{% endfor %}

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

beginWidget('CActiveForm'); ?>
Login

label($model,'username'); ?>
textField($model,'username'); ?>


label($model,'password'); ?>
passwordField($model,'password'); ?>



error($model,'password'); ?>
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 %}

{{ form.label(model, 'username') }}
{{ form.textField(model, 'username') }}

{{ form.label(model, 'password') }}
{{ form.passwordField(model, 'password') }}

{% endwidget %}


在Yii框架中使用PHP模板引擎Twig的例子【PHP】
  • yii框架builder、update、delete使用方法
  • yii框架builder、update、delete使用方法 | yii框架builder、update、delete使用方法 ...

    在Yii框架中使用PHP模板引擎Twig的例子【PHP】
  • Yii框架form表单用法实例【PHP】
  • Yii框架form表单用法实例【PHP】 | Yii框架form表单用法实例【PHP】 ...

    在Yii框架中使用PHP模板引擎Twig的例子【PHP】
  • yii框架源码分析之创建controller代码【PHP】
  • yii框架源码分析之创建controller代码【PHP】 | yii框架源码分析之创建controller代码【PHP】 ...