[精讚] [會員登入]
1828

[Smarty5] 如何在樣版中使用php本身的函式

解決 smarty5版後不能直接叫用 php函式的問題

分享此文連結 //n.sfs.tw/16438

分享連結 [Smarty5] 如何在樣版中使用php本身的函式@新精讚
(文章歡迎轉載,務必尊重版權註明連結來源)
2024-07-07 07:11:06 最後編修
2024-07-06 18:36:28 By 張○○
 

自動目錄

是這樣的,這次在 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

[2] https://github.com/smarty-php/smarty/issues/813

END

你可能感興趣的文章

[PHP7] 讀取mysql資料庫的傳統方法 使用傳統預設的方法來連結mysql資料庫

[PHP] 位元運算 (Bitwise operation)及和PERL比較 PHP 的位元運算,及和PERL比較整理

[PHP] UTF8中取出字串中特定的字數 要將字串,例如資料庫取出的TEXT,取出特定的字數

[CodeIgniter 3] 自寫找不到頁面(page404)的方法 使用CI3框架中如果找不到頁面,就會導到一個自定的404頁面,該怎麼做?

使用strcmp來判斷日期是否介於某日期之間 要比較現在日期是否在兩個日期之間,使用字串比對的方法

[CI3] 使用和修改日曆類別 calendar library CI3有一個日曆圖書館 library,可以快速的建立一個日曆,但是想修改讓他更棒

隨機好文

為什麼要買長達二十年的保單? 為什麼要買長達二十年的保單?找一個可以說服我買二十年保單的理由。

PHP for sphinx 函式庫安裝 PECL/sphinx PHP>= 5.2.2 已經能原生支援 sphinx,可是預設的沒有裝,我們得自己裝才能用

[bc] linux 的計算機 bc 設定小數位數、計算π、次方根 linux 的計算機 bc 設定小數位數、計算π、次方根

[Win7] 燒錄 iso 檔 在Windows7 中內建燒錄程式,可以直接把檔案拉到光碟機裡,再執行燒錄。

正則表達式:Email名稱防止連續輸入點(.)及下底線(_) Email的名稱中要允許特殊符號,但又不允許連續出現的正則表達式