加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

PHP框架Laravel插件Pagination实现自定义分页

发布时间:2020-12-14 19:52:49 所属栏目:大数据 来源:网络整理
导读:《:PHP框架Laravel插件Pagination实现自定义分页》要点: 本文介绍了:PHP框架Laravel插件Pagination实现自定义分页,希望对您有用。如果有疑问,可以联系我们。 PHP编程 Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下 paginate(

《:PHP框架Laravel插件Pagination实现自定义分页》要点:
本文介绍了:PHP框架Laravel插件Pagination实现自定义分页,希望对您有用。如果有疑问,可以联系我们。

PHP编程Laravel 的分页很方便,其实扩展起来也挺容易的,下面就来做个示例,扩展一下 paginate() 和 simplePaginate() 办法,来实现我们自定义分页样式,比如显示 "上一页" 和 "下一页",而不是 "《" 和 "》",当然扩展的办法掌握了你就可以肆无忌惮的扩展一个你想要的分页了,比如跳转到某一页,分页显示一共多少记录,当前显示的记录范围等等巴拉巴拉的...

PHP编程5.1和5.2应该是同样的办法,我这里用的是5.2的版本.文档告诉我们 Paginator 对应于查询语句构造器和 Eloquent 的? simplePaginate 办法,而? LengthAwarePaginator 则等同于? paginate 办法.那我们还是来看下源码,具体这个? paginate 是如何实现 render() 的,

PHP编程Illuminate/Pagination/LengthAwarePaginator.php

PHP编程
<?php
namespace IlluminatePagination;
......
class LengthAwarePaginator extends AbstractPaginator implements Arrayable,ArrayAccess,Countable,IteratorAggregate,JsonSerializable,Jsonable,LengthAwarePaginatorContract 
{
......
  public function render(Presenter $presenter = null)
  {
    if (is_null($presenter) && static::$presenterResolver) {
      $presenter = call_user_func(static::$presenterResolver,$this);
    }
    $presenter = $presenter ?: new BootstrapThreePresenter($this);
    return $presenter->render();
  }
......
}

PHP编程render() 中传入的是一个 Presenter 的实例,并调用这个实例化的 render 办法来实现分页的显示的.如果没有则调用 BootstrapThreePresenter 中 render() 的,来看看 BootstrapThreePresenter 是干嘛的

PHP编程Illuminate/Pagination/BootstrapThreePresenter.php

PHP编程
<?php
namespace IlluminatePagination;
use IlluminateSupportHtmlString; 
use IlluminateContractsPaginationPaginator as PaginatorContract; 
use IlluminateContractsPaginationPresenter as PresenterContract;
class BootstrapThreePresenter implements PresenterContract 
{
  use BootstrapThreeNextPreviousButtonRendererTrait,UrlWindowPresenterTrait;
  /**
   * The paginator implementation.
   *
   * @var IlluminateContractsPaginationPaginator
   */
  protected $paginator;
  /**
   * The URL window data structure.
   *
   * @var array
   */
  protected $window;
  /**
   * Create a new Bootstrap presenter instance.
   *
   * @param IlluminateContractsPaginationPaginator $paginator
   * @param IlluminatePaginationUrlWindow|null $window
   * @return void
   */
  public function __construct(PaginatorContract $paginator,UrlWindow $window = null)
  {
    $this->paginator = $paginator;
    $this->window = is_null($window) ? UrlWindow::make($paginator) : $window->get();
  }
  /**
   * Determine if the underlying paginator being presented has pages to show.
   *
   * @return bool
   */
  public function hasPages()
  {
    return $this->paginator->hasPages();
  }
  /**
   * Convert the URL window into Bootstrap HTML.
   *
   * @return IlluminateSupportHtmlString
   */
  public function render()
  {
    if ($this->hasPages()) {
      return new HtmlString(sprintf(
        '<ul class="pagination">%s %s %s</ul>',$this->getPreviousButton(),$this->getLinks(),$this->getNextButton()
      ));
    }
    return '';
  }
......
}

PHP编程这里可以看到 BootstrapThreePresenter 实现了 PresenterContract 的接口,render() 才是分页显示的真正实现,构造办法中的第一个参数 PaginatorContract 其实就是一个 Paginator 我们继续看下 PresenterContract 也就是 Presenter 接口中定义了什么办法需要实现

PHP编程illuminate/contracts/Pagination/Presenter.php

PHP编程
<?php
namespace IlluminateContractsPagination;
interface Presenter 
{
  /**
   * Render the given paginator.
   *
   * @return IlluminateContractsSupportHtmlable|string
   */
  public function render();
  /**
   * Determine if the underlying paginator being presented has pages to show.
   *
   * @return bool
   */
  public function hasPages();
}

PHP编程其中定义了 render 和 hasPages 办法需要实现

PHP编程好了,那我们现在已经很清晰了,我们要自定义分页的显示,那么就要写一个我们本身的 Presenter 来实现接口中的 render() 和 hasPages() 就可以了.

PHP编程首先就来简单的实现一个paginate(),显示出来"上一页"和"下一页",中间是分页数字的例子.

PHP编程新建文件如下(个人习惯)

PHP编程app/Foundations/Pagination/CustomerPresenter.php

PHP编程
<?php 
namespace AppFoundationsPagination;
use IlluminateContractsPaginationPresenter as PresenterContract; 
use IlluminateContractsPaginationLengthAwarePaginator as PaginatorContract; 
use IlluminatePaginationUrlWindow; 
use IlluminateSupportHtmlString; 
use IlluminatePaginationBootstrapThreeNextPreviousButtonRendererTrait; 
use IlluminatePaginationUrlWindowPresenterTrait;
class CustomerPresenter implements PresenterContract 
{
  use BootstrapThreeNextPreviousButtonRendererTrait,UrlWindowPresenterTrait;
  protected $paginator;
  protected $window;
  /**
   * Create a new Bootstrap presenter instance.
   *
   * @param IlluminateContractsPaginationPaginator $paginator
   * @param IlluminatePaginationUrlWindow|null $window
   * @return void
   */
  public function __construct(PaginatorContract $paginator,$this->getPreviousButton('上一页'),//具体实现可以查看该办法
        $this->getLinks(),$this->getNextButton('下一页')//具体实现可以查看该办法
      ));
    }
    return '';
  }
  /**
   * Get HTML wrapper for an available page link.
   *
   * @param string $url
   * @param int $page
   * @param string|null $rel
   * @return string
   */
  protected function getAvailablePageWrapper($url,$page,$rel = null)
  {
    $rel = is_null($rel) ? '' : ' rel="' . $rel . '"';
    return '<li><a href="' . htmlentities($url) . '"' . $rel . '>' . $page . '</a></li>';
  }
  /**
   * Get HTML wrapper for disabled text.
   *
   * @param string $text
   * @return string
   */
  protected function getDisabledTextWrapper($text)
  {
    return '<li class="disabled hide"><span>' . $text . '</span></li>';
  }
  /**
   * Get HTML wrapper for active text.
   *
   * @param string $text
   * @return string
   */
  protected function getActivePageWrapper($text)
  {
    return '<li class="active"><span>' . $text . '</span></li>';
  }
  /**
   * Get a pagination "dot" element.
   *
   * @return string
   */
  protected function getDots()
  {
    return $this->getDisabledTextWrapper('...');
  }
  /**
   * Get the current page from the paginator.
   *
   * @return int
   */
  protected function currentPage()
  {
    return $this->paginator->currentPage();
  }
  /**
   * Get the last page from the paginator.
   *
   * @return int
   */
  protected function lastPage()
  {
    return $this->paginator->lastPage();
  }
}

PHP编程就这么简单,主要就是 render() 办法,如果项目中需要修改分页样式,或者添加分页跳转之类的需求只要重写其中的各项显示的办法中的html元素就可以了,很灵活,在blade模板中也需要修该,比如我们的 Paginator 叫 $users,默认的分页显示是这样的:

PHP编程{!! $users->render() !!}
修改成我们自界说后的分页显示:

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读