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

news/2024/7/16 5:08:00

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

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

Illuminate/Pagination/LengthAwarePaginator.php

namespace Illuminate\Pagination;

......

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();

}

......

}

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

Illuminate/Pagination/BootstrapThreePresenter.php

namespace Illuminate\Pagination;

use Illuminate\Support\HtmlString;

use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;

use Illuminate\Contracts\Pagination\Presenter as PresenterContract;

class BootstrapThreePresenter implements PresenterContract

{

use BootstrapThreeNextPreviousButtonRendererTrait, UrlWindowPresenterTrait;

/**

* The paginator implementation.

*

* @var \Illuminate\Contracts\Pagination\Paginator

*/

protected $paginator;

/**

* The URL window data structure.

*

* @var array

*/

protected $window;

/**

* Create a new Bootstrap presenter instance.

*

* @param \Illuminate\Contracts\Pagination\Paginator $paginator

* @param \Illuminate\Pagination\UrlWindow|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 \Illuminate\Support\HtmlString

*/

public function render()

{

if ($this->hasPages()) {

return new HtmlString(sprintf(

'

  • %s %s %s
',

$this->getPreviousButton(),

$this->getLinks(),

$this->getNextButton()

));

}

return '';

}

......

}

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

illuminate/contracts/Pagination/Presenter.php

namespace Illuminate\Contracts\Pagination;

interface Presenter

{

/**

* Render the given paginator.

*

* @return \Illuminate\Contracts\Support\Htmlable|string

*/

public function render();

/**

* Determine if the underlying paginator being presented has pages to show.

*

* @return bool

*/

public function hasPages();

}

其中定义了 render 和 hasPages 方法需要实现

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

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

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

app/Foundations/Pagination/CustomerPresenter.php

namespace App\Foundations\Pagination;

use Illuminate\Contracts\Pagination\Presenter as PresenterContract;

use Illuminate\Contracts\Pagination\LengthAwarePaginator as PaginatorContract;

use Illuminate\Pagination\UrlWindow;

use Illuminate\Support\HtmlString;

use Illuminate\Pagination\BootstrapThreeNextPreviousButtonRendererTrait;

use Illuminate\Pagination\UrlWindowPresenterTrait;

class CustomerPresenter implements PresenterContract

{

use BootstrapThreeNextPreviousButtonRendererTrait, UrlWindowPresenterTrait;

protected $paginator;

protected $window;

/**

* Create a new Bootstrap presenter instance.

*

* @param \Illuminate\Contracts\Pagination\Paginator $paginator

* @param \Illuminate\Pagination\UrlWindow|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 \Illuminate\Support\HtmlString

*/

public function render()

{

if ($this->hasPages()) {

return new HtmlString(sprintf(

'

  • %s %s %s
',

$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 '

' . $page . '';

}

/**

* Get HTML wrapper for disabled text.

*

* @param string $text

* @return string

*/

protected function getDisabledTextWrapper($text)

{

return '

' . $text . '';

}

/**

* Get HTML wrapper for active text.

*

* @param string $text

* @return string

*/

protected function getActivePageWrapper($text)

{

return '

' . $text . '';

}

/**

* 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();

}

}

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

{!! $users->render() !!}修改成我们自定义后的分页显示:

{!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}好了,这样在页面应该就可以看到分页链接中含有 "上一页"和"下一页"加数字的样式了。

那么如果扩展simplePaginate?其实很简单,只要继承刚才的 CustomerPresenter ,实现 hasPages 和 render ,至于为什么可以按照我上面查看源码的方式看一下就知道了,比如我们改成"上一篇"和"下一篇"

新建App\Foundations\Pagination\CustomerSimplePresenter.php

namespace App\Foundations\Pagination;

use Illuminate\Support\HtmlString;

use Illuminate\Contracts\Pagination\Paginator as PaginatorContract;

class CustomerSimplePresenter extends CustomerPresenter

{

/**

* Create a simple Bootstrap 3 presenter.

*

* @param \Illuminate\Contracts\Pagination\Paginator $paginator

* @return void

*/

public function __construct(PaginatorContract $paginator)

{

$this->paginator = $paginator;

}

/**

* Determine if the underlying paginator being presented has pages to show.

*

* @return bool

*/

public function hasPages()

{

return $this->paginator->hasPages() && count($this->paginator->items()) > 0;

}

/**

* Convert the URL window into Bootstrap HTML.

*

* @return \Illuminate\Support\HtmlString

*/

public function render()

{

if ($this->hasPages()) {

return new HtmlString(sprintf(

'

  • %s %s
',

$this->getPreviousButton('上一篇'),

$this->getNextButton('下一篇')

));

}

return '';

}

}

分页显示:

{!! with(new \App\Foundations\Pagination\CustomerSimplePresenter($categories))->render() !!}

方法就是这个方法,具体修改按照自己需求重写其中对应的显示html元素的方法就可以了。

转载请注明:转载自 Ryan是菜鸟 | LNMP技术栈笔记

以上就是本文的全部内容,希望对大家学习PHP程序设计有所帮助。


http://www.niftyadmin.cn/n/3089493.html

相关文章

项目Alpha冲刺 Day9

1)站立式会议: 2)今日安排: 计划完成活动开始与活动结束两个模块(苏华、赵晓南),具体活动详情页面(范媛媛)以及今日完成对应模块的相关测试(陶涛)…

java保护访问,Java中受保护的访问修饰符

小编典典该网页链接MadProgrammer给出了一个体面的解释:“ protected修饰符指定只能在自己的包中访问该成员(与package-private一样),并且只能由其在另一个包中的类的子类访问。”这意味着受保护的成员必须直接通过其定义的类或该类的子类进行访问&#…

如何做好一个Team leader(转)

1.领导和管理 人们乐于被领导;他们不喜欢被管理,不喜欢像牛一样被驱赶或指挥。 管理者强迫人们服从他们的命令,而领导者则会带领他们一起工作。 管理是客观的,没有个人感情因素,它假定被管理者没有思想和感受…

Java 接口和抽象类是什么,有什么区别

抽象(abstract)和接口(interface)在Java中都是关键字,也就说明他们足够重要,而抽象类和接口为我们面向对象编程提供了非常大的帮助。下面我们就一起来回顾这基础知识。 抽象类 在构建某些未实现方法的类时,你可能会第一个想到接口&#xff0c…

solidity[47]-interface

接口接口本意是物体之间连接的部位。例如电脑的usb接口可以用来连接鼠标也可以连接U盘和硬盘。因此,使用标准的接口可以极大的拓展程序的功能。在solidity语言中,接口可以用来接受相同规则的合约,实现可更新的智能合约。接口定义接口需要有in…

php 服务器打印,php – 如何在服务器上呈现网页(无GUI)进行打印?

我正在尝试用PHP脚本实际打印页面到办公室打印机.这是我到目前为止所得到的:我在服务器上安装了一台打印机,我可以通过命令行的print命令用PHP向它发送作业.我也可以用我的PHP脚本编写纯文本文件,然后将它们添加到打印提示中.所以使用PHP打印PHP生成的纯文本文件就可…

WinForm窗体之间交互的一些方法[转]

实际上过去我也写过类似的主题,这里把各种方法总结一下,内容的确基础了一些,所以这篇文章是写给刚刚学习C#的同行们的,希望对大家有些帮助吧!很抱歉,这篇文章没有诡异的bug来勾起大家的兴趣,但是…

Linux系统之临时和永久修改hostname主机名

1、临时修改主机名:$ sudo hostname 主机名修改只能临时有效,机器重启后会自动还原。 2、永久修改主机名:修改hostname文件(路径:/etc/hostname):$ sudo nano /etc/hostname把hostname文件里面所…