PHP學習:Smarty的分頁實現(xiàn)
2024-05-04 23:04:22
供稿:網(wǎng)友
smarty中的分頁有很多方法。
1。使用smarty的分頁插件,如pager,pagnition,sliding_page等,不過感覺都不是太好,幾乎都有一些bug。
有興趣試用和自己去改進的朋友可以看看:
http://smarty.php.net/contribs/plugins/view.php/function.pager.php
http://www.phpinsider.com/smarty-forum/viewtopic.php?t=2327
http://www.phpinsider.com/smarty-forum/viewtopic.php?t=1604
2。使用分頁類庫,呵呵,這個網(wǎng)上就太多了,一大把,不過我還沒有發(fā)現(xiàn)寫得很好的,特別是容易擴展的。
在搜索的時候還看到一個號稱分頁類終結(jié)者的,哈哈,有點好笑。分頁類中把sql都包含進去了,這個是絕對不能容忍的,可以說作者對oo的認識還比較淺。
不過分頁類庫不一定適合smarty,特別是當記錄集數(shù)據(jù)是二維數(shù)組時,我不想放棄smarty方便的section。這是我沒有用pear::pager的原因,否則還要先對數(shù)組進行處理,也很麻煩。
3。自己寫啦。。我暫時沒有選擇寫成類庫,不過改寫很容易,下面主要講講思路。
其實smarty的分頁非常簡單,首先我們可以在模板中這樣實現(xiàn):
{$pager_links}
{section name="list" loop=$productid start=0 max=$pager_total step=1}
{if ($smarty.section.list.index >= $pager_startnum )&& ($smarty.section.list.index <= $pager_endnum )}
產(chǎn)品名稱:{$productname[list]}
產(chǎn)品類別:{$catalogname[list]}
{/if}
{/section}
以上就可以將一個記錄集(二維數(shù)組)輕松地打印出來,而且限定每頁的顯示范圍。
{$pager_links} 分頁標簽(就是上一頁,下一頁等)
max=$pager_total 記錄總數(shù)
$smarty.section.list.index >= $pager_startnum )&& ($smarty.section.list.index <= $pager_endnum )
這一行是用來限定記錄的顯示范圍的,如果記錄的索引落在這個范圍之內(nèi)就顯示出來,否則就不顯示。
以上可以看出,在php文件中,我們只需要傳遞4個變量給smarty對象:
1.記錄總數(shù)
2.每頁記錄起始數(shù)
3.每頁記錄結(jié)束數(shù)
4.分頁標簽
以下代碼代參考:
標簽可以自己去寫了,可以擴充成更強大的。現(xiàn)在我沒有時間,不然會寫一個
<?php
$smartyarr = $smarty->get_template_vars();
//記錄總數(shù),每頁顯示記錄條數(shù),總頁數(shù)
$pager_total = count($smartyarr['productid']);
$pager_size = 10;
$pager_number = ceil($pager_total/$pager_size);
$pager_url = "index.php?action=view";
//當前頁的頁數(shù),從request獲得
if(isset($_get['pager_pageid'])&& !empty($_get['pager_pageid'])){
$pager_pageid = intval($_get['pager_pageid']);
}else{
//第一次訪問
$pager_pageid = 1;
}
//每頁的起,始記錄數(shù)
if ($pager_pageid == 1 ) {
$pager_startnum = 0;
} else {
$pager_startnum = ($pager_pageid -1) * $pager_size;
}
$pager_endnum = $pager_startnum + $pager_size;
if ($pager_pageid == 1 && $pager_number>1) {
//第一頁
$pager_links = "上一頁 | <a href=".$pager_url."&pager_pageid=".($pager_pageid+1).">下一頁</a>";
} elseif($pager_pageid == $pager_number && $pager_number>1) {
//最后一頁
$pager_links = "<a href=".$pager_url."&pager_pageid=".($pager_pageid-1).">上一頁</a> | 下一頁";
} elseif ($pager_pageid > 1 && $pager_pageid <= $pager_number) {
//中間
$pager_links = "<a href=".$pager_url."&pager_pageid=".($pager_pageid-1).">上一頁</a> | <a href=".$pager_url."&pager_pageid=".($pager_pageid+1).">下一頁</a>";
} else {
$pager_links = "上一頁 | 下一頁";
}
$smarty->assign('pager_total',$pager_total);
$smarty->assign('pager_startnum',$pager_startnum);
$smarty->assign('pager_endnum',$pager_endnum);
$smarty->assign('pager_links',$pager_links);
return $smarty->fetch ("list.tpl");
?>