相信有很多朋友還不知道,可以在smarty模板裡調用php的內建函數,我們一起來看看它的用法。
模板書寫:
{'param1'|functionName:'param2':'param3'}
php函數原型:
echo functionName('param1','param2','param3');
執行個體:
{'1234567'|substr:'1':'2'}
下面這個和函數的參數順序有關係
{'a'|str_replace:'A':'abcd'}
直接延伸到,直接在php中寫一個函數調用,不需要註冊修改器的.
更深一步的研究:發現數組會出錯.
分配了一個數組array給Smarty,假設Smarty的分界符為'{' 和'}'。
在很多資料上都看到,在Smarty中要求數組的長度時,可以用在數組後便加|count的方法調用。即通過{array|count}獲得 array的長度。但是今天在寫模板時,發現這樣得不到數組的長度,而只是得到一個返回的字串Array。也就是說僅僅是返回了{array}的結果, 而沒有返回其array的長度。
查看smarty\plugins檔案夾,發現並沒有count的相關方法,也就是說,count是直接調用了php中的方法。
後來通過網路上的資料,發現可以在count前面加@,從而正確的擷取數組的長度。再進一步查看Smarty的源碼,發現Smarty對屬性調節器後邊的 方法名進行處理時,會對前邊加@的進行特殊處理。因此作出判斷:在Smarty中的屬性調節器中調用php中定義好的函數時,可以通過加@來表示。
1、對類型為數組的方法進行測試時,發現不加@符號都會出錯。比如:要對一個數組調用count方法求出數組的長度,就可以這樣調用{array|@count},而要對數組調用end方法得出數組的最後一組資料時,則可以通過{array|@end}。
2、在對字串的相關函數進行測試,發現加不加@都可以正常的調用。
3、其他的尚未認真測試。
對於在smarty中調用複雜的php函數不予鼓勵,因為Smarty的本意就是要實現代碼和模板分離,不要偏離了人家的設計初衷。
模板書寫:
{'param1'|functionName:'param2':'param3'}
php函數原型:
echo functionName('param1','param2','param3');
執行個體:
{'1234567'|substr:'1':'2'}
下面這個比較怪 和函數的參數順序有關係
{'a'|str_replace:'A':'abcd'}
Smarty調用自訂函數
調用自訂函數需要用到register_function() 來註冊
這裡為大家舉個例子,常見的字串切割
函數如下
複製代碼 代碼如下:
function SmartyLen($params){
extract($params);
$len=strlen($text);
$max=$length;
for ($i=0;$i<$length;$i++){
$chr=substr($text,$i,1);
if(ord($chr)>0x80)//字元是中文
{
$length++;
$i++;
$len--;
}
}
$str=substr($text,0,$length);
if($len>$max)$str.="...";
Return $str;
}
註冊函數
$smarty->register_function('len',"SmartyLen");
模板調用
{len text="測試下" length="1"} //注意這裡的text和length其實是函數裡的2個參數函數的參數必須要以函數內部變數名一致,其實傳回去的的是個數組,在函數裡用extract($params);把數組中的變數匯入到當前的符號表。
http://www.bkjia.com/PHPjc/326639.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/326639.htmlTechArticle相信有很多朋友還不知道,可以在smarty模板裡調用php的內建函數,我們一起來看看它的用法。 模板書寫: {'param1'|functionName:'param2':'param3'}...