您的位置:首页 > 其它

Page分页类(一)

2013-12-29 00:24 357 查看
我第一次做的分页类,写了3种样式,就直接定死了,用了一个接口+工厂模式,写的

别的不说,先上代码!

<?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() 来继承,然后通过后面的工厂来选择样式。

总的来说,思路很简单。

当然,我还有很多考虑不周的地方

在这里,我将所有的类的方法都写在这一个文件里,其实很不人性化,一般,在公司里,严格要求的话,要便于识别代码,且能清晰的认识代码,知道其意义

这里做的不是很明确。

在里面的测试部分,就很清晰的知道该文件时怎么操作的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: