Thinkphp6 自定义分页样式

Posted autofelix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Thinkphp6 自定义分页样式相关的知识,希望对你有一定的参考价值。

〝 古人学问遗无力,少壮功夫老始成 〞

 在学习thinkphp框架时候,对于分页的而言,很多人觉得自带的分页功能经常不适用于自己的网站,主要是因为自带的分页样式跟前端给的分页样式不统一,会很难看,很容易让小白弃坑。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。

目录

一、修改服务提供者文件

二、定义分页类


一、修改服务提供者文件

  • 在 app/provider.php 文件中添加分页提供类
<?php

use app\\ExceptionHandle;
use app\\Request;

// 容器Provider定义文件
return [
    // 其他服务....

    // 分页类服务提供者
    'think\\Paginator' => 'app\\common\\paginator\\Page',
];

二、定义分页类

  • 创建 app/common/paginator/Page.php 文件
  • 并在其中添加以下内容
  • 如果跟自己前端页面的分页样式不一样,就将该文件中的分页标签改成前端的一致即可
  • 不需要自己重新写分页样式的
  • 模板中使用 $page|raw 即可进行分页渲染
<?php

namespace app\\common\\paginator;

use think\\Paginator;

class Page extends Paginator

    /**
     * 上一页按钮
     * @param string $text
     * @return string
     */
    protected function getPreviousButton(string $text = "上一页"): string
    

        if ($this->currentPage() <= 1) 
            return $this->getDisabledTextWrapper($text);
        

        $url = $this->url(
            $this->currentPage() - 1
        );

        return $this->getPageLinkWrapper($url, $text);
    

    /**
     * 下一页按钮
     * @param string $text
     * @return string
     */
    protected function getNextButton(string $text = '下一页'): string
    
        if (!$this->hasMore) 
            return $this->getDisabledTextWrapper($text);
        

        $url = $this->url($this->currentPage() + 1);

        return $this->getPageLinkWrapper($url, $text);
    

    /**
     * 页码按钮
     * @return string
     */
    protected function getLinks(): string
    
        if ($this->simple) 
            return '';
        

        $block = [
            'first' => null,
            'slider' => null,
            'last' => null,
        ];

        $side = 3;
        $window = $side * 2;

        if ($this->lastPage < $window + 6) 
            $block['first'] = $this->getUrlRange(1, $this->lastPage);
         elseif ($this->currentPage <= $window) 
            $block['first'] = $this->getUrlRange(1, $window + 2);
            $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
         elseif ($this->currentPage > ($this->lastPage - $window)) 
            $block['first'] = $this->getUrlRange(1, 2);
            $block['last'] = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
         else 
            $block['first'] = $this->getUrlRange(1, 2);
            $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
            $block['last'] = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
        

        $html = '';

        if (is_array($block['first'])) 
            $html .= $this->getUrlLinks($block['first']);
        

        if (is_array($block['slider'])) 
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['slider']);
        

        if (is_array($block['last'])) 
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['last']);
        

        return $html;
    

    /**
     * 渲染分页html
     * @return mixed
     */
    public function render()
    
        if ($this->hasPages()) 
            if ($this->simple) 
                return sprintf(
                    '<ul class="pager">%s %s</ul>',
                    $this->getPreviousButton(),
                    $this->getNextButton()
                );
             else 
                return sprintf(
                    '<ul class="pagination">%s %s %s</ul>',
                    $this->getPreviousButton(),
                    $this->getLinks(),
                    $this->getNextButton()
                );
            
        
    

    /**
     * 生成一个可点击的按钮
     *
     * @param string $url
     * @param string $page
     * @return string
     */
    protected function getAvailablePageWrapper(string $url, string $page): string
    
        return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>';
    

    /**
     * 生成一个禁用的按钮
     *
     * @param string $text
     * @return string
     */
    protected function getDisabledTextWrapper(string $text): string
    
        return '<li class="disabled"><span>' . $text . '</span></li>';
    

    /**
     * 生成一个激活的按钮
     *
     * @param string $text
     * @return string
     */
    protected function getActivePageWrapper(string $text): string
    
        return '<li class="active"><span>' . $text . '</span></li>';
    

    /**
     * 生成省略号按钮
     *
     * @return string
     */
    protected function getDots(): string
    
        return $this->getDisabledTextWrapper('...');
    

    /**
     * 批量生成页码按钮.
     *
     * @param array $urls
     * @return string
     */
    protected function getUrlLinks(array $urls): string
    
        $html = '';

        foreach ($urls as $page => $url) 
            $html .= $this->getPageLinkWrapper($url, $page);
        

        return $html;
    

    /**
     * 生成普通页码按钮
     *
     * @param string $url
     * @param string $page
     * @return string
     */
    protected function getPageLinkWrapper(string $url, string $page): string
    
        if ($this->currentPage() == $page) 
            return $this->getActivePageWrapper($page);
        

        return $this->getAvailablePageWrapper($url, $page);
    

以上是关于Thinkphp6 自定义分页样式的主要内容,如果未能解决你的问题,请参考以下文章

基于jQuery封装的分页组件(可自定义设置)

关于phpcms模板自定义分页

DataTables - 创建自定义分页样式(加载更多样式)

PHP分页类,支持自定义样式,中间5页

Laravel 自定义分页样式

php 数据分页类,可自定义多个分页样式