首页 php教程 php手册 在Yii框架中使用PHP模板引擎Twig的例子

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

Jun 13, 2016 am 09:33 AM
twig yii

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

复制代码 代码如下:




但是在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的视图时,经常会这么写:

复制代码 代码如下:


beginWidget('CActiveForm'); ?>
    Login
   


     

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

     

  •  


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

     

  •  


  •    

     


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

复制代码 代码如下:


/*
 * 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 %}
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
2 周前 By 尊渡假赌尊渡假赌尊渡假赌
仓库:如何复兴队友
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒险:如何获得巨型种子
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

如何在CakePHP中使用Twig? 如何在CakePHP中使用Twig? Jun 05, 2023 pm 07:51 PM

在CakePHP中使用Twig是一种将模板和视图分离的方法,能够使代码更加模块化和可维护,本文将介绍如何在CakePHP中使用Twig。一、安装Twig首先在项目中安装Twig库,可以使用Composer来完成这个任务。在控制台中运行以下命令:composerrequire"twig/twig:^2.0"这个命令会在项目的vendor

如何在PHP中使用Twig模板引擎进行Web开发 如何在PHP中使用Twig模板引擎进行Web开发 Jun 25, 2023 pm 04:03 PM

随着Web开发技术的不断发展,越来越多的开发者开始寻找更加灵活、高效的模板引擎来进行Web应用的开发。其中,Twig是一款十分优秀、流行的PHP模板引擎,它基于Symfony框架开发并支持无限扩展,非常适合用于构建复杂的Web应用程序。本篇文章将介绍如何在PHP中使用Twig模板引擎进行Web开发。一、Twig模板引擎简介Twig是由FabienPoten

PHP8.0中的模板库:Twig PHP8.0中的模板库:Twig May 14, 2023 am 08:40 AM

PHP8.0中的模板库:TwigTwig是一款目前广泛用于PHPWeb应用程序中的模板库,具有可读性高、易于使用和可扩展性强等特点。Twig使用简单易懂的语法,可以帮助Web开发人员以清晰、有序的方式组织和输出HTML,XML,JSON等文本格式。本篇文章将为您介绍Twig的基本语法和特点以及它在PHP8.0中的使用。Twig的基本语法Twig采用类似于P

使用Twig和Timber图像、菜单和用户,快速启动WordPress开发 使用Twig和Timber图像、菜单和用户,快速启动WordPress开发 Sep 04, 2023 pm 03:37 PM

到目前为止,您已经了解了通过Timber使用Twig的基本概念,同时构建了模块化WordPress主题。我们还基于DRY原则,使用Twig研究了块嵌套和多重继承。今天,我们将探讨如何通过Timber插件使用Twig在主题中显示附件图像、WordPress菜单和用户。木材中的图像图像是任何WordPress主题的重要元素之一。在常规的WordPress编码实践中,图像与PHP集成在正常的HTML图像标签内。但是,Timber提供了一种相当全面的方法来处理img(图像)标签,该方法是模块化且干净的。

PHP中的高级皮肤:如何使用Twig PHP中的高级皮肤:如何使用Twig Jun 19, 2023 pm 04:03 PM

在Web开发中,页面的呈现是至关重要的。对于PHP开发人员,他们在开发一个动态网站时,容易深陷在大量的HTML标记和PHP代码中。而一旦需要修改样式或布局,就必须一遍遍地修改代码,这样的维护成本极高。为了解决这个问题,现代的PHP框架通常提供了一个模板引擎。其中,Twig是其中一个较为流行的模板引擎。在本文中,我们将介绍如何以及为什么使用Twig来进行PHP

php如何使用Yii3框架? php如何使用Yii3框架? May 31, 2023 pm 10:42 PM

随着互联网的不断发展,Web应用程序开发的需求也越来越高。对于开发人员而言,开发应用程序需要一个稳定、高效、强大的框架,这样可以提高开发效率。Yii是一款领先的高性能PHP框架,它提供了丰富的特性和良好的性能。Yii3是Yii框架的下一代版本,它在Yii2的基础上进一步优化了性能和代码质量。在这篇文章中,我们将介绍如何使用Yii3框架来开发PHP应用程序。

如何使用PHP框架Yii开发一个高可用的云备份系统 如何使用PHP框架Yii开发一个高可用的云备份系统 Jun 27, 2023 am 09:04 AM

随着云计算技术的不断发展,数据的备份已经成为了每个企业必须要做的事情。在这样的背景下,开发一款高可用的云备份系统尤为重要。而PHP框架Yii是一款功能强大的框架,可以帮助开发者快速构建高性能的Web应用程序。下面将介绍如何使用Yii框架开发一款高可用的云备份系统。设计数据库模型在Yii框架中,数据库模型是非常重要的一部分。因为数据备份系统需要用到很多的表和关

Yii2 vs Phalcon:哪个框架更适合开发显卡渲染应用? Yii2 vs Phalcon:哪个框架更适合开发显卡渲染应用? Jun 19, 2023 am 08:09 AM

在当前信息时代,大数据、人工智能、云计算等技术已经成为了各大企业关注的热点。在这些技术中,显卡渲染技术作为一种高性能图形处理技术,受到了越来越多的关注。显卡渲染技术被广泛应用于游戏开发、影视特效、工程建模等领域。而对于开发者来说,选择一个适合自己项目的框架,是一个非常重要的决策。在当前的语言中,PHP是一种颇具活力的语言,一些优秀的PHP框架如Yii2、Ph

See all articles