• Smarty的分页实现


    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。使用分页类库,呵呵,这个网上就太多了,一大把,不过我还没有发现写得很好的,特别是容易扩展的。
    在搜索的时候还看到一个号称分页类终结者的,哈哈,有点好笑。分页类中把SQL都包含进去了,这个是绝对不能容忍的,可以说作者对OO的认识还比较浅。

    不过分页类库不一定适合Smarty,特别是当记录集数据是二维数组时,我不想放弃Smarty方便的Section。这是我没有用PEAR::Pager的原因,否则还要先对数组进行处理,也很麻烦。

    3。自己写啦。。我暂时没有选择写成类库,不过改写很容易,下面主要讲讲思路。

    其实Smarty的分页非常简单,首先我们可以在模板中这样实现:
    {$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 )}
    产品名称:{$productName[list]} 
    产品类别:{$catalogName[list]}
    {/if}
      {/section}    

    以上就可以将一个记录集(二维数组)轻松地打印出来,而且限定每页的显示范围。
    {$pager_Links} 分页标签(就是上一页,下一页等)
    max=$pager_Total  记录总数
    $smarty.section.list.index >= $pager_StartNum )&& ($smarty.section.list.index <= $pager_EndNum )
    这一行是用来限定记录的显示范围的,如果记录的索引落在这个范围之内就显示出来,否则就不显示。

    以上可以看出,在PHP文件中,我们只需要传递4个变量给Smarty对象:
    1.记录总数
    2.每页记录起始数
    3.每页记录结束数
    4.分页标签

    以下代码代参考:
    标签可以自己去写了,可以扩充成更强大的。现在我没有时间,不然会写一个
    <?php
    $smartyArr = $smarty->get_template_vars();
            
            //记录总数,每页显示记录条数,总页数
            $pager_Total = count($smartyArr['productID']);
            $pager_Size = 10;
            $pager_Number = ceil($pager_Total/$pager_Size);
            $pager_URL = "index.php?action=View";
            
            //当前页的页数,从REQUEST获得
            if(isset($_GET['pager_PageID'])&& !empty($_GET['pager_PageID'])){
                $pager_PageID = intval($_GET['pager_PageID']);
            }else{
                //第一次访问
                $pager_PageID = 1;
            }          

            //每页的起,始记录数
            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");        
    ?>

    转自:https://blog.csdn.net/haohappy2004/article/details/510196

  • 相关阅读:
    Sqlserver 存储过程游标中调用过程,过程中包含游标提示报错
    上位机和下位机的区别是什么
    VS(visual studio)中使用ReportViewer控件和报表设计器 RDLC
    SQLServer异常捕获
    PLC(可编程逻辑控制器)
    Sqlserver中的字符串相加变成NULL
    uniapp动态更改页面标题
    如何设置打印机双面打印?
    WebService相关
    ASP.NET无刷新客户端回调(通过实现ICallbackEventHandler接口)
  • 原文地址:https://www.cnblogs.com/apolloren/p/8952845.html
Copyright © 2020-2023  润新知