webman分頁要安裝分頁組件,很方便了。但每次用的時(shí)候都要實(shí)例化Paginator,還要去修改分頁器的樣式(默認(rèn)Bootstrap)。但還是總覺得有點(diǎn)麻煩。
1、視圖使用think-template
composer require topthink/think-template
2、修改配置config/view.php為
<?php
use support\view\ThinkPHP;
return [
'handler' => ThinkPHP::class,
'options' => [
'view_suffix' => 'html',
'tpl_begin' => '{',
'tpl_end' => '}',
// 擴(kuò)展模板標(biāo)簽庫
'taglib_pre_load' => 'your taglib directory',
]
];
3、新建一個(gè)標(biāo)簽擴(kuò)展
<?php
declare(strict_types=1);
namespace platform\extend\taglib;
use think\template\TagLib;
class Tag extends TagLib
{
/**
* 定義標(biāo)簽列表
*/
protected $tags = [
'paginator' => ['close' => 0, 'expression' => true],
];
/**
* 分頁標(biāo)簽
*/
protected function tagPaginator(array $tag): string
{
$parse_str = '<?php $visiblePages = 5; ?>';
$parse_str .= '<?php $totalPages = ceil($lists->total() / $lists->perPage()); ?>'; // 2
$parse_str .= '<div class="card-footer flex-right">';
$parse_str .= '<p>共 {$lists->total()} 條數(shù)據(jù)</p>';
$parse_str .= '<?php if($totalPages>1): ?>';
$parse_str .= '<ul class="pagination ml-8">';
$parse_str .= '<li class="page-item {$lists->previousPageUrl()?"":"disabled"}"><a href="<?=$lists->previousPageUrl()?>">上一頁</a></li>';
$parse_str .= '<?php if($totalPages>$visiblePages): ?>';
$parse_str .= '<?php $pages = []; ?>';
// 計(jì)算滑動(dòng)范圍,以當(dāng)前頁為中心
$parse_str .= '<?php $numAdjacents = (int)floor((10 - 3) / 2); ?>';
// 確定滑動(dòng)范圍的起始位置
$parse_str .= '<?php if($lists->currentPage() + $numAdjacents > $totalPages): ?>';
$parse_str .= '<?php $slidingStart = $totalPages - 10 + 2; ?>';
$parse_str .= '<?php else: ?>';
$parse_str .= '<?php $slidingStart = $lists->currentPage() - $numAdjacents; ?>';
$parse_str .= '<?php endif;?>';
$parse_str .= '<?php if($slidingStart > 2): ?>';
$parse_str .= '<?php $slidingStart = 2; ?>';
$parse_str .= '<?php endif;?>';
// 計(jì)算滑動(dòng)范圍的結(jié)束位置
$parse_str .= '<?php $slidingEnd = $slidingStart + 10 - 3; ?>';
$parse_str .= '<?php if($slidingEnd >= $totalPages): ?>';
$parse_str .= '<?php $slidingEnd = $totalPages - 1; ?>';
$parse_str .= '<?php endif;?>';
// 構(gòu)建頁碼列表
$parse_str .= '<?php $pages[] = ["num"=>1,"url"=>$lists->url(1)]; ?>';
$parse_str .= '<?php if($slidingStart > 2): ?>';
$parse_str .= '<?php $pages[] = ["num"=>"...","url"=>null]; ?>';
$parse_str .= '<?php endif;?>';
// 沒寫完
// 有BUG
// 寫不來了。????????
$parse_str .= '<?php else: ?>';
$parse_str .= '<?php for($i = 1; $i <= $totalPages; $i++): ?>';
$parse_str .= '<li class="page-item {$lists->currentPage()==$i?"active":""}"><a href="<?=$lists->url($i)?>">{$i}</a></li>';
$parse_str .= '<?php endfor;?>';
$parse_str .= '<?php endif;?>';
$parse_str .= '<li class="page-item <?=$lists->currentPage()==$lists->lastPage()?"disabled":"" ?>"><a data-pjax="" href="<?=$lists->nextPageUrl()?>">下一頁</a></li>';
$parse_str .= '</ul>';
$parse_str .= '<?php endif;?>';
$parse_str .= '</div>';
return $parse_str;
}
}
4、使用:
后端賦值給lists標(biāo)簽就好了
$view['lists'] = UserModel::orderBy('created_at', 'desc')->paginate();
return view('admin/user/index', $view);
前端在需要分頁器的地方插入
{tag:paginator value="lists"/}
總頁數(shù)小于5的時(shí)候直接循環(huán)了,大于5的時(shí)候計(jì)算方法沒有寫完,目前的效果是這樣。
能力有限,路過的大佬們有時(shí)間的話 看看能否擴(kuò)展下 Eloquent 查詢構(gòu)建器。把查詢數(shù)據(jù)寫入緩存加進(jìn)去。
/**
贊