原文發表於: Phalcon入門教程之Volt模板引擎
volt
是Phalcon中集成的模板引擎,咱們也能夠更換爲其餘模板引擎或同時使用多個模板引擎。本文只介紹 Phalcon
自帶的 volt
模板引擎。php
和其餘模板引擎同樣,咱們須要將 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'); }
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羣交流討論: