如何在smarty中增加類(lèi)似foreach的功能自動(dòng)加載數(shù)據(jù)
更新時(shí)間:2013年06月26日 09:55:27 作者:
本篇文章是對(duì)在smarty中增加類(lèi)似foreach的功能自動(dòng)加載數(shù)據(jù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
在smarty中使用自定義插件來(lái)加載數(shù)據(jù)(見(jiàn):編寫(xiě)Smarty插件在模板中直接加載數(shù)據(jù)的詳細(xì)介紹),在使用的時(shí)候還是感覺(jué)不夠方便,靈機(jī)一動(dòng)就想寫(xiě)成類(lèi)似foreach那種標(biāo)簽:
第一步:在Smarty_Compiler.class.php的_compile_tag函數(shù)中增加:
//加載數(shù)據(jù)的開(kāi)始標(biāo)簽
case 'load':
$this->_push_tag('load');
return $this->_complie_load_start($tag_args);
break;
//加載數(shù)據(jù)的結(jié)束標(biāo)簽
case '/load':
$this->_pop_tag('load');
return "<?php endforeach; endif; unset(/$_from); ?>";
break;
第二步:增加一個(gè)方法:
/**
* 加載數(shù)據(jù)
* @param $tag_args
*/
function _complie_load_start($tag_args)
{
$key = substr(md5($tag_args), 8, 16); //根據(jù)參數(shù)生成一個(gè)特殊的變量名
$attrs = $this->_parse_attrs($tag_args);
//這里可以增加更多的處理
$class = (!isset($attrs['class']) || empty($attrs['class'])) ? 'cls_crud' : trim($attrs['class']);
(!isset($attrs['table']) || empty($attrs['table'])) && exit('`table` is empty!');
$db = $class::factory(array('table' => substr($attrs['table'], 1, -1)));
//定義新變量
$this->_tpl_vars[$key] = $db->get_block_list(array(substr($attrs['where'], 1, -1)), $attrs['limit']);
$tag_args = "from=/${$key} " . $tag_args;
//調(diào)用foreach標(biāo)簽處理函數(shù)進(jìn)行處理
return $this->_compile_foreach_start($tag_args);
}
這樣就可以在模板中使用load這個(gè)標(biāo)簽了。用法例如:
{load table="test" where="`id`<100" limit=10 item=rec}
...
{/load}
第一步:在Smarty_Compiler.class.php的_compile_tag函數(shù)中增加:
復(fù)制代碼 代碼如下:
//加載數(shù)據(jù)的開(kāi)始標(biāo)簽
case 'load':
$this->_push_tag('load');
return $this->_complie_load_start($tag_args);
break;
//加載數(shù)據(jù)的結(jié)束標(biāo)簽
case '/load':
$this->_pop_tag('load');
return "<?php endforeach; endif; unset(/$_from); ?>";
break;
第二步:增加一個(gè)方法:
復(fù)制代碼 代碼如下:
/**
* 加載數(shù)據(jù)
* @param $tag_args
*/
function _complie_load_start($tag_args)
{
$key = substr(md5($tag_args), 8, 16); //根據(jù)參數(shù)生成一個(gè)特殊的變量名
$attrs = $this->_parse_attrs($tag_args);
//這里可以增加更多的處理
$class = (!isset($attrs['class']) || empty($attrs['class'])) ? 'cls_crud' : trim($attrs['class']);
(!isset($attrs['table']) || empty($attrs['table'])) && exit('`table` is empty!');
$db = $class::factory(array('table' => substr($attrs['table'], 1, -1)));
//定義新變量
$this->_tpl_vars[$key] = $db->get_block_list(array(substr($attrs['where'], 1, -1)), $attrs['limit']);
$tag_args = "from=/${$key} " . $tag_args;
//調(diào)用foreach標(biāo)簽處理函數(shù)進(jìn)行處理
return $this->_compile_foreach_start($tag_args);
}
這樣就可以在模板中使用load這個(gè)標(biāo)簽了。用法例如:
復(fù)制代碼 代碼如下:
{load table="test" where="`id`<100" limit=10 item=rec}
...
{/load}
您可能感興趣的文章:
- php實(shí)現(xiàn)smarty模板無(wú)限極分類(lèi)的方法
- smarty實(shí)現(xiàn)多級(jí)分類(lèi)的方法
- 解析smarty模板中類(lèi)似for的功能實(shí)現(xiàn)
- php smarty 二級(jí)分類(lèi)代碼和模版循環(huán)例子
- 方便實(shí)用的PHP生成靜態(tài)頁(yè)面類(lèi)(非smarty)
- smarty+adodb+部分自定義類(lèi)的php開(kāi)發(fā)模式
- 專(zhuān)為新手寫(xiě)的結(jié)合smarty的類(lèi)
- smarty高級(jí)特性之對(duì)象的使用方法
相關(guān)文章
PHP一致性hash分布式算法封裝類(lèi)定義與用法示例
這篇文章主要介紹了PHP一致性hash分布式算法封裝類(lèi)定義與用法,結(jié)合完整實(shí)例形式分析了一致性hash分布式算法的原理、實(shí)現(xiàn)及使用方法,需要的朋友可以參考下2018-08-08
PHP同時(shí)連接多個(gè)mysql數(shù)據(jù)庫(kù)示例代碼
這篇文章主要介紹了PHP同時(shí)連接多個(gè)mysql數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn),需要的朋友可以參考下2014-03-03
ThinkPHP刪除欄目(實(shí)現(xiàn)批量刪除欄目)
下面小編就為大家?guī)?lái)一篇ThinkPHP刪除欄目(實(shí)現(xiàn)批量刪除欄目)。小編覺(jué)得挺不錯(cuò)的?,F(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
php實(shí)現(xiàn)的簡(jiǎn)單數(shù)據(jù)庫(kù)操作Model類(lèi)
這篇文章主要介紹了php實(shí)現(xiàn)的簡(jiǎn)單數(shù)據(jù)庫(kù)操作Model類(lèi),結(jié)合實(shí)例形式分析了php數(shù)據(jù)庫(kù)操作模型類(lèi)的定義與使用技巧,包括數(shù)據(jù)庫(kù)的基本增刪改查等功能,需要的朋友可以參考下2016-11-11
PHP編程過(guò)程中需要了解的this,self,parent的區(qū)別
this是指向?qū)ο髮?shí)例的一個(gè)指針,在實(shí)例化的時(shí)候來(lái)確定指向;self是對(duì)類(lèi)本身的一個(gè)引用,一般用來(lái)指向類(lèi)中的靜態(tài)變量;parent是對(duì)父類(lèi)的引用,一般使用parent來(lái)調(diào)用父類(lèi)的構(gòu)造函數(shù)。2009-12-12

