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/m...
Phalcon 使用Volt模版引擎