【PHP】ページナビゲーションのサンプルコード

1.クラスファイル pagenavi.php

<?php
/**
* ページクラス
* ===> $this->styleDir/$this->styleName/style.css
* ===> $this->styleDir/$this->styleName/style.php
* ===> $this->styleDir/$this->styleName/container.php
*
* //サンプル
* $page = new Pagination(Article::getItemNum(),20,intval($_GET['pageid’]));
* //データの設定
* $page->setSourceCall('Article::getPagin’,array('id,title,des,time’));
* //ページ区切りスタイルの設定
* $page->setTemplate('default’);
* //ページングデータ
* $page->makePagination('http://www.domain.com/startnews24/showlist/’);
* View::assign('pagination’,$page->pagin);
* View::assign('pagStyle’,$page->geStyleUrl(WIDGET_URL));
* View::assign('artlist’,$page->data);
* View::assign('cpageid’,$page->currentPageId);
* View::assign('pageNum’,$page->pageNums);
*
*/
class Pagination{
//————各種のパラメータ
//現在のページID
var $currentPageId = 1;
//現在のレコード総数
var $itemNums = 0;
//ページサイズ
var $pageSize = 10;
//現在のページ合計数
var $pageNums = 1;
//————スタイルパラメータ
//ページネーションクラスのスタイルディレクトリ
var $styleDir = “pagination/";
//現在のページスタイル名
var $styleName = 'default’;
//ページングコンテナ
protected $container = array(
'page’=>'<div class="pagination">%s</div>’,
'jump’=>'<select class="span1″ onchange="location.href=this.options[this.selectedIndex].value">%s</select>’,
);
//————-パラメータ表示
//ページの要素数
var $length = 7;
//urlアドレス
protected $commonurl = ";
//パラメータの表示テーブル
protected $param = array();
//要素表示( -> _makeFirst,…)
protected $show = array(
'First’=>’first_last’,//最初ページ
'Prev’=>’prev’,//前のページ
'PrevNum’=>’link’,
'Current’=>’current’,//現在のページ
'NextNum’=>’link’,
'Next’=>’next’,//次のページ
'Last’=>’first_last’,//最終ページ
'Jump’=>’jump’,
);
//デフォルトのテンプレート
protected $defaultTemplate = array(
'first_last’=>'<a href="%s%s" title="%s">%s</a>’,
'prev’=>'<a href="%s%s" title="%s" class="prev">%s</a>’,
'next’=>'<a href="%s%s" title="%s" class="next">%s</a>’,
'link’=>'<a href="%s%s" title="%s" >%s</a>’,
'current’=>'<span title="%s" class="current">%s</span>’,
'jump’=>'<option value="%s" %s>%s</option>’,
);
//—————-データ処理
//ページidパラメータ
var $varPageid= 'pageid’;
//現在のページのデータ
var $data = array();
var $pagin = ";

/**
* コンストラクタ
* @param integer $total レコードの総数
* @param integer $size ページサイズ
* @param integer $pageid 現在ページid
* @param array $param フロントの追加パラメータ
*/
public function __construct($total=0,$size=1,$pageid=1,$param=array()){
//レコードの総数
$this->itemNums = $total;
//ページサイズ
$this->pageSize = $size;
//ページ数
$this->pageNums = ceil($total/$size);
//現在ページのid
$this->currentPageId = min(max(1,$pageid),$this->pageNums);
//追加パラメータ
$this->param = $param;
}
public function setTemplateDir($dir=’pagination’){
$this->styleDir = $dir;
}
public function setTemplate($name=’default’){
$this->styleName = $name;
}
public function addParam($key,$value){
$this->param[$key]=$value;
}
public function setParam($key,$value){
if(isset($this->param[$key])){
$this->param[$key]=$value;
}
}
public function setSource($array,$attr=’data’){
$this->$attr = $array;
}
/**
* データコールバック関数を設定し、データを設定
*
* $callback = 'class::method’ => class::method($param[0],$param[1],…)
* $callback = 'func’ => func($param[0],$param[1],…)
* $callback = array($instance,’method’) => $instance->method($param[0],$param[1],…)
*
* //コールバック関数は最初の引数は$startOffetを設定
* //コールバック関数は2番目の引数は$$pagesizeを設定
*
* //=>>limit $startOffet,$pagesize
*
* // ===> sql= sql . limit $param[0],$param[1]
*
* @param string/array $callback 回调
* @param array $param コールバック関数の追加パラメータ7
* @param string attr プロパティ値を設定
* @param int $cover 1合併,2値をリセット
* @param string $delimiter 区切り文字
*/
public function setSourceCall($callback,$param=array(),$attr=’data’,$cover=1,$delimiter=’::’){
//
if(!isset($this->$attr)){
$this->$attr = array();
}

array_unshift($param,(max(($this->currentPageId-1),0))*$this->pageSize,$this->pageSize);
if(is_string($callback))//支持func,class::method
$call = explode($delimiter,$callback);
else if(is_array($callback))//支持array(func),array(instance,method)
$call = $callback;
switch (count($call)) {
case 1:
$data = call_user_func_array($call[0],$param);
break;
case 2:
default:
$data = call_user_func_array(array($call[0],$call[1]),$param);
break;
}
//注意:arrayを変換
if($cover==1)$this->$attr=array_merge((array)$this->$attr,(array)$data);
else
$this->$attr=$data;
}
/**
* @param string $baseurl
* @param string $callback URLを作成するために使用されるコールバック関数
*/
function makePagination($baseurl=",$callback="){
self::_makeBsaeUrl($baseurl,$callback);
self::_makePaginationData();
return $this->pagin;
}
//ページングデータ処理
protected function _makePaginationData(){
$templates = $this->getTemplate();
foreach ($this->show as $item => $value) {
$method = '_make’.$item;
$pageData[$item] = self::$method($templates[$value]);
}

$this->container = $this->getContainer();
$this->pagin = sprintf($this->container['page’],implode(",$pageData));
}
/**
* 基本的なURLを生成
* @param string $baseurl url
* @param string $callback URLを生成するために使用されるコールバック関数
* @return string
*/
protected function _makeBsaeUrl($baseurl,$callback="){
if(!empty($callback)&&is_callable($callback)){
$param = array_push($this->param,$this->varPageid);
$this->commonurl = call_user_func_array($callback,array($baseurl,$param));
}else{

$this->commonurl = sprintf(“%s",$baseurl.http_build_query($this->param));

$this->commonurl .= “&".$this->varPageid."=";
}
return $this->commonurl;
}
//最初ページ
protected function _makeFirst($tempalte){
$args = func_get_args();
array_push($args,$this->commonurl,1,’最初’,’最初’);
return call_user_func_array('sprintf’,$args);
}
//前のページ
protected function _makePrev($tempalte){
$args=func_get_args();
array_push($args,$this->commonurl,max(1,$this->currentPageId-1),’前のページ’,’前のページ’);
return call_user_func_array('sprintf’,$args);
}
//いくつ前のページ
protected function _makePrevNum($tempalte){
$prevNum = $params = array();
$num = floor($this->length/2);
for($i=1;$i<=$num;$i++){
$value = $this->currentPageId-$i;
if($value<=0||$value>$this->currentPageId){
break;
}
array_unshift($params,$this->commonurl,$value,’第’.$value.’ページ’,$value);
array_unshift($prevNum,$tempalte);
}
array_unshift($params,implode(",$prevNum));
return call_user_func_array('sprintf’,$params);
}
//現在のページ
protected function _makeCurrent($tempalte){
$args = func_get_args();
array_push($args,’第’.$this->currentPageId.’ページ’,$this->currentPageId);
return call_user_func_array('sprintf’,$args);
}
//いくつ次のページ
protected function _makeNextNum($tempalte){
$nextNum = $params = array();
$num = floor($this->length/2);
for($i=1;$i<=$num;$i++){
$value = $this->currentPageId+$i;
if($value>$this->pageNums){break;}
array_push($params,$this->commonurl,$value,’第’.$value.’ページ’,$value);
array_push($nextNum,$tempalte);
}
array_unshift($params,implode(",$nextNum));
return call_user_func_array('sprintf’,$params);
}
//次のページ
protected function _makeNext($tempalte){
$args=func_get_args();
array_push($args,$this->commonurl,min($this->currentPageId+1,$this->pageNums),’次のページ’,’次のページ’);
return call_user_func_array('sprintf’,$args);
}
//最終のページ
protected function _makeLast($tempalte){
$args=func_get_args();
array_push($args,$this->commonurl,$this->pageNums,’最終のページ’,’最終のページ’);
return call_user_func_array('sprintf’,$args);
}
//リダイレクト
protected function _makeJump($tempalte){
$jump = $params = array();
for($i = 1; $i <= $this->pageNums; $i++){
if($this->currentPageId == $i) $selected = " selected";
else $selected = “";
array_push($params,$this->commonurl.$i,$selected,$i);
array_push($jump,$tempalte);
}
array_unshift($params,implode(",$jump));
return sprintf($this->container['jump’],call_user_func_array('sprintf’,$params));
}
//スタイルテンプレートを取得
function getTemplate($name=’style.php’){
$filename = $this->styleDir.’/’.$this->styleName.’/’.$name;
if(file_exists($filename)){
$style = include_once($filename);
}else{
$style = $this->defaultTemplate;
}
return $style;
}
//コンテナのテンプレートを取得
function getContainer($name=’container.php’){
$filename = $this->styleDir.’/’.$this->styleName.’/’.$name;
if(file_exists($filename)){
$style = include_once($filename);
}else{
$style = $this->container;
}
return $style;
}
//スタイルURLを返す
function geStyleUrl($styleUrl,$name=’style.css’){
return $styleUrl.$this->styleName.’/’.$name;
}
}

2.コールバック関数のサンプル
ファイル名:callbacksample.php

class Article extends ActiveModel{
//ページネーションクラスのコールバック関数
//インデックスレコードを返す
public static function getPagin($start=0,$size=1,$fileds=’id’,$order=’id DESC’){
$objlist=Article::find('all’,
array(
'select’ => $fileds,
'order’ => $order,
'offset’=>$start,
'limit’=>$size
));
return self::conv2arr($objlist);
}
}

Source

Posted by arkgame