我这个blog所有的PHP代码都是在tp5框架的基础上写的,所以用到的分页也是tp5的

框架自带的分页样式因为不能修改class 有些分页样式就无法渲染到html上,所以只能自己来写分页

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Index extends Controller
{
    public function index()
    {
        $res = Db::table('bk_node')->paginate(2); //2表示每页显示2条数据 $res输出的数据类型对象 并不是数组
        return view('/page',['res' => $res]);
    }   
}
{$res->render()}

QQ截图20190325224335.png

自带的分页并不能直接满足我的需求,因为直接输出的分页不能让我还原原网页的分页样式,所以我选择了使用参数来还原 $res这个对象中包含了实现分页样式的所有参数 有需要的可以直接去var_dump()打印。我只取3个参数打印

总条数{$res->total()}
总页数{$res->lastPage()}
当前页数{$res->currentPage()}

QQ截图20190325224754.png 其实只需要总页数和当前页数这2个参数即可,有了这2个参数就可以在模版中输出想要的样式不在限制于tp5原模版

<ul>
{if $res->currentPage() != 1}
 <li class="prev"><a href="?page={php}echo $res->currentPage()-1<1?$res->currentPage():$res->currentPage()-1{/php}"><</a></li>
{/if}
 <li{if $res->currentPage() == 1} class="page-current"{/if}><a href="?page=1">1</a></li>
{if $res->currentPage()-4 > 1}
 <li><a>…</a></li>
{/if}
{for start="$res->currentPage()-3" end="$res->currentPage()+4"}
  {if $i>0 && $i<=$res->lastPage()}
    {if $i == 1 || $i == $res->lastPage()}
    {else /}
      {if $i==$res->currentPage()}
       <li class="page-current"><a href="?page={$i}">{$i}</a></li>
      {else /}
       <li><a href="?page={$i}">{$i}</a></li>
      {/if}
    {/if}
  {/if}
{/for}
{if $res->currentPage()+5 <= $res->lastPage()}
 <li><a>…</a></li>
{/if}
 <li{if $res->currentPage() == $res->lastPage()} class="page-current"{/if}><a href="?page={$res->lastPage()}">{$res->lastPage()}</a></li>
{if $res->currentPage() != $res->lastPage()}
 <li class="next"><a href="?page={php}echo $res->currentPage()+1>$res->lastPage()?$res->currentPage():$res->currentPage()+1{/php}">></a></li>
{/if} 
</ul> 

QQ截图20190325225416.png

效果如图 虽然和原样式差别不大 但是所有元素的属性值可以由自己来决定并且可以自由调整分页数字的显示样式

如果当前地址栏中还有其他参数 则需要带上page以外的参数 保证在分页跳转页面的时候页面还能继续进行下去

<?php
namespace app\index\controller;
use think\Controller;
use think\Db;

class Index extends Controller
{
    public function index()
    {
        $request = request();// 助手函数 目的是获取所有请求参数 当然也可以使用$_GET代替
        $res = Db::table('bk_node')->paginate(2); //2表示每页显示2条数据 $res输出的数据类型对象 并不是数组
        return view('/page',['res' => $res,'request' => $request,]);
    }   
}

$request->except(['page']) 获取除page以外的所有参数

{php}echo http_build_query($request->except(['page'])){/php} 使用函数将数组转换为链接形式的字符串

<ul>
{if $res->currentPage() != 1}
 <li class="prev"><a href="?page={php}echo $res->currentPage()-1<1?$res->currentPage():$res->currentPage()-1{/php}&{php}echo http_build_query($request->except(['page'])){/php}"><</a></li>
{/if}
 <li{if $res->currentPage() == 1} class="page-current"{/if}><a href="?page=1&{php}echo http_build_query($request->except(['page'])){/php}">1</a></li>
{if $res->currentPage()-4 > 1}
 <li><a>…</a></li>
{/if}
{for start="$res->currentPage()-3" end="$res->currentPage()+4"}
  {if $i>0 && $i<=$res->lastPage()}
    {if $i == 1 || $i == $res->lastPage()}
    {else /}
      {if $i==$res->currentPage()}
       <li class="page-current"><a href="?page={$i}&{php}echo http_build_query($request->except(['page'])){/php}">{$i}</a></li>
      {else /}
       <li><a href="?page={$i}&{php}echo http_build_query($request->except(['page'])){/php}">{$i}</a></li>
      {/if}
    {/if}
  {/if}
{/for}
{if $res->currentPage()+5 <= $res->lastPage()}
 <li><a>…</a></li>
{/if}
 <li{if $res->currentPage() == $res->lastPage()} class="page-current"{/if}><a href="?page={$res->lastPage()}&{php}echo http_build_query($request->except(['page'])){/php}">{$res->lastPage()}</a></li>
{if $res->currentPage() != $res->lastPage()}
 <li class="next"><a href="?page={php}echo $res->currentPage()+1>$res->lastPage()?$res->currentPage():$res->currentPage()+1{/php}&{php}echo http_build_query($request->except(['page'])){/php}">></a></li>
{/if} 
</ul> 

QQ截图20190325230910.png

拼凑参数以后 所有的链接都会显示除page以外的参数 如果做得是搜索分页 就不会出现点击下一页搜索参数失效的问题