是這樣的,這次在 smart5 中要使用php原本的函式,像這樣:
One.tpl
<h5>{{rand()}}</h5>
在 smarty4以前都沒有問題,但這次在 smarty5 的環境中卻出錯了:
Smarty\CompilerException
Syntax error in template "file:One.mtpl" on line 16 "<h5>{{rand()}}</h5>" unknown modifier 'rand'
沒錯,無法使用php的內建函數。
官網提出的解釋是因為資安弱點,所以爾後得使用modifier,不再提供樣版中直接使用php函式的功能。
後來找了一些資料[2],發現以前的函式 register_modifier() 也不能用(這是舊版用的),在 smarty5 中你可以使用registerPlugin()函式來註冊新的modifier就可以了。
$smarty->registerPlugin('modifier', 'rand', 'rand');
參數三個分別是 type、在樣版中的名稱、實際叫用的函式名稱(也可以使用你自己的函式)。
這樣就可以在樣版中使用php的函式了。
會在樣版中使用的函式就那幾個,所以也可以寫在初始化設定中,例如我寫成這樣:
parent::registerPlugin('modifier', 'lang', 'lang');
* lang() 是自定義的函數
上面的parent 是因為繼承smarty的物件,完整大概長這樣:
use Smarty; class Smarty5 extends Smarty\Smarty { public function __construct() { parent::__construct(); parent::setTemplateDir(APPPATH . 'Views/'); parent::setConfigDir(APPPATH . 'Config/Smarty5/'); parent::setCompileDir(WRITEPATH . 'templates_c/')->setCacheDir(WRITEPATH . 'cache/'); parent::setLeftDelimiter('{{'); parent::setRightDelimiter('}}'); parent::registerPlugin('modifier', 'lang', 'lang'); } public function view($tpl_name) { parent::display($tpl_name); } }
這樣我就可以使用
$s= new Smarty5();
這樣的方法叫用 smarty了。
參考資料
[1] smarty5官網 https://smarty-php.github.io/smarty/stable/upgrading/#variable-scope-bubbling