亲测:thinkphp5中按条件分页

原创 2018年04月17日 08:57:24

在thinkphp5中,实现


首先,在


中,将内容替换为:

<?php

namespace think\paginator\driver;

use think\Paginator;

class Bootstrap extends Paginator
{

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

        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($text = '下一页')
    {
        if (!$this->hasMore) {
            return $this->getDisabledTextWrapper($text);
        }

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

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

     /**
     * 首页按钮
     * @param string $text
     * @return string
     */
    protected function getFirstButton($text = '首页')
    {
        $nowPage = $this->rollPage;//计算分页临时变量
        //当  总页数大于定义的页数时  且  当前页数大于前几页时  显示首页
        if ($this->lastPage > $this->showPage && $this->currentPage > $nowPage) {
            
            $url = $this->url(1);
            
            return $this->getPageLinkWrapper($url, $text);
        }
    }

    /**
     * 末页按钮
     * @param string $text
     * @return string
     */
    protected function getLastButton($text = '末页')
    {
        $nowPage = $this->rollPage;//计算分页临时变量
        
        //当  总页数大于定义的页数时  且  当前页数小于最后的几页时  显示末页
        if ($this->lastPage > $this->showPage && $this->currentPage < ($this->lastPage - $nowPage)) {
            
            $url = $this->url($this->lastPage);
            
            return $this->getPageLinkWrapper($url, $text);
        }
    }

    /**
     * 页码按钮
     * @return string
     */
    protected function getLinks()
    {
        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  int    $page
     * @return string
     */
    protected function getAvailablePageWrapper($url, $page)
    {
        return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>';
    }

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

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

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

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

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

        return $html;
    }

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

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

而在控制器中,假设不使用model

$data = Db::table('表名')->alias('a')->join('表名2 b ','a.字段= t.字段') -> where($where) ->order('排序')->paginate(2);   
$this -> assign('data',$data);//数据
$this->assign("page",$data->render());  //分页

注意,page不能如下,这样只会生成上一页和下一页,而不会生成其他2,3,4等页面

$page = $data->render();
$this->assign("page",$page);  //分页

最后,在前端展示:

{$page}

样式为:

<style>
/*分页样式*/  
.pagination{text-align:center;margin-top:20px;margin-bottom: 20px;}  
.pagination li{margin:0px 10px; border:1px solid #e6e6e6;padding: 3px 8px;display: inline-block;}  
.pagination .active{background-color: #46A3FF;color: #fff;}  
.pagination .disabled{color:#aaa;} 
</style>

thinkphp5 搜索分页保留搜索条件

在项目中,碰到模糊搜索出来的记录超过一页,翻到下一页后直接显示全部记录, 搜索条件丢失的情况,thinkphp5框架中,要想分页搜索附带条件,很简单就可以实现。 1、在搜索的模板页面,记住肯定用的传...
  • Tina_1202
  • Tina_1202
  • 2018-01-07 17:10:19
  • 254

Thinkphp中的条件分页

Thinkphp中的条件分页最近做一个项目,用的是tp框架,在做查询页面的时候我用的post传递查询条件,但是这时候分页就出问题了,结果的第一页是正确的,但是当点击其他页面的时候发现原来的条件没有了,...
  • berserk_panda
  • berserk_panda
  • 2016-01-17 19:57:42
  • 684

thinkphp5内置分页功能第二页没有拿到参数,如何解决?

最近在做项目,使用的是thinkphp5(tp5)开发的,使用tp5内置的分页功能。 那么,问题来了,我使用paginate函数生成分页时,若没有第二页是没有关系的,但是当出现分页时,结果没有请求参...
  • woaifen3344
  • woaifen3344
  • 2017-02-19 13:45:38
  • 4101

thinkphp 5.0+ 点击分页带上其他参数

thinkphp5.0+ 下的分页方法,文件地址是:thinkphp\thinkphp\library\think\db\Query.php/** * 分页查询 * @param ...
  • con_knife
  • con_knife
  • 2017-06-14 13:52:01
  • 1774

thinkphp实现数组分页示例

public function nodeslist(){ $portal = new PortalApi; $nodelist = $portal->getNodeLists($this->uid);...
  • A9925
  • A9925
  • 2015-09-15 19:30:17
  • 979

thinkphp5 分页带参数的解决办法

文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member') ->where('member_name|member...
  • ylwsn21
  • ylwsn21
  • 2017-08-02 15:21:07
  • 1512

SSH实现带条件查询分页功能

一、我们必须先打好框架,这里不做解释了。 二,按我的步骤走,那就不会错, 1,建立一个分页的JavaBean package ut.filter; import java.util.List;...
  • liuchangjie0112
  • liuchangjie0112
  • 2016-08-05 00:39:01
  • 3897

修改 thinkphp5 分页样式

现在的项目的分页样式太丑了,一直也放着也没有去管,最近实在是看不下去了,打算好好看看这块,找了很多,也都比较模糊,于是根据 官方手册 打算搞一搞...
  • oZuoYu123
  • oZuoYu123
  • 2017-08-30 11:32:08
  • 302

thinkphp5传参分页功能无效?解决方案

thinkphp5 查询分页
  • houbin99999
  • houbin99999
  • 2017-05-26 14:43:18
  • 1558

thinkphp5分页

如开发手册所示,paginate不能加select,所以得到的是一个类,并不是数组,这个时候想对内部的数据进行修改操作时,就遇到了问题 所幸已经解决了,代码如下所示 $suggestion=Db:...
  • less_cold
  • less_cold
  • 2017-06-10 13:48:36
  • 318
收藏助手
不良信息举报
您举报文章:亲测:thinkphp5中按条件分页
举报原因:
原因补充:

(最多只允许输入30个字)