分享thinkphp5自定义Bootstrap分页类
阅读(1432)
2017-12-20
分享thinkphp5.0.11的自定义Bootstrap分页类,tp5自带分页类Bootstrap.不能满足我的分页需求。
自带分页:
1、页码导航没有首页和末页
2、自带导航没有总记录数、总页数和当前页。如:共36条记录 当前第1/3页。
thinkphp5框架设计的很好,如果没有合适的,可以于驱动插件的形式自由自定义,只需改配置成自己定义的类就好了。
先看下最终效果:
本站的分页导航就是采用这个类实现的,如需体验请步至任何数量较多的列表页进行体验。
后双箭头:首页(可以自定义)
后单箭头:上一页(可以自定义)
中间数字:页码 (默认)
前单箭头:下一页(可以自定义)
前双箭头:末页(可以自定义)
总页数记录数等 (可以自定义)
第一步
进入:\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 = "«"){ 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 = "»"){ 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("«"), $this->getPreviousButton("‹"), $this->getNextButton("›"), $this->getLastButton("»") ); } else { return sprintf( '<ul class="pagination">%s %s %s %s %s</ul><p>共%s条记录 当前第%s/%s页</p>', $this->getFirstButton("«"), $this->getPreviousButton("‹"), $this->getLinks(), $this->getNextButton("›"), $this->getLastButton("»"), $this->total(), $this->currentPage(), $this->lastPage() ); } }else{ if ($this->simple) { } else { return sprintf( '<p>共%s条记录 当前第%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/article/37.html