免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7692 | 回复: 17
打印 上一主题 下一主题

通用最强翻页类,封装PEAR/Pager,带数字页码/跳转框/页大小框 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-04 15:07 |只看该作者 |倒序浏览
网站开发,必先利其器。mysql分页很方便,但是程序如何翻页呢?可能大家都有自己的解决方案,我也把我的方法共享出来,大家一起讨论吧。该myPager类继承自PEAR/Pager类,自动保留提交过来的GET和POST参数,并以url参数传递

  1. <?php
  2. // --------------------------------------------------------------------------
  3. // 文件名 : myPager.class.php
  4. // 描述 : 继承自Pear/Pager/Pager.php,为其加上页码跳转
  5. // 菜单,注意若要自动保留查询参数,则表单数据需要用
  6. // GET方法提交
  7. // 需求 : PHP4 ([url]http://www.php.net[/url])
  8. // Copyright(C), [url]www.cnfdc.com.cn[/url], 2005, All Rights Reserved.
  9. // 作者 : lonestone ([email]wangyong.yichang@gmail.com[/email])
  10. // --------------------------------------------------------------------------
  11. require_once( "Pager/Pager.php" );
  12. class myPager
  13. {
  14.     var $pager;
  15.     var $urlParms;
  16.     var $pagesize;
  17.    
  18.     function myPager( $mode = "Sliding", $perPage = 10, $delta = 5, $totalItems = 0 ,$startPageSize=10,$numlinks=true)
  19.     {
  20.         $params = array( 'mode' => $mode,
  21.             'perPage' => $perPage,
  22.             'delta' => $delta,
  23.             'totalItems' => $totalItems,
  24.             'separator' => "",
  25.             'spacesBeforeSeparator' => 1,
  26.             'spacesAfterSeparator' => 1,
  27.             'altPrev' => '翻到上一页',
  28.             'altNext' => '翻到下一页',
  29.             'altPage' => "翻至该页",
  30.             'altFirst' => "翻到第一页",
  31.             'altLast' => "翻到最后一页",
  32.             'firstPageText' => "首页",
  33.             'lastPageText' => "末页",
  34.             'prevImg' => "上一页",
  35.             'nextImg' => "下一页",
  36.             'firstPagePre' => "",
  37.             'firstPagePost' => "",
  38.             'lastPagePre' => "",
  39.             'lastPagePost' => "",
  40.             'urlVar' => "page",
  41.             'expanded'=>$numlinks,
  42.             );
  43.         $this->pager = Pager::factory( $params );
  44.         $this->urlParms = $this->ParseUrl() ;
  45.         $this->pagesize = $startPageSize;
  46.         return $this->pager;
  47.     }

  48.     function BuildJumpMenu()
  49.     {
  50.         $totalPageNum = $this->pager->numPages();
  51.         $currentPage = $this->pager->getCurrentPageID();
  52.         //echo($currentPage);
  53.         $html = '跳至<select name="page" onchange="window.location.href=\'' . $this->urlParms . 'page=\'+this.value">';
  54.         for( $i = 1;$i <= $totalPageNum;$i++ )
  55.         {
  56.             if ( $currentPage == $i )
  57.             {
  58.                 $html .= '<option selected="selected" value="' . $i . '">' . $i . '</option>';
  59.             }
  60.             else
  61.             {
  62.                 $html .= '<option value="' . $i . '">' . $i . '</option>';
  63.             }
  64.         }
  65.         $html .= '</select>';
  66.         return $html;
  67.     }

  68.     function getLinks()
  69.     {
  70.         $linksArray = $this->pager->getLinks();
  71.         $links = "共" . $this->pager->numItems() . "项" . $this->pager->numPages() . "页&nbsp;" . $linksArray['all'] . '&nbsp;' . $this->BuildJumpMenu() . "&nbsp;" . $this->getPerPageSelectBox();
  72.         return $links;
  73.     }

  74.     function getPerPageSelectBox()
  75.     {
  76.         $html = '每页<select name="pagesize" onchange="window.location.href=\'' . str_replace('&pagesize='.$_GET['pagesize'],'',$this->urlParms) . 'pagesize=\'+this.value">';
  77.         for( $i = 1;$i <= 10;$i++ )
  78.         {
  79.             if ( $_GET['pagesize'] == $i * $this->pagesize )
  80.             {
  81.                 $html .= '<option selected="selected" value="' . $i * $this->pagesize . '">' . $i * $this->pagesize . '</option>';
  82.             }
  83.             else
  84.             {
  85.                 $html .= '<option value="' . $i * $this->pagesize . '">' . $i * $this->pagesize . '</option>';
  86.             }
  87.         }
  88.         $html .= '</select>';
  89.         return $html;
  90.     }

  91.     /**
  92.      * 处理URL参数
  93.      */

  94.     function ParseUrl()
  95.     {
  96.         $querystring = array();
  97.         while ( list($key, $val) = each( $_GET ) )
  98.         {
  99.             if ( strtolower( $key ) != "page" )
  100.             {
  101.                 $querystring[$key] = $val;
  102.             }
  103.         }
  104.         while ( list($key, $val) = each( $_POST ) )
  105.         {
  106.             if ( strtolower( $key ) != "page" )
  107.             {
  108.                 $querystring[$key] = $val;
  109.             }
  110.         }
  111.         //print_r($querystring);
  112.         $queryStr = $this->my_http_build_query( $querystring );
  113.         if ( strlen( $queryStr ) > 0 )
  114.         {
  115.             $queryStr .= "&";
  116.         }
  117.         return basename( $_SERVER['PHP_SELF'] ) . "?" . $queryStr;
  118.     }

  119.     // http_build_query在php5才支持
  120.     function my_http_build_query( $data )
  121.     {
  122.         $str = '';
  123.         foreach( $data as $key => $value )
  124.         {
  125.             foreach( $this->child_str( $value ) as $v )
  126.             {
  127.                 $str .= "$key$v&";
  128.             }
  129.         }
  130.         return substr( $str, 0, strlen( $str )-1 );
  131.     }

  132.     function child_str( $data )
  133.     {
  134.         $str = array();
  135.         if ( is_array( $data ) )
  136.         {
  137.             foreach( $data as $key => $value )
  138.             {
  139.                 foreach( $this->child_str( $value ) as $v )
  140.                 {
  141.                     $str[] = "[$key]$v";
  142.                 }
  143.             }
  144.         }
  145.         else
  146.         {
  147.             // do url encoding here
  148.             $data = str_replace( '&', '%26', '=' . $data );
  149.             $str[] = $data;
  150.         }
  151.         return $str;
  152.     }
  153. };

  154. ?>
复制代码


需要你的php的include_path中有PEAR包的地址。然后开发时候,搜索条件最好采用GET方法提交,这样就可以自动传递参数了。




  1. //参数含义:翻页方式,页大小,显示几个数字链接(实际上为2倍+1个数字),总记录数,是否显示数字按钮
  2. $pager = new myPager("Sliding", $pageSize,0, $totalItem,30,false);
  3. $links = $pager->GetLinks();
复制代码



然后把$links赋值给模板就可以了

实际应用于 http://oldhouse.cnfdc.com.cn/commonlist.php,使用这个类,你就不必考虑参数传递问题了。

[ 本帖最后由 lonestone 于 2007-6-19 15:15 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-06-12 15:22 |只看该作者
居然没人顶,太受打击了!

论坛徽章:
0
3 [报告]
发表于 2007-06-12 16:41 |只看该作者
看上去的确很不错。。。不过最失败之处在于没考虑SEO。。。。option来处理分页。。引擎是不鸟的。。。单纯上下页爬,完全比不上DZ这种普通的分页。。。。

论坛徽章:
0
4 [报告]
发表于 2007-06-13 02:33 |只看该作者
楼主这个也就是个wrapper, 算不上一个子类吧, 还没接触过pear, mark下

原帖由 3227049 于 2007-6-12 16:41 发表
看上去的确很不错。。。不过最失败之处在于没考虑SEO。。。。option来处理分页。。引擎是不鸟的。。。单纯上下页爬,完全比不上DZ这种普通的分页。。。。


楼上的能在详细讲讲么?

论坛徽章:
0
5 [报告]
发表于 2007-06-19 15:16 |只看该作者
建议你用了再说,这个东西可以显示sliding的翻页数字,也可不显示。跳转框是给人用的。第三个参数就是显示数字页码的个数撒

论坛徽章:
0
6 [报告]
发表于 2007-06-20 12:08 |只看该作者
我比较习惯传参数给页面 然后调用smarty之类的插件去实现分页

论坛徽章:
0
7 [报告]
发表于 2007-06-20 14:12 |只看该作者
比较头疼翻页效果的.....楼主的程序中还是能学到不少东西的

论坛徽章:
0
8 [报告]
发表于 2007-06-20 14:18 |只看该作者
如果你的pager能支持prepare page data那就好了?

论坛徽章:
0
9 [报告]
发表于 2007-06-21 13:50 |只看该作者
类只处理数据,表现交给js。这样的才比较好。
另外,要搞搞限制。
http://oldhouse.cnfdc.com.cn/com ... &pagesize=21811
看挂了吧。

论坛徽章:
0
10 [报告]
发表于 2007-06-21 14:32 |只看该作者
原帖由 upandup 于 2007-6-21 13:50 发表
类只处理数据,表现交给js。这样的才比较好。
另外,要搞搞限制。
http://oldhouse.cnfdc.com.cn/com ... &pagesize=21811
看挂了吧。


有趣, 好玩...写分页还真要注意一下.
Fatal error: Out of memory (allocated 594804736) (tried to allocate 4192022 bytes) in C:\xampp\php\pear\adodb\adodb-csvlib.inc.php on line 78
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP