Page分页类(一)
2013-12-29 00:24
357 查看
我第一次做的分页类,写了3种样式,就直接定死了,用了一个接口+工厂模式,写的
别的不说,先上代码!
在operation类中将其分页类的属性得到,然后利用3种样式类 page_css1() || page_css2() || page_css3() 来继承,然后通过后面的工厂来选择样式。
总的来说,思路很简单。
当然,我还有很多考虑不周的地方
在这里,我将所有的类的方法都写在这一个文件里,其实很不人性化,一般,在公司里,严格要求的话,要便于识别代码,且能清晰的认识代码,知道其意义
这里做的不是很明确。
在里面的测试部分,就很清晰的知道该文件时怎么操作的。
别的不说,先上代码!
<?php /** * 分页类的实现 * 分页样式的选择 * @author lvmin * */ header('Content-Type:text/html;charset=utf8'); /** * 创建一个接口 interface show_page 代表抽象产品 实现分页类的方法 */ interface show_page { public function display(); } /** * 分页类的操作父类 * * @param $total int 总的数据条数 * @param $page int 当前页码 * @param $per_page int 每页显示条数 * @param $page_rows int 每页显示的页码的个数 */ class operation { protected $total = 0; //数据的总条数 protected $per_page = 3; //每页显示的数据条数 protected $page=1; //当前页 protected $page_rows = 5; //每页显示的页码的个数,即,若是3, //代表页面上显示1,2,3页码,其他页码再用上下页显示出来 protected $url = ''; //链接地址 protected $total_page = 0; //总页数 public function init_page($total,$page=false,$per_page=false,$page_rows=false){ $this->total = intval($total); if($per_page){ $this->per_page = intval($per_page); } if($page){ $this->page = intval($page); } if($page_rows){ $this->page_rows = intval($page_rows); } //总页数 $total_page = ceil($this->total/$this->per_page); //地址栏的参数保存 $uri = $_SERVER['REQUEST_URI']; $parse = parse_url($uri); $param = array(); if(isset($parse['query'])){ parse_str($parse['query'],$param); } //不管有没有都unset掉$param下的page单元,因为page是要算出来的 unset($param['page']); //这么是为了将param中的page去掉 $url = $parse['path'] . '?'; if(!empty($param)){ $param = http_build_query($param);//得到去掉page的参数 $url = $url . $param . '&';//得到完整路径 } $this->total_page = $total_page; $this->url = $url; } } /** * 第一个样式 * 样式: [首页][上一页][1][2]3[4][5][下一页][末页] */ class page_css1 extends operation implements show_page { public function display(){ $nav = array(); $nav[] = "<span>" . $this->page . '</span>'; for($left = $this->page-1,$right = $this->page+1;($left>=1||$right<=$this->total_page) && count($nav)<$this->page_rows;){ if($left>=1){ array_unshift($nav,'<a href="' . $this->url . 'page=' .$left . '">[' . $left . ']</a>'); $left-=1; } if($right<=$this->total_page){ array_push($nav, '<a href="' . $this->url . 'page=' . $right . '">[' . $right . ']</a>'); $right+=1; } } $pageprev = ($this->page-1>=1)? ($this->page-1):1; $pagenext = ($this->page+1<=$this->total_page)? ($this->page+1):$this->total_page; array_unshift($nav,'<a href="' . $this->url . 'page='. $pageprev .'">[上一页]</a>'); array_unshift($nav,'<a href="' . $this->url . 'page=1">[首页]</a>'); array_push($nav, '<a href="' . $this->url . 'page=' . $pagenext . '">[下一页]</a>'); array_push($nav, '<a href="' . $this->url . 'page=' . $this->total_page . '">[末页]</a>'); //var_dump($nav); return implode('', $nav); } } /** * 第二个样式 * 样式: << < 1 2 3 4 5 > >> */ class page_css2 extends operation implements show_page { public function display(){ $nav = array(); $nav[] = "<span style='font-weight:bold;'><strong>" . $this->page . '</strong></span>'; for($left = $this->page-1,$right = $this->page+1;($left>=1||$right<=$this->total_page) && count($nav)<$this->page_rows;){ if($left>=1){ array_unshift($nav,'<a href="' . $this->url . 'page=' .$left . '">' . " " . $left . " " . '</a>'); $left-=1; } if($right<=$this->total_page){ array_push($nav, '<a href="' . $this->url . 'page=' . $right . '">' . " " . $right . " " .'</a>'); $right+=1; } } $pageprev = ($this->page-1>=1)? ($this->page-1):1; $pagenext = ($this->page+1<=$this->total_page)? ($this->page+1):$this->total_page; array_unshift($nav,'<a href="' . $this->url . 'page='. $pageprev .'">'. "<" . '</a>'); array_unshift($nav,'<a href="' . $this->url . 'page=1">'. "<<" .'</a>' . " "); array_push($nav, '<a href="' . $this->url . 'page=' . $pagenext . '">'.">".'</a>' . " "); array_push($nav, '<a href="' . $this->url . 'page=' . $this->total_page . '">'. ">>" .'</a>'); //页码列表 $selector=<<<PAGE <select id="pages" onchange="window.location.href='$this->url'+'page='+this.value" > PAGE; //echo $url;var_dump($nav); //循环页码 for($p=1;$p<=$this->total_page;$p++){ if($this->page==$p){ $selector .= <<<PAGE <option value="$p" selected>$p</option> PAGE; }else{ $selector .=<<<PAGE <option value="$p">$p</option> PAGE; } } $selector .='</select>'; //array_push($nav, $selector); return implode('', $nav) . $selector; } } /** * 第三个样式 * 样式: 总计20记录, 分为7页, 当前第1页, 每页3条记录.首页 上一页1 2 3 4 5 下一页 尾页 */ class page_css3 extends operation implements show_page { public function display(){ $info = <<<PAGE 总计<span id="total">$this->total</span>记录, 分为<span id="">$this->total_page</span>页, 当前第<span id="">$this->page</span>页, 每页<span id="">$this->per_page</span>条记录 PAGE; $nav = array(); $nav[] = "<span style='color:#f00;'><strong>" . $this->page . '</strong></span>'; for($left = $this->page-1,$right = $this->page+1;($left>=1||$right<=$this->total_page) && count($nav)<$this->page_rows;){ if($left>=1){ array_unshift($nav,'<a href="' . $this->url . 'page=' .$left . '">' . " " . $left . " " . '</a>'); $left-=1; } if($right<=$this->total_page){ array_push($nav, '<a href="' . $this->url . 'page=' . $right . '">' . " " . $right . " " .'</a>'); $right+=1; } } $pageprev = ($this->page-1>=1)? ($this->page-1):1; $pagenext = ($this->page+1<=$this->total_page)? ($this->page+1):$this->total_page; array_unshift($nav,'<a href="' . $this->url . 'page='. $pageprev .'">上一页</a>'); array_unshift($nav,'<a href="' . $this->url . 'page=1">首页</a>' . " "); array_push($nav, '<a href="' . $this->url . 'page=' . $pagenext . '">下一页</a>' . " "); array_push($nav, '<a href="' . $this->url . 'page=' . $this->total_page . '">尾页</a>'); array_unshift($nav, "$info"); $jump = " 跳到<input type='text' name='jump' max_page=" .$this->total_page . " style='width:30px;height:20px;'>页 <input type='button' value='确定' id='jump_sure' style='width:40px;height:23px;' onclick='jump();'>"; return implode('', $nav) . $jump; } } /** * 创建分页类的工厂 * @param $type 表示分页样式 输入1,2,3 * return $obj 分页类的实例对象 */ class page_factory { private static $obj; public static function operation_page($type){ try{ $error = "Please input the number between 1 and 3 carefully"; switch($type){ case '1': self::$obj = new page_css1(); break; case '2': self::$obj = new page_css2(); break; case '3': self::$obj = new page_css3(); break; default: throw new Exception($error); } return self::$obj; }catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; exit; } } } //测试 $obj = page_factory::operation_page('3'); $page = isset($_GET['page'])?$_GET['page']:1; $obj->init_page(200,$page,10,6); echo $obj->display(); ?> <style type="text/css"> a{ text-decoration: none; } </style> <script type="text/javascript"> function jump(){ var jump_page_num = parseInt(document.getElementsByName('jump')[0].value); var max_page = parseInt(document.getElementsByName('jump')[0].getAttribute('max_page')); if(jump_page_num >= max_page){ jump_page_num = max_page; } console.log(jump_page_num); url= window.location.href; var page_index = url.lastIndexOf('page'); if(page_index == -1){ window.location.href = url + '&page=' + jump_page_num; } window.location.href = url.replace(/page=[1-9][0-9]*/,'page='+jump_page_num); } </script>
在operation类中将其分页类的属性得到,然后利用3种样式类 page_css1() || page_css2() || page_css3() 来继承,然后通过后面的工厂来选择样式。
总的来说,思路很简单。
当然,我还有很多考虑不周的地方
在这里,我将所有的类的方法都写在这一个文件里,其实很不人性化,一般,在公司里,严格要求的话,要便于识别代码,且能清晰的认识代码,知道其意义
这里做的不是很明确。
在里面的测试部分,就很清晰的知道该文件时怎么操作的。
相关文章推荐
- 【LeetCode】Single Number II
- 数据模板--DataTemplate
- 【UML 建模】UML建模语言入门 -- 静态图详解 类图 对象图 包图 静态图建模实战
- servlet 提高性能记录
- 磁盘管理之五
- Java实现可乐瓶问题
- memcached操作分类
- cocos2d-x游戏开发系列教程-中国象棋05-开始游戏
- cocos2d-x游戏开发系列教程-中国象棋05-开始游戏
- android之自定义适配器实现ListView
- 平摊分均
- Python: dist-packages和site-packages的区别
- poj2752Seek the Name, Seek the Fame(kmp简单变形,next数组)
- windows下查看进程和端口
- 解决安装pymongo报错 ImportError: cannot import name MongoClient
- TC SRM601
- cocos2dx 触摸测试二 多点包含单点
- 2013年终总结----人生的一个小转折
- C++ memset memcpy 等价于 C# Array.Clear Array.Copy
- 各种排序算法的实现-4(表插入排序-1)