Laravel5.5 手动分页和自定义分页样式的简单实现

基于Laravel5.5 在项目实施过程中,需要对从接口中获取的数据(或者通过搜索工具查询出来的数据)进行分页

一、创建手动分页

在laravel自带的分页中,一般是通过数据库查询访问paginate()方法来达到分页的效果 ,like this:

class IndexControllerextends Controller

{
  publicfunctionindex()
  {
    $person = DB::table('person')->paginate(15);

    return view('index.pagTest',['person'=> $person]);
  }
}

查看框架的分页源代码

#vender/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php

/**
   * Paginate the given query.
   *
   * @param int $perPage
   * @param array $columns
   * @param string $pageName
   * @param int|null $page
   * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
   *
   * @throws \InvalidArgumentException
   */
  public function paginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
  {
    $page = $page ?: Paginator::resolveCurrentPage($pageName);

    $perPage = $perPage ?: $this->model->getPerPage();

    $results = ($total = $this->toBase()->getCountForPagination())
                  ? $this->forPage($page, $perPage)->get($columns)
                  : $this->model->newCollection();

    return $this->paginator($results, $total, $perPage, $page, [
      'path' => Paginator::resolveCurrentPath(),
      'pageName' => $pageName,
    ]);
  }

发现,分页用了 \Illuminate\Contracts\Pagination\LengthAwarePaginator 构造方法,查看这个构造方法

<?php

namespace Illuminate\Pagination;

use Countable;
use ArrayAccess;
use JsonSerializable;
use IteratorAggregate;
use Illuminate\Support\Collection;
use Illuminate\Support\HtmlString;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Pagination\LengthAwarePaginator as LengthAwarePaginatorContract;

class LengthAwarePaginator extends AbstractPaginator implements Arrayable, ArrayAccess, Countable, IteratorAggregate, JsonSerializable, Jsonable, LengthAwarePaginatorContract
{
  /**
   * The total number of items before slicing.
   *
   * @var int
   */
  protected $total;

  /**
   * The last available page.
   *
   * @var int
   */
  protected $lastPage;

  /**
   * Create a new paginator instance.
   *
   * @param mixed $items
   * @param int $total
   * @param int $perPage
   * @param int|null $currentPage
   * @param array $options (path, query, fragment, pageName)
   * @return void
   */
  public function __construct($items, $total, $perPage, $currentPage = null, array $options = [])
  {
    foreach ($options as $key => $value) {
      $this->{$key} = $value;
    }

    $this->total = $total;
    $this->perPage = $perPage;
    $this->lastPage = max((int) ceil($total / $perPage), 1);
    $this->path = $this->path !== '/' ? rtrim($this->path, '/') : $this->path;
    $this->currentPage = $this->setCurrentPage($currentPage, $this->pageName);
    $this->items = $items instanceof Collection ? $items : Collection::make($items);
  }

如果要实现手动分页,只需要使用这个构造方法,给定参数,就能达到分页的效果

贴代码:

public function setPage2(Request $request,$data,$prepage,$total){

    #每页显示记录
    $prePage = $prepage;
    //$total =count($data);
    $allitem = $prepage *100;
    $total > $allitem ? $total = $allitem : $total;
    if(isset($request->page)){
      $current_page =intval($request->page);
      $current_page =$current_page<=0?1:$current_page;
    }else{
      $current_page = 1;
    }
    #url操作
    $url = $url='http://'.$_SERVER['SERVER_NAME'].$_SERVER["REQUEST_URI"];
    if(strpos($url,'&page')) $url=str_replace('&page='.$request->page, '',$url);

    # $data must be array
    $item =array_slice($data,($current_page-1)*$prePage,$prePage);
    $paginator = new LengthAwarePaginator($item,$total,$prePage,$current_page,[
      'path'=>$url,
      'pageName'=>'page'
    ]);

    return $paginator;
  }

($data 为需要进行分页的数据)

说明:

1、在考虑到代码的复用性,我将分页代码封装到app/Controllers/Controller.php中的一个方法里面,这样在其他控制器里只需要$this->setPage(Request $request,$data,$prepage,$total) 就能使用了,(前提:其他控制器继承了Controller.php)

2、分页的URL,因为我的项目的url一定会携带一个kw参数,所以我直接用str_replace替换"&page",如果是存在不携参分页的话,需要判断,到底是"?page"还是"&page"。(url的逻辑可以自己写)

#分页 php

     $paginator = $this->setPage2($request,$data,25,$sum);
      $data =$paginator->toArray()['data'];

在模板中:{{$paginator->render()}}即能输出分页HTML,样式如下:

二、自定义分页样式

在实际开发中,不希望用户在浏览时直接浏览最后几页,只想用户从前往后依次的浏览,如百度搜索分页,这时候,就想修改分页的样式,经过一个下午的奋战,贴出解决过程

在上一环节中,手动创建了分页,了解HTML的模板生成是render()方法,

#\Illuminate\Contracts\Pagination\LengthAwarePaginator


/**
   * Render the paginator using the given view.
   *
   * @param string|null $view
   * @param array $data
   * @return \Illuminate\Support\HtmlString
   */
  public function render($view = null, $data = [])
  {
    return new HtmlString(static::viewFactory()->make($view ?: static::$defaultView, array_merge($data, [
      'paginator' => $this,
      'elements' => $this->elements(),
    ]))->render());
  }

经过思考,我们不去改laravel框架的源代码,可以通过重构render方法或者重新定义一个生成HTML模板的方法来实现自定义HTML模板

因为我们只需要自定义HTML模板,所以,可以创建一个文件,继承\Illuminate\Contracts\Pagination\LengthAwarePaginator 类

看代码:

<?php

namespace App\Helpers;

use Illuminate\Pagination\LengthAwarePaginator;
/**
 * Created by PhpStorm.
 * User: 1
 * Date: 2018/4/9
 * Time: 9:08
 */
class Newpage extends LengthAwarePaginator {

  public $de_page = 10; //默认显示分页数
  public $pageHtml;

  public function newrender(){
    if($this->hasPages())
    {

      return sprintf("<ul class='pagination'>%s %s %s</ul>",
        $this->pre_page(),
        $this->pages_num(),
        $this->next_page()
      );
    }
  }

  #上一页
  public function pre_page(){
    if($this->currentPage == 1){
      //dd($this->currentPage);
      return "<li class='disabled'><span>《</span></li>";
    }else{

      $url = $this->path."&page=".($this->currentPage-1);
      //dd($url);
      return "<li><a href=".$url." rel="external nofollow" rel='prev'>《</a></li>";
    }
  }

  #页码
  public function pages_num(){
    $pages = '';
    if($this->currentPage <= 6){
      for($i = 1; $i <= $this->de_page; $i++){
        if($this->currentPage == $i){
          $pages .= "<li class='active'><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$i.">".$i."</a></li>";
        }else{
          $pages .="<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$i.">".$i."</a></li>";
        }
      }
    }else{
      #当前页前边部分
      for($i = 5; $i >=1 ; $i--){
        $url =$this->currentPage-$i;
        $pages .= "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$url.">".$url."</a></li>";
      }
      #当前页
      $pages .= "<li class='active'><span>".$this->currentPage."</span></li>";
      #当前页后边部分
      for($i = 1;$i < 5; $i++ ){
        $nowpage =$this->currentPage+$i;
        $pages .= "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$nowpage.">".$nowpage."</a></li>";
      }
    }
    return $pages;

  }
  #下一页
  public function next_page(){
    if($this->currentPage < $this->total){
      $page =$this->currentPage+1;
      return "<li><a href=".$this->path." rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" &page=".$page." rel='next'><span>》</span></a></li>";
    }else{
      return "<li class='disabled'><span>》</span></li>";
    }

  }

}

我选择的方法是自定义新的方法生成HTML模板,模板中通过:{{$paginator->newrender()}}输出HTML

如果选择重构render()方法,只需要将上面的newrender()方法做一些小变动

public function render($view=null,$data=[]){

    if($this->hasPages())
    {
      return sprintf("<ul class='pagination'>%s %s %s</ul>",
        $this->pre_page(),
        $this->pages_num(),
        $this->next_page()
      );
    }
  }

模板中通过:{{$paginator->render()}}输出HTML

最终效果如图:

注意:自定义HTML后因为新建了一个类继承了LengthAwarePaginator类,需要将第一步手动分页的方法中new LengthAwarePaginator 修改为 new Newpage 参数不变。

以上这篇Laravel5.5 手动分页和自定义分页样式的简单实现就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

时间: 2019-10-14

Laravel框架实现超简单的分页效果示例

本文实例讲述了Laravel框架实现超简单的分页效果.分享给大家供大家参考,具体如下: 每页展示5条数据 控制器 class indexCo extends Controller { public function cc () { $lists = UserAli:: orderBy('user_id','desc') -> paginate(5); return view('cc',compact('lists')); } } layout/main.blade.php <!DOCTYPE

在Laravel中实现使用AJAX动态刷新部分页面

AJAX相信大家都不陌生,有很多不同的Javascript Frameworks可以用来快速实现AJAX功能.那么今天我们一起来看一下如何在使用了PHP Frameworks的网站中使用AJAX来刷新页面的一小部分. 这里我使用的是jQuery + Laravel(当然如果使用了其他框架,基本的概念也是不变的).如图,假设我们制作了一个页面来管理客户的茶叶消耗: 我们想制作一个模块来动态为每一个新的茶叶消耗增加一个消耗选择区,即点击新增消耗后,会动态增加一个新的茶叶消耗区域: 另外,当点击删除该

Laravel框架分页实现方法分析

本文实例讲述了Laravel框架分页实现方法.分享给大家供大家参考,具体如下: Laravel使用的过程中,有些功能把前端页面的表达"写死了",比如分页的翻页按钮! 当然你会说Laravel的Bootstrap样式也很好看啊,但是实际项目中,翻页按钮常常需要满足的客户的需要,特别在开发一款支持手机适配的Web APP,更是需要使用自定义的样式. 所以,学习一样东西不能一知半解,而是究其原理. 先来看看Laravel是怎么分页的,生成分页按钮的代码究竟写在了哪里? Laravel目录\v

laravel自定义分页效果

对于laravel分页,自带一个paginate的方法,很好用,但是也是有局限性的. 所以自己针对于此写了一个自己的分页,具体代码如下 <?php namespace ...; use ...; /** * 自定义分页类,适合少数据的查询,多数据的时候不推荐 * Class CustomPaginate * @package App\Tools\Paginate */ class CustomPaginate { /** * 自定义数组分页 * @param $data = 返回结果 * @pa

Laravel实现搜索的时候分页并携带参数

筛选分页每页的条数: <select class="form-control" id="perPage" name="perPage"> @foreach ( [10,20,30,50] as $e) <option value="{{$e}}" {{ $e==request('perPage') ? 'selected' : '' }} >{{$e}}</option> @endforea

Laravel框架执行原生SQL语句及使用paginate分页的方法

本文实例讲述了Laravel框架执行原生SQL语句及使用paginate分页的方法.分享给大家供大家参考,具体如下: 1.运行原生sql public function getList($data){ //获取前端传过来的参数 $user = $data['userId']; $office = $data['officeId']; $key = $data['oneKeySearch']; //进行模糊搜索和联合查询 $where = 'and 1=1 '; if($key!=null) {

laravel手动创建数组分页的实现代码

本文介绍了laravel手动创建数组分页的实现代码,分享给大家,具体如下: laravel分页功能: 有几种方法可以对数据进行分页.最简单的是在 [查询语句构造器] 或 [Eloquent 查询] 中使用 paginate 或 simplePaginate 方法. paginate用法如下: //控制器中 $users = DB::table('users')->paginate(15); return view('user.index', ['users' => $users]); //视图

Laravel框架搜索分页功能示例

本文实例讲述了Laravel框架搜索分页功能.分享给大家供大家参考,具体如下: 控制器controller /** * 文章搜索 * * @author YING * @param void * @return void */ public function mesArticleSearch() { //接值 $input=Input::get(); //调用模型查询 //实例化类 $cate=new Article(); //调用自定义方法 查询分类 $artInfo=$cate->searc

Yii框架结合sphinx,Ajax实现搜索分页功能示例

本文实例讲述了Yii框架结合sphinx,Ajax实现搜索分页功能的方法.分享给大家供大家参考,具体如下: 效果图: 控制器: <?php namespace backend\controllers; use Yii; use yii\web\Controller; use yii\data\Pagination; use SphinxClient; use yii\db\Query; use yii\widgets\LinkPager; use backend\models\Goods; cl

Laravel框架实现抢红包功能示例

本文实例讲述了Laravel框架实现抢红包功能.分享给大家供大家参考,具体如下: 首先进行登录 <form action="{{url('b_login')}}" method="post"> {{csrf_field()}} <p>用户名:<input type="text" name="username"></p> <p>密 码:<input type=&q

Laravel框架自定义分页样式操作示例

本文实例讲述了Laravel框架自定义分页样式操作.分享给大家供大家参考,具体如下: 操作步骤如下: (1)  对应public/css/paging.css 文件建立分页样式. (2)  控制器查出分页数据使用 paginate函数进行分页处理.(禁止使用group by处理查询). (3) 对应视图引入分页样式. 例如: paging.css 样式文件代码(复制即可用,实际操作过)如下 #pull_right{ text-align:center; } .pull-right { /*flo

MVVM框架下实现分页功能示例

分页这种组件,几乎每一种框架都有这样的组件,近期我们做了新的项目,因为是在新的分支和新的项目中开发的一期任务,属于什么都没有的状态,几乎所有的效果和业务逻辑都需要重新整理和书写,项目正好完结了,把其中用到的一些小方法分想出来,重在分享思路和逻辑,理清思路和逻辑不论是哪一种框架,都可以轻松搞定 先来看一下效果图: 分页效果图 场景概述: 当前页面需要加载 10条数据 ,每次点击下一页如果之前没有请求过接口需要请求数据,如果在一次页面会话中, 请求过的数据不再从新请求,且要保留每一页面的操作结果 (

Yii2.0小部件GridView(两表联查/搜索/分页)功能的实现代码

 GridView 两表联查/搜索/分页 当我们在一个网格视图中显示活动数据的时候,你可能会遇到这种情况,就是显示关联表的列的值,为了使关联列能够排序,你需要连接关系表,以及添加排序规则到数据提供者的排序组件中,对数据进行搜索,排序. Ⅰ.控制器层Controller <?php namespace backend\controllers; header("Content-type:text/html;charset=utf-8"); use Yii; use yii\web\C

yii框架搜索分页modle写法

控制器层 <?PHP namespace frontend\controllers; header('content-type:text/html;charset=utf-8'); use Yii; use yii\base\InvalidParamException; use yii\web\BadRequestHttpException; use yii\web\Controller; use yii\filters\VerbFilter; use yii\filters\AccessCon

Vue+element-ui 实现表格的分页功能示例

本文介绍了Vue+element-ui 实现表格的分页功能示例,分享给大家,具体如下: 实现效果如下图所示: template部分: <el-table :data="tempList" :header-cell-style="rowClass" stripe border style="margin-bottom:14px;" :empty-text="emptyText"> <el-table-colum

微信小程序之搜索分页功能的实现代码

直接上代码: wxml: <wxs src="../wxs/changeimg.wxs" module="changeimg" /> <view class="container"> <view class="search_input"> <image class="back" src="" mode="widthFix"&g

Yii框架引入coreseek分页功能示例

本文实例讲述了Yii框架引入coreseek分页功能.分享给大家供大家参考,具体如下: 把sphinxapi.php改为SphinxClient.php 类文件随便放,你能找到就行,我放在advanced/frontend/web/SphinxClient.php,打开common/config/bootstrap.php 在里面添加 Yii::$classMap['SphinxClient']='@frontend/web/SphinxClient.php'; 地址写正确 在需要用得控制其中