分享thinkphp5自定义Bootstrap分页类

标签: 分页
2017-12-20 阅读(601)

分享thinkphp5.0.11的自定义Bootstrap分页类,tp5自带分页类Bootstrap.不能满足我的分页需求。


自带分页:

1、页码导航没有首页和末页

2、自带导航没有总记录数、总页数和当前页。如:共36条记录 当前第1/3页。


thinkphp5框架设计的很好,如果没有合适的,可以于驱动插件的形式自由自定义,只需改配置成自己定义的类就好了。


先看下最终效果:

本站的分页导航就是采用这个类实现的,如需体验请步至任何数量较多的列表页进行体验。

最终实现的tp5与boot导航效果.png

后双箭头:首页(可以自定义)

后单箭头:上一页(可以自定义)

中间数字:页码 (默认)

前单箭头:下一页(可以自定义)

前双箭头:末页(可以自定义)

总页数记录数等 (可以自定义)


第一步

进入:\thinkphp\library\think\paginator\driver

重写:Bootstrap.php类

新建:MyBootstrap.php文件

<?php
namespace think\paginator\driver;

/**
 * 自定义Bootstrap分页
 * @author weizhixi.com
 */
class MyBootstrap extends Bootstrap{

    /**
     * 首页
     * @param string $text 自定义显示文字
     * @return string
     */
    protected function getFirstButton($text = "&laquo;"){
        if ($this->currentPage() <= 1) {
            return $this->getDisabledTextWrapper($text);
        }
        $url = $this->url(1);
        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * 末页
     * @param string $text 自定义显示文字
     * @return string
     */
    protected function getLastButton($text = "&raquo;"){
        if (!$this->hasMore) {
            return $this->getDisabledTextWrapper($text);
        }
        $url = $this->url($this->lastPage());
        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * 渲染分页html
     * @return mixed
     */
    public function render(){
        if ($this->hasPages()) {
            if ($this->simple) {
                return sprintf(
                    '<ul class="pager">%s %s %s %s</ul>',
                    $this->getFirstButton("&laquo;"),
                    $this->getPreviousButton("&lsaquo;"),
                    $this->getNextButton("&rsaquo;"),
                    $this->getLastButton("&raquo;")
                );
            } else {
                return sprintf(
                    '<ul class="pagination">%s %s %s %s %s</ul><p>共%s条记录&nbsp;当前第%s/%s页</p>',
                    $this->getFirstButton("&laquo;"),
                    $this->getPreviousButton("&lsaquo;"),
                    $this->getLinks(),
                    $this->getNextButton("&rsaquo;"),
                    $this->getLastButton("&raquo;"),
                    $this->total(),
                    $this->currentPage(),
                    $this->lastPage()
                );
            }
        }else{
            if ($this->simple) {

            } else {
                return sprintf(
                    '<p>共%s条记录&nbsp;当前第%s/%s页</p>',
                    $this->total(),
                    $this->currentPage(),
                    $this->lastPage()
                );
            }
        }
    }

    public function toArray(){
        try {
            $total = $this->total();
        } catch (\DomainException $e) {
            $total = null;
        }
        return [
            'total'        => $total,
            'last_page'    => $this->lastPage(),
            'per_page'     => $this->listRows(),
            'current_page' => $this->currentPage(),
            'data'         => $this->items->toArray(),
            'render'       => $this->render()
        ];
    }

}


这里只要重写了:

getFirstButton() 自定义首页按钮

getLastButton() 自定义末页按钮

render() 渲染html

toArray() 这里我只是为了转json还有页码样式render。不用可删掉。


第二步

修改配置Config.php

//分页配置
'paginate'               => [
    'type'      => 'MyBootstrap',
    'var_page'  => 'page',
    'list_rows' => 15,
],

至此,配置完成。


如果自定义放于放于自己的项目里边,例如放在:application/common/util 下话。

那么配置改为:

//分页配置
'paginate'               => [
    'type'      => 'app\common\util\MyBootstrap',
    'var_page'  => 'page',
    'list_rows' => 15,
],

也是一样的,在你喜欢。注意命名空间。


为什么可以这样,看源码片段:

\thinkphp\library\think\db\Query.php

...

/** @var Paginator $class */
$class = false !== strpos($config['type'], '\\') ? $config['type'] : '\\think\\paginator\\driver\\' . ucwords($config['type']);
$page  = isset($config['page']) ? (int) $config['page'] : call_user_func([
    $class,
    'getCurrentPage',
], $config['var_page']);

...

可以看到type可以定义路径,无配置路径,就去driver找。



原创文章,转载请注明出处:https://www.weizhixi.com/user/index/article/id/37.html

分类:
点击(687) 阅读(601) 举报