企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
### 分页 Page 分页是在进行列表 List 查询过程中,基本都会使用到,为了更加快速的进行产品开发,我们对分页操作进行了封装,并且继承了 ThinkPHP 原生的 Page.class.php 类库,封装了分页调用函数。 **位置:**Application\Common\Common\function.php **参数:** > * @param int $count 要分页的总记录数 > * @param int $pagesize 每页查询条数 **调用:** > $page = getpage($count, 10); // 调用分页函数 > limit($page->firstRow.','.$page->listRows) // 传值分页搜索 > $this->assign('page', $page->showFront()); // 分页赋值模版 **实例:** 1、Controller 控制器的方法中: ~~~ $count = M('system_log')->count(); // 统计数量 $page = getpage($count, 10); // 调用分页函数,Param总数,每一页显示10条 $log_list = M('system_log') ->limit($page->firstRow.','.$page->listRows) // 传值分页搜索 ->select(); $this->assign('log_list', $log_list); $this->assign('page', $page->showFront()); // 分页赋值模版 $this->display(); ~~~ 2、View 模版赋值 ~~~ <volist name="log_list" id="vo"> <tr> <td>{$vo.id}</td> <td>{$vo.nickname}</td> </tr> </volist> {$page} <!-- 调用分页 --> ~~~ 在需要调用的分页位置,一般在列表 List 下面 * * * * * **带搜索的分页实例:** 在进行列表分页的时候,经常会用到多个搜索条件的列表,而且要进行分页,下面实例讲到具体的使用和调用 1、搜索分页第一步是进行条件的搜索,搜索 Form 的提交方式我们一般选择 GET,POST 也可以,而 GET 我们可以在 URL 更完成的看到搜索的条件的传值,更有利于分页的调试,那么约定好搜索就使用 GET 方式传值,其他的写法都没什么区别,**分页方法会自动取值并赋值在分页的 URL 上面进行分页**。 搜索的URL: > index?user_id=17 // 传值 user_id 分页后的URL > index/user_id/17/p/2.html // 分页带出 user_id 2、多选条件的搜索分页 在进行 Select 多选和 Input checkbox 多选框等的搜索的时候,后台接收的数据会是一个数组,那该怎么在分页进行传值呢? > array (size=3) > 0 => string 'banana' > 1 => string 'grape' > 2 => string 'mango' 为了解决多选数据是数组的问题,在封装的函数里面将数组自动判断转换成用“-” 符号连接的字符串,在赋值在分页的URL上面 > index/name/banana-grape-mango/p/2.html 而在后台取数据的时候,**提交 Form 表单的时候获取的 $name 是一个数组,在分页的时候获取的 $name 是一个字符串**,需要将字符串进行转换为数组 ~~~ $name = I('param.name'); if(!is_array($name)) { $name = explode("-", $name); // 拆分字符串为数组 } ~~~ **完整代码:** ~~~ // 调用 Think Page 的分页 /* * @param int $count 要分页的总记录数 * @param int $pagesize 每页查询条数 * @return \Think\Page */ function getpage($count, $pagesize = 10){ $p = new Think\Page($count,$pagesize); $p->lastSuffix = false; $p->setConfig('prev','上一页'); $p->setConfig('next','下一页'); $p->setConfig('last','尾页'); $p->setConfig('first','首页'); $p->setConfig('theme','%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END%'); $arr_input = I('param.'); // 获取 input 搜索表单数据 foreach($arr_input as $key => $val) { if (is_array($val)) { // 如果是数组拆分成连接字符串 $str = ''; foreach ($val as $k => $v) { $str = $str . '-' . $v; } $val = substr($str,1,strlen($str)); // 去掉第一个字符 - } $p->parameter[$key] = $val; } return $p; } ~~~ **重写的 page.class.php 类的 show 方法:** ~~~ /** * [showFront 前端分页样式] * @return [string] [组装好的链接] */ public function showFront() { $this->config['header'] = '<li><span class="rows">%NOW_PAGE% / %TOTAL_ROW% 条记录</span></li>'; $this->config['prev'] = "上一页"; $this->config['next'] = "下一页"; $this->rollPage = 4; if(0 == $this->totalRows) return ''; /* 生成URL */ $this->parameter[$this->p] = '[PAGE]'; $this->url = U(ACTION_NAME, $this->parameter); /* 计算分页信息 */ $this->totalPages = ceil($this->totalRows / $this->listRows); //总页数 if(!empty($this->totalPages) && $this->nowPage > $this->totalPages) { $this->nowPage = $this->totalPages; } /* 计算分页零时变量 */ $now_cool_page = $this->rollPage/2; $now_cool_page_ceil = ceil($now_cool_page); $this->lastSuffix && $this->config['last'] = $this->totalPages; //上一页 $up_row = $this->nowPage - 1; $up_page = $up_row > 0 ? '<li><a href="' . $this->url($up_row) . '">' . $this->config['prev'] . '</a></li>' : ''; //下一页 $down_row = $this->nowPage + 1; $down_page = ($down_row <= $this->totalPages) ? '<li> <a href="' . $this->url($down_row) . '">' . $this->config['next'] . '</a> </li>' : ''; //第一页 $the_first = ''; if($this->totalPages > $this->rollPage && ($this->nowPage - $now_cool_page) >= 1){ $the_first = '<li><a href="' . $this->url(1) . '">' . $this->config['first'] . '</a></li>'; } //最后一页 $the_end = ''; if($this->totalPages > $this->rollPage && ($this->nowPage + $now_cool_page) < $this->totalPages){ $the_end = '<li><a href="' . $this->url($this->totalPages) . '">' . $this->config['last'] . '</a></li>'; } //数字连接 $link_page = ""; for($i = 1; $i <= $this->rollPage; $i++){ if(($this->nowPage - $now_cool_page) <= 0 ){ $page = $i; }elseif(($this->nowPage + $now_cool_page - 1) >= $this->totalPages){ $page = $this->totalPages - $this->rollPage + $i; }else{ $page = $this->nowPage - $now_cool_page_ceil + $i; } if($page > 0 && $page != $this->nowPage){ if($page <= $this->totalPages){ $link_page .= '<li><a href="' . $this->url($page) . '">' . $page . '</a></li>'; }else{ break; } }else{ if($page > 0 && $this->totalPages != 1){ $link_page .= '<li><span class="current">' . $page . '</span></li>'; } } } //替换分页内容 $page_str = str_replace( array('%UP_PAGE%', '%HEADER%', '%NOW_PAGE%', '%DOWN_PAGE%', '%FIRST%', '%LINK_PAGE%', '%END%', '%TOTAL_ROW%', '%TOTAL_PAGE%'), array( $up_page, $this->config['header'], $this->nowPage, $down_page, $the_first, $link_page, $the_end, $this->totalRows, $this->totalPages ), $this->config['theme']); // return "{$page_str}"; 底下是重写的分页样式 2016-12-26 jig update $result = '<div class="col-xs-4"> <div class="page-num">共' . $this->totalPages . '页' . $this->totalRows . '条数据</div> </div> <div class="col-xs-8"> <div class="erppagination2"> <ul class="pagination pagination-sm" style="margin-top:0;">'. $page_str .'</ul> </div> </div>'; return $result; } ~~~