程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> Smarty高級特性 用戶自定義函數使用

Smarty高級特性 用戶自定義函數使用

編輯:PHP綜合
基礎篇
我們可以直接使用SMARTY::register_function來注冊一個程序員自定義的PHP函數,只要這個函數所在的文件已經被引入,就可以正確使用它。
DEMO 1: $smarty = set_smarty();
$smarty->register_function('example','format_data');
$smarty->assign('time',time());
$smarty->display('demo.htm'); 自定義函數如下: function format_data( $params ) extract($params);
echo date($format,$time);
} 模板文件如下: {example time="$time" format="Y-m-d"} 不難看出,我們很輕松的就布署使用了我們的自定義函數了。有一點我們需要注意到的是,在format_data函數裡,我們是以一個數組對值進行傳入的,而在模板文件裡,我們可以任意的建一些關鍵字,只要你能記得住。當然,除了SMARTY的保留字之外。
而後我們通過extract把這個數組裡面的值釋放放出來,當然這種方案是有多種多樣的,你可以使用list,也可以使用explode,總之你能想到的辦法就是好辦法,只要你用得熟悉。進階篇 有一種情況很快發生了,小張總是搞不清楚我到底注冊了多少個自定義函數供她使用,她總是忘記一些關鍵字的定義,比如在一個取出熱門的連載小說裡,她不知道有沒有hot這個關鍵詞。因為這種自定義的函數太多了,她不得不經常的拿著我給她打印出來的技術文檔苦著臉查找,我很內疚。於是,另一種解決方案應運而生。
本文開始時,曾經舉了了像{PHPsoho “sort=article&order=ID DESC&limit=10&tplfolder=article&tplname=article.list”}這樣的字符串在模板裡的例子。或者你會說,頭哥在騙人呀,這根本跟第一個例子是一樣的嘛,無非是傳來的值不一樣而已。那麼,咱們接著往下看。。。
DEMO 2:
我們假裝smarty已經被實例化,並且資源名為$smarty.
首先我們注冊一個自定義函數到smarty中,這個跟上例一樣,完全是為了騙幾個字。 $smarty->register_function( 'phpsoho','tags_extends' ); include_once __ROOT_PATH__ . '/include/tags.func.php'; 這裡需要注意的是,我們注冊的到phpsoho句柄中的函數為tags_extends,函數名是什麼意思不做一一解釋,具體可以看PHP函數命名規范這樣的文檔。
[PHP]
function tags_extends( $params ) $action = $params['action'];
$optional = $params['optional'];
if ( !$action )   Error::putMsg('tags_extends_error','tags_extends action is null.');
} if( !function_exists($action) )   Error::putMsg( 'function_exists','function null. class file.'.$extend_tags_file . '. classname:'.$action ); $action($optional); [/php] [PHP]
{PHPsoho action="getAffiche" optional="fileds=id,title,posttime&titlelen=17&and[stauts]=1&limit=5&order=id DESC&tpl=afiche.right"}
[/php] 在模板文件裡面,我們使用PHPsoho這個資源句柄把請求定位到'tags_extends'函數中,在這個函數中,我們做了幾種檢查:
Check Action:檢查動作是否被設置,這個為必須的關鍵字.其實我是以這個action來進行下面的函數定位操作的.
Check function_exists:檢查相應執行的函數是否存在或者是否已經被加載進入
這裡我們不用檢查optional,因為我們會在下一步裡進行另一步檢查.
$action($optional)被執行,也就是說上例中的getAffiche被引入了,並且設置$optional的值為 fileds=id,title,posttime&titlelen=17&and[stauts]=1&limit=5&order=id DESC&tpl=afiche.right,裡面的一些一一對應的關系,我就不一一過多的講解。我是有文檔給小張的,你們誰想要,可以聯系她。她可是美女喲~!
回過頭來,我們看$action($optional),為什麼我說看$action而不是getAffiche呢?因為誰知道你將來會讓他引入什麼函數呢?(狂笑,得意的笑)
$action()DEMO:
[PHP]
function getAffiche($optional) global $db;
parse_str($optional);
$res = $db->getFetchArray('litou_affiche',$fileds,$and,$order,$limit);
$smarty = set_smarty();
$smarty->assign('titlelen',$titlelen);
$smarty->assign('affiche',$res);
$smarty->display( $tpl .$GLOBALS['tplEx']); [/php] 原來我們在函數的內容完成了指定內容的一些操作。當然,我這個完全是為了寫這篇文章臨時寫出來的,但你們可以在這裡面加上一些PHP的高級特性,比如:緩存,在你的字符上加入cache=3600(一般我們使用的是秒,就是一個小時),那你可以通過上面的一些關鍵詞定義引入你的cache,並且可以根據時間來更新後引入,加上過濾或者其它任何你想要的功能。知識點:
[PHP]
parse_str, Parses the string into variables
void parse_str ( string $str [, array &$arr ] )
[/PHP]
這是個很好用的函數,包括它的家族兄弟們 parse_ini_file及parse_url,具體用法自己去測試。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved