標籤:使用 檔案 資料 art io cti
塊函數的形式是這樣的:{func} .. {/func}。換句話說,它們被封閉在一個模板地區內,然後對該地區的內容進行操作。預設地,你的函數實現會被Smarty調用兩次:一次是在開始標籤,另一次是在閉合標籤。塊函數在模板中使用和函數還是有一些區別的,但自訂添加的方式差距不大,也可以使用兩種方式進行添加。使用Smarty對象中的addPluginsDir()方法動態註冊時,將第一個參數改為“block”。如果以特定檔案的方式擴充塊函數,檔案的命名規則是“block.塊函數名.php”的結構,函數命令規則是“smarty_block_塊函數名($params, $content, $smarty,&$repeat)”。只有塊函數的開始標籤具有屬性,所有屬性包含在作為關聯陣列的$params變數中,經由模板傳遞給模板函數。當處理閉合標籤時,函數同樣可訪問開始標籤的屬性。$content變數值取決於你的函數是被開始標籤調用還是被閉合標籤調用。假如是開始標籤,則變數值將為NULL,如果是閉合標籤,則$content變數值為模板塊的內容。請注意這時模板塊已經被Smarty處理過,因此你所接收到的是模板的輸出而不是模板資源。&$repeat參數通過引用傳遞給函數執行,並為其提供控制塊顯示多少次的可能性。在預設情況下,在首次調用塊函數(塊開始標籤)時&$repeat變數為true,在隨後的所有塊函數(閉合標籤)調用中其值始終為false。函數每次執行返回的&$repeat值為true時,{func} .. {/func}之間的內容會被求值,同時參數$content裡的新塊內容會再次調用執行函數(運行方法有點類似於遞迴函式)。如果你嵌套了塊函數,可以通過$smarty->_tag_stack變數訪問找出父塊函數。
//函數中的$params代表標籤中傳入的參數的數組;變數 $content 的值取決於是否因開始標記或結束標
//記或結束標記調用你的函數。假如是開始標記,它會是空的,如果是結束標記,它會是模板塊的內容。
//參數 &$repeat 通過參考引用傳遞給函數執行過程並為其提供一個可能值來控制顯示塊多少遍。預設情況下
//首次調用塊函數(塊開始標記)時變數 $repeat 是真,在隨後的所有塊函數調用中其始終是假。每當函數執行
//返回的 &$repeat 是真時,在{func} .. {/func}之間的內容再次求值,函數執行接收一個新塊參數 $content
//內容值被再次調用。
function smarty_block_products($params, $content, &$smarty, &$repeat) {
global $db, $config;
//僅僅是擷取一個和當前block相對應的值而已
$l = count($smarty->_tag_stack);
//指派變數名
if(empty($params[‘name‘])) $params[‘name‘] = "products";
//判斷是否是第一次運行(前半部標籤),如果這個變數存在了,那麼說明資料已經被註冊進$smarty->blocvars[$l]裡面了
//其中$smarty->blockvars是自訂的變數,smarty本身沒有該屬性,在smarty上面註冊該變數的好處是, smarty每次都會預設以引用的方式進行傳遞,當然,如果你樂意,也可以使用$GLOBALS[‘blockvars‘][$l]
//
if(empty($smarty->blockvars[$l])) {
/*
sql process
*/
$smarty->blockvars[$l] = $db->get_results($sql);
//如果沒有資料,那就不用再執行了(repeat)
if(!$smarty->blockvars[$l]) return $repeat = false;
if(!empty($params[‘pager‘])) $smarty->assign($params[‘pager‘], $pager);
}
//利用each的特點,逐一遍曆$smarty->blockvars[$l]子項目
if(list($key, $item) = each($smarty->blockvars[$l])) {
$repeat = true;
//重要的,指派變數,以供結束標籤顯示(下一次調用)
$smarty->assign($params[‘name‘], $item);
}
else {
$repeat = false;
//清除each產生的指標記錄,不解
reset($smarty->blockvars[$l]);
}
//print 這裡的$content其實是在上一次的運行中解析過(已經插入資料的最終結果)的$content,直接列印即可
if(!is_null($content)) print $content;
//迴圈結束時,清理變數
if(!$repeat) $smarty->blockvars[$l] = array();
}