文档章节

Phalcon入门教程之Volt模板引擎

Marser_cn
 Marser_cn
发布于 2017/05/04 14:20
字数 1032
阅读 27
收藏 0

原文发表于:Phalcon入门教程之Volt模板引擎

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

控制器指定模板

    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)

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

{% for i in 0..100 %}
  <div>{{i}}</div>
{% endfor %}

连接符

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

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

模板继承

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

<html>
    <head>
        {% block head %}
            <link rel="stylesheet" href="style.css" />
        {% endblock %}
    </head>
    <body>
        <div id="content">
          {% block content %}
            <div>
              {% block subContent %}{% endblock %}
            </div>
          {% endblock %}
      </div>
    </body>
</html>

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

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

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

扩展模板函数

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

//文件路径:Marser\App\Core\PhalBaseVolt.php
use \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.php
class 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 %}
  <div>{{value}}</div>
{% endfor %}

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

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

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

以上代码已托管在github:https://github.com/KevinJay/marser-phalcon-demo

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

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

© 著作权归作者所有

Marser_cn

Marser_cn

粉丝 56
博文 28
码字总数 20349
作品 0
广州
项目经理
私信 提问
phalcon模板引擎(volt)自定义过滤器

引子:今天遇到一个问题,模板中某些变量有时候没有定义,如果php开启了EALL报错级别,那么会出现一个notice,提示变量未定义。一开始的想法是通过三元表达式()来给每个变量设定一个默认值,...

吾爱
2014/08/24
0
0
基于phalcon框架的CMS系统--FCMS

FCMS是国内首个开源发布的基于phalcon框架的CMS系统。 FCMS特点 高性能:比一般的CMS系统快3倍左右,phalcon框架是基于c与zephir开发的以扩展形式安装的框架,这就为该框架的高性能打下了基础...

qzfzz
2016/04/13
1K
0
Phalcon环境搭建与项目开发

简介 Phalcon 是开源、全功能栈、使用 C 扩展编写、针对高性能优化的 PHP 5 框架。 开发者不需要学习和使用 C 语言的功能, 因为所有的功能都以 PHP 类的方式暴露出来,可以直接使用。 Phal...

Minho
2016/09/06
1K
0
PHP框架 Phalcon 1.0.0 beta发布,实测性能强劲

我们宣布今天(时差问题,应该是昨天了)发布Phalcon 1.0.0 beta版本,发布此版本,主要是从社区得到测试反馈加以改进。此版本引入了一些比较重要的特性: 多级缓存: 这个新功能是缓存组件的...

netstu_
2013/03/07
5K
35
老朱/phalcon-debugbar

Phalcon Debugbar 一个无侵入的Phalcon Framework应用调试/分析工具条 功能特性 常规请求调试信息收集 Ajax请求调试信息收集 Redirect请求调试信息 调试信息持久化支持:本地file,MongoDB,El...

老朱
2015/03/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

思维导图XMind 8 Pro 绿化方法(附序列号)

按部就班: Step 1 -全新下载最新版本的 Xmind 8(注必须是英文官方的版本,中文代{过}{滤}理网站的版本修改过,无法使用pj); Step 2 -安装完毕后,点击文末的下载按钮下载pj补丁文件包,将...

一只小青蛙
18分钟前
0
0
数据结构(ER数据库)设计规范

表命名规范 表命名的规则分为3个层级,层级之间通过_分割,例如b_r_identity、d_l_identity。规约为: [leavel]_[type]_[name] [leavel] 表示数据库表的层级和功能,分为: s:业务无关的系统...

随风溜达的向日葵
42分钟前
1
0
阿里Sentinel控制台源码修改-对接Apollo规则持久化

https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel 动态规则扩展 https://github.com/alibaba/Sentinel/wiki......

jxlgzwh
昨天
3
0
在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
5
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部