protected function read_all ($dir){
// 確保目錄有權限進入
if(!is_dir($dir)) return false;
$handle = opendir($dir);
if($handle){
while(($fl = readdir($handle)) !== false){ // 從目錄句柄中讀取條目
// 處理成絕對路徑
$temp = $dir.DIRECTORY_SEPARATOR.$fl;
// 判斷是目錄還是文件,並去除 . 和 ..
if(is_dir($temp) && $fl!='.' && $fl != '..'){
$data[] = [
'type' => 'folder',
'name' => $temp,
'only_name' => $fl,
'update_time' => date("Y-m-d H:i:s",filemtime($temp))
];
}else{
if($fl!='.' && $fl != '..'){
$data[] = [
'type' => 'file',
'name' => $temp,
'only_name' => $fl,
'update_time' => date("Y-m-d H:i:s",filemtime($temp))
];
}
}
}
}
// 得到目錄文件和文件夾數據,並返回
return $data;
}
分頁實現,每次都讀取全部數據,根據頁數,截取部分展示。
public function index(){
// 獲取目標路徑所有文件夾及其文件數據
$root_path = C('DEFAULT_PATH');
$target_path = $_GET['target_path'] ? $_GET['target_path'] : $root_path;
if(strpos($target_path,$root_path) !== 0){
$target_path = $root_path;
}
$relative_path = str_replace($root_path,"",$target_path);
$this->assign('relative_path',$relative_path);
$this->assign('root_path',$root_path);
$this->assign('target_path',$target_path);
$all_data = $this->read_all($target_path);
// 頁數參數,默認第一頁
$page = $_GET['page'] ? $_GET['page'] : 1;
// 每頁數目
$step = C('PAGE_NORMAL_COUNT');
// 每次獲取起始位置
$start = ($page-1)*$step;
// 獲取數組中當前頁的數據
$page_data = array_slice($all_data,$start,$step);
$this->assign('page_data',$page_data);
// 獲取分頁所需數據,支持傳遞其他條件參數
$page_model = D('Page');
$model_flag = $page_model->arr($all_data,$page,$step,'&target_path='.$target_path);
$this->assign('allPage',$model_flag);
$this->display();
}
下面看看Page具體實現
html部分
<div class="pagination" id="pages" style="float:right;">
<ul>
<li><a href="__ACTION__?page=1{$allPage['prefix_page']}{$allPage.tail}">首頁</a></li>
<li><a href="__ACTION__?page={$allPage['prev_page']}{$allPage['prefix_page']}{$allPage.tail}">上一頁</a></li>
<php> for ($i = $allPage['page_start']; $i <= $allPage['page_end']; $i++) {
if ($i == $allPage['page']) { </php>
<li class="active"> <a href="__ACTION__?page=<php>echo $i;</php>{$allPage['prefix_page']}{$allPage.tail}">
<php> echo $i; </php>
</a> </li>
<php> } else { </php>
<li><a href="__ACTION__?page=<php>echo $i;</php>{$allPage['prefix_page']}{$allPage.tail}">
<php> echo $i; </php>
</a></li>
<?php
}
}
?>
<li><a href="__ACTION__?page={$allPage['next_page']}{$allPage['prefix_page']}{$allPage.tail}">下一頁</a></li>
<li><a href="__ACTION__?page={$allPage['page_all']}{$allPage['prefix_page']}{$allPage.tail}">尾頁</a></li>
</ul>
</div>
分頁數據部分
/**
* 數組分頁
*/
public function arr($arr,$page,$page_step='',$prefix_page='') {
// 第一返回總數目
$data['count'] = count($arr);
$page_step = $page_step ? $page_step : C('PAGE_NORMAL_COUNT');
//第二返回總頁數
$data['page_all']=(int)ceil($data['count']/$page_step);
//第三返回底標的分頁數組
$page_start=$page-2;
if($data['page_all']>5){
if($page_start<=0){
$page_start=1;
$page_end=5;
}else{
$page_end=$page+2;
if($page_end>=$data['page_all']){
$page_end=$data['page_all'];
$page_start=$page_end-4;
}
}
}else{
$page_start=1;
$page_end=$data['page_all'];
}
$data['page_start']=$page_start;
$data['page_end']=$page_end;
//第四返回當前頁
$data['page']=$page;
//第五 返回上一頁和下一頁
$prev_page=$page-1;
if($prev_page<=0){
$prev_page=1;
}
$next_page=$page+1;
if($next_page>=$data['page_all']){
$next_page=$data['page_all'];
}
$data['prev_page']=$prev_page;
$data['next_page']=$next_page;
// 第六返回其他條件參數
$data['prefix_page']=$prefix_page;
return $data;
}
分頁的原理,就是獲取上一頁,下一頁,首頁,尾頁,當前頁,當前頁區間的幾頁數據,並展示,並實現跳轉。並根據傳入的page獲取相應的數據的功能。