Home  >  Article  >  PHP Framework  >  ThinkPHP6 custom paging

ThinkPHP6 custom paging

Guanhui
Guanhuiforward
2020-05-11 09:54:556805browse

ThinkPHP6.0 predefines the paginate paging class for us to help us quickly paginate. However, the paging style provided by ThinkPHP6 is not what we want. We need to extend the paging class ourselves and see how to implement it!

First we copy an official paging class and modify it on this basis. The specific path is vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php. Then paste it in app/common/Bootstrap.php.

Modify the app/provider.php service provider and modify the default paging driver to be our driver.

<?php
use app\ExceptionHandle;
use app\Request;
// 容器Provider定义文件
return [
    &#39;think\Request&#39;          => Request::class,
    &#39;think\exception\Handle&#39; => ExceptionHandle::class,
    &#39;think\Paginator&#39;    =>    &#39;app\common\Bootstrap&#39;
];

Read the app/common/Bootstrap.php code and modify it based on this. The following is the officially provided paging code vendor/topthink/think-orm/src/paginator/driver/Bootstrap.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2019 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: zhangyajun <448901948@qq.com>
// +----------------------------------------------------------------------
namespace think\paginator\driver;
use think\Paginator;
/**
 * Bootstrap 分页驱动
 */
class Bootstrap extends Paginator
{
    /**
     * 上一页按钮
     * @param string $text
     * @return string
     */
    protected function getPreviousButton(string $text = "&laquo;"): 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 = &#39;&raquo;&#39;): 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 &#39;&#39;;
        }
        $block = [
            &#39;first&#39;  => null,
            &#39;slider&#39; => null,
            &#39;last&#39;   => null,
        ];
        $side   = 3;
        $window = $side * 2;
        if ($this->lastPage < $window + 6) {
            $block[&#39;first&#39;] = $this->getUrlRange(1, $this->lastPage);
        } elseif ($this->currentPage <= $window) {
            $block[&#39;first&#39;] = $this->getUrlRange(1, $window + 2);
            $block[&#39;last&#39;]  = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
        } elseif ($this->currentPage > ($this->lastPage - $window)) {
            $block[&#39;first&#39;] = $this->getUrlRange(1, 2);
            $block[&#39;last&#39;]  = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
        } else {
            $block[&#39;first&#39;]  = $this->getUrlRange(1, 2);
            $block[&#39;slider&#39;] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
            $block[&#39;last&#39;]   = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
        }
        $html = &#39;&#39;;
        if (is_array($block[&#39;first&#39;])) {
            $html .= $this->getUrlLinks($block[&#39;first&#39;]);
        }
        if (is_array($block[&#39;slider&#39;])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block[&#39;slider&#39;]);
        }
        if (is_array($block[&#39;last&#39;])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block[&#39;last&#39;]);
        }
        return $html;
    }
    /**
     * 渲染分页html
     * @return mixed
     */
    public function render()
    {
        if ($this->hasPages()) {
            if ($this->simple) {
                return sprintf(
                    &#39;<ul class="pager">%s %s</ul>&#39;,
                    $this->getPreviousButton(),
                    $this->getNextButton()
                );
            } else {
                return sprintf(
                    &#39;<ul class="pagination">%s %s %s</ul>&#39;,
                    $this->getPreviousButton(),
                    $this->getLinks(),
                    $this->getNextButton()
                );
            }
        }
    }
    /**
     * 生成一个可点击的按钮
     *
     * @param  string $url
     * @param  string $page
     * @return string
     */
    protected function getAvailablePageWrapper(string $url, string $page): string
    {
        return &#39;<li><a href="&#39; . htmlentities($url) . &#39;">&#39; . $page . &#39;</a></li>&#39;;
    }
    /**
     * 生成一个禁用的按钮
     *
     * @param  string $text
     * @return string
     */
    protected function getDisabledTextWrapper(string $text): string
    {
        return &#39;<li class="disabled"><span>&#39; . $text . &#39;</span></li>&#39;;
    }
    /**
     * 生成一个激活的按钮
     *
     * @param  string $text
     * @return string
     */
    protected function getActivePageWrapper(string $text): string
    {
        return &#39;<li class="active"><span>&#39; . $text . &#39;</span></li>&#39;;
    }
    /**
     * 生成省略号按钮
     *
     * @return string
     */
    protected function getDots(): string
    {
        return $this->getDisabledTextWrapper(&#39;...&#39;);
    }
    /**
     * 批量生成页码按钮.
     *
     * @param  array $urls
     * @return string
     */
    protected function getUrlLinks(array $urls): string
    {
        $html = &#39;&#39;;
        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);
    }
}

For example, simply modify the previous page and the next page to Chinese characters, modify the following places.

/**
     * 上一页按钮
     * @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 = &#39;下一页&#39;): string
    {
        if (!$this->hasMore) {
            return $this->getDisabledTextWrapper($text);
        }
        $url = $this->url($this->currentPage() + 1);
        return $this->getPageLinkWrapper($url, $text);
    }

Then modify it according to your business needs!

Recommended tutorials: "PHP Tutorial" "ThinkPHP Tutorial"

The above is the detailed content of ThinkPHP6 custom paging. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:jianshu.com. If there is any infringement, please contact admin@php.cn delete