博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Phalcon入门教程之Volt模板引擎
阅读量:6389 次
发布时间:2019-06-23

本文共 4390 字,大约阅读时间需要 14 分钟。

hot3.png

原文发表于:

volt 是Phalcon中集成的模板引擎,我们也可以更换为其他模板引擎或同时使用多个模板引擎。本文只介绍 Phalcon 自带的 volt 模板引擎。

启用Volt

和其他模板引擎一样,我们需要将 volt 模板注册到 views 组件中,并设置模板文件通用后缀名,或者直接使用标准化的后缀名 .phtml 才能正常使用:

//文件路径:Marser\App\Frontend\FrontendModule.php$di->setShared('view', function () use ($config, $di) {    $view = new \Phalcon\Mvc\View();    //设置模板根目录    $view->setViewsDir(ROOT_PATH . '/app/frontend/views/');    //注册模板引擎    $view->registerEngines(array(        //设置模板后缀名        '.phtml' => function ($view, $di) use ($config) {            $volt = new \Phalcon\Mvc\View\Engine\Volt($view, $di);            $volt->setOptions(array(                //模板是否实时编译                'compileAlways' => false,                //模板编译目录                'compiledPath' => ROOT_PATH . '/app/cache/compiled/frontend'            ));            return $volt;        },    ));    return $view;});

用法

volt 模板中 基本用法变量表达式流程控制等部分的具体用法,文档中已有详细说明,请直接翻阅 这里分享一下大家咨询比较多的几处用法以及踩过的坑。

控制器指定模板

public function testAction(){        $this->view->pick('view/test');    }

变量传值

//控制器中变量    public function test2Action(){        //setVar:单独进行变量传值        $this->view->setVar('test', 'hello world');        //setVars:关联数组进行变量传值        //$this->view->setVars([        //    'test' => 'hellow world',        //]);        $this->view->pick('view/test2');    }

数值循环(For)

中有提到 volt 模板中 对象关联数组 的循环方式,但没有明确例子来说明数值循环的用法。具体用法请看如下示例代码:

{% for i in 0..100 %}  
{
{i}}
{% endfor %}

连接符

volt 模板中的连接符不是 . ,也不是 + ,而是 ~,代码示例如下:

{
{ url('user/detail?uid='~user['uid']) }}

模板继承

中有非常详细的 模板的继承 的用法。这里和大家分享我在使用模板继承过程中踩过的一个坑:

            {% block head %}            
{% endblock %}
{% block content %}
{% block subContent %}{% endblock %}
{% endblock %}

在模板编译过程中,会报如下错误信息:

#模板继承中的block块不能嵌套Embedding blocks into other blocks is not supported

目前官方暂未计划支持此功能,所以大家在使用模板继承时,需要特别注意规避block块嵌套的问题。

扩展模板函数

volt 模板中提供了一些常用的基本函数,若想在其中使用自定义函数或PHP自带的其他函数,则需要将函数注册到 volt 模板中。 首先,我们定义一个 volt 模板基类,并通过 模板编译器 添加函数:

//文件路径:Marser\App\Core\PhalBaseVolt.phpuse \Phalcon\Mvc\View\Engine\Volt;class PhalBaseVolt extends Volt{    /**     * 添加扩展函数     */    public function initFunction(){        $compiler = $this->getCompiler();        // 添加PHP自带的explode函数         $compiler -> addFunction('explode', 'explode');        // 添加自定义的get_userinfo函数        //$resolvedArgs即为任意参数,可接收多个参数        //这里需要注意的是,匿名函数中的return返回值必须是string类型,且不需要实例化类,直接通过范围解析操作符(::)调用成员方法        $compiler -> addFunction('get_userinfo', function($resolvedArgs, $exprArgs) use ($compiler){            return '\Marser\App\Libs\Test::get_userinfo(' . $resolvedArgs . ')';        });    }}

其中自定义函数 get_userinfo() 的代码如下:

//文件路径:Marser\App\Libs\Test.phpclass Test {    public function get_userinfo($username, $age, $mobile){        return "用户名:{$username}, 年龄:{$age}, 联系方式:{$mobile}";    }}

通过上述代码,就已经向模板编译器中添加了PHP自带的 explode() 函数和程序中自定义的 get_userinfo() 函数。

然后,我们修改 DI 中注册的 views 对象:

//文件路径:Marser\App\Frontend\FrontendModule.php        $di -> setShared('view', function() use($config) {            $view = new \Phalcon\Mvc\View();            #设置模板根目录            $view -> setViewsDir(ROOT_PATH . '/app/frontend/views/');            #注册模板引擎            $view -> registerEngines(array(                #设置模板后缀名                '.phtml' => function($view, $di) use($config) {                    #实例化volt模板对象                    $volt = new \Marser\App\Core\PhalBaseVolt($view, $di);                    #设置模板配置项                    $volt -> setOptions(array(                        #模板是否实时编译                        'compileAlways' => false,                        #模板编译目录                        'compiledPath'  =>  ROOT_PATH . '/app/cache/compiled/frontend'                    ));                    # 注意!区别在此行---添加模板扩展函数                    $volt -> initFunction();                    return $volt;                },            ));            return $view;        });

至此, explode()get_userinfo() 两个函数就已经注册在模板中了。那么,如何调用呢? explode() 在模板中调用的示例代码:

{% set introArray = explode('-', intro) %}{% for value in introArray %}  
{
{value}}
{% endfor %}

自定义函数 get_userinfo() 在模板中调用的示例代码:

{
{get_userinfo('admin', '20', '中国上海')}}

不论是PHP自带函数,还是程序中自定义的函数,只需按照函数定义时的参数顺序传参即可。

以上代码已托管在github:

最后,欢迎大家加入QQ群交流讨论:

  • 广州PHP高端交流群:158587573
  • Phalcon玩家群:150237524

转载于:https://my.oschina.net/KevinJay/blog/892224

你可能感兴趣的文章
Sublime-text gitHub 问题收集
查看>>
UML 类图
查看>>
Unity Remote 无法连接
查看>>
linux下core file size设置笔记
查看>>
mysql 、redis的区别
查看>>
使用JPA中@Query 注解实现update 操作
查看>>
7.4. APC Cache (php-apc - APC (Alternative PHP Cache) module for PHP 5)
查看>>
Web 仪表盘
查看>>
我的Fedora 7硬盘安装过程
查看>>
18.4. FAQ
查看>>
Python——SSHClient.py
查看>>
MVC解决更新冲突问题
查看>>
江西理工大学南昌校区cool code竞赛
查看>>
[LeetCode] Trim a Binary Search Tree 修剪一棵二叉搜索树
查看>>
Ubuntu SDL lib 安装
查看>>
Java 并发编程内部分享PPT分享
查看>>
关于discuz中禾金投票系统循环出现引导页的问题
查看>>
C#开源系统大汇总
查看>>
Linux服务器安全初始化自选安装Shell脚本
查看>>
PyCharm教程
查看>>