《PHP應(yīng)用:PHP框架Laravel插件Pagination實(shí)現(xiàn)自定義分頁》要點(diǎn):
本文介紹了PHP應(yīng)用:PHP框架Laravel插件Pagination實(shí)現(xiàn)自定義分頁,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP編程Laravel 的分頁很方便,其實(shí)擴(kuò)展起來也挺容易的,下面就來做個示例,擴(kuò)展一下 paginate() 和 simplePaginate() 辦法,來實(shí)現(xiàn)我們自定義分頁樣式,比如顯示 "上一頁" 和 "下一頁" ,而不是 "《" 和 "》" ,當(dāng)然擴(kuò)展的辦法掌握了你就可以肆無忌憚的擴(kuò)展一個你想要的分頁了,比如跳轉(zhuǎn)到某一頁,分頁顯示一共多少記錄,當(dāng)前顯示的記錄范圍等等巴拉巴拉的...
PHP編程5.1和5.2應(yīng)該是同樣的辦法,我這里用的是5.2的版本.文檔告訴我們 Paginator 對應(yīng)于查詢語句構(gòu)造器和 Eloquent 的? simplePaginate 辦法,而? LengthAwarePaginator 則等同于? paginate 辦法.那我們還是來看下源碼,具體這個? paginate 是如何實(shí)現(xiàn) render() 的,
PHP編程Illuminate/Pagination/LengthAwarePaginator.php
PHP編程
<?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();
}
......
}
PHP編程render() 中傳入的是一個 Presenter 的實(shí)例,并調(diào)用這個實(shí)例化的 render 辦法來實(shí)現(xiàn)分頁的顯示的.如果沒有則調(diào)用 BootstrapThreePresenter 中 render() 的,來看看 BootstrapThreePresenter 是干嘛的
PHP編程Illuminate/Pagination/BootstrapThreePresenter.php
PHP編程
<?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(
'<ul class="pagination">%s %s %s</ul>',
$this->getPreviousButton(),
$this->getLinks(),
$this->getNextButton()
));
}
return '';
}
......
}
PHP編程這里可以看到 BootstrapThreePresenter 實(shí)現(xiàn)了 PresenterContract 的接口, render() 才是分頁顯示的真正實(shí)現(xiàn),構(gòu)造辦法中的第一個參數(shù) PaginatorContract 其實(shí)就是一個 Paginator 我們繼續(xù)看下 PresenterContract 也就是 Presenter 接口中定義了什么辦法需要實(shí)現(xiàn)
PHP編程illuminate/contracts/Pagination/Presenter.php
PHP編程
<?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();
}
PHP編程其中定義了 render 和 hasPages 辦法需要實(shí)現(xiàn)
PHP編程好了,那我們現(xiàn)在已經(jīng)很清晰了,我們要自定義分頁的顯示,那么就要寫一個我們本身的 Presenter 來實(shí)現(xiàn)接口中的 render() 和 hasPages() 就可以了.
PHP編程首先就來簡單的實(shí)現(xiàn)一個paginate(),顯示出來"上一頁"和"下一頁",中間是分頁數(shù)字的例子.
PHP編程新建文件如下(個人習(xí)慣)
PHP編程app/Foundations/Pagination/CustomerPresenter.php
PHP編程
<?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(
'<ul class="pagination">%s %s %s</ul>',
$this->getPreviousButton('上一頁'),//具體實(shí)現(xiàn)可以查看該辦法
$this->getLinks(),
$this->getNextButton('下一頁')//具體實(shí)現(xiàn)可以查看該辦法
));
}
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() 辦法,如果項目中需要修改分頁樣式,或者添加分頁跳轉(zhuǎn)之類的需求只要重寫其中的各項顯示的辦法中的html元素就可以了,很靈活,在blade模板中也需要修該,比如我們的 Paginator 叫 $users ,默認(rèn)的分頁顯示是這樣的:
PHP編程{!! $users->render() !!}
修改成我們自界說后的分頁顯示:
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/6539.html