Phalcon入門教程之Volt模板引擎

原文發表於: Phalcon入門教程之Volt模板引擎

volt 是Phalcon中集成的模板引擎,咱們也能夠更換爲其餘模板引擎或同時使用多個模板引擎。本文只介紹 Phalcon 自帶的 volt 模板引擎。php

啓用Volt

和其餘模板引擎同樣,咱們須要將 volt 模板註冊到 views 組件中,並設置模板文件通用後綴名,或者直接使用標準化的後綴名 .phtml 才能正常使用:css

//文件路徑: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文檔
這裏分享一下你們諮詢比較多的幾處用法以及踩過的坑。html

控制器指定模板

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 模板中 對象關聯數組 的循環方式,但沒有明確例子來講明數值循環的用法。具體用法請看以下示例代碼:git

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

鏈接符

volt 模板中的鏈接符不是 . ,也不是 + ,而是 ~,代碼示例以下:github

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

模板繼承

Phalcon文檔 中有很是詳細的 模板的繼承 的用法。這裏和你們分享我在使用模板繼承過程當中踩過的一個坑:shell

<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塊嵌套的問題。app

擴展模板函數

volt 模板中提供了一些經常使用的基本函數,若想在其中使用自定義函數或PHP自帶的其餘函數,則須要將函數註冊到 volt 模板中。
首先,咱們定義一個 volt 模板基類,並經過 模板編譯器 添加函數:frontend

//文件路徑: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/m...

最後,歡迎你們加入QQ羣交流討論:

  • 廣州PHP高端交流羣:158587573
  • Phalcon玩家羣:150237524
相關文章
相關標籤/搜索