PHP 프레임 워 크 Laravel 플러그 인 페 이 징 사용자 정의 페이지 구현
10798 단어 PHPLaravelPagination페이지 를 나누다
5.1 과 5.2 는 같은 방법 이 어야 합 니 다.저 는 5.2 버 전 을 사용 합 니 다.문 서 는 검색 어 구조 기와 Eloquent 에 대응 하 는 Paginator 를 알려 줍 니 다. simplePaginate 방법 LengthAware Paginator 는 paginate 방법.그럼 소스 코드 를 살 펴 보 겠 습 니 다. paginate 는 render()를 어떻게 실현 합 니까?
Illuminate/Pagination/LengthAwarePaginator.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();
}
......
}
render()에 들 어 오 는 것 은 Presenter 의 인 스 턴 스 이 며,이 실례 화 된 render 방법 으로 페이지 를 나 누 어 표시 합 니 다.없 으 면 Bootstrap ThreePresenter 에서 render()를 호출 하여 Bootstrap ThreePresenter 가 무엇 을 하 는 지 보 세 요.Illuminate/Pagination/BootstrapThreePresenter.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 '';
}
......
}
여기 서 Bootstrap ThreePresenter 가 Presenter Contract 의 인 터 페 이 스 를 실현 하 는 것 을 볼 수 있 습 니 다.render()야 말로 페이지 별로 표 시 된 진정한 실현 입 니 다.구조 방법 중의 첫 번 째 매개 변 수 는 Paginator Contract 입 니 다.Presenter Contract 즉 Presenter 인터페이스 에서 어떤 방법 이 실현 되 어야 하 는 지 계속 보 겠 습 니 다.illuminate/contracts/Pagination/Presenter.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();
}
render 와 hasPages 방법 이 정의 되 어 있 습 니 다.자,이제 분명 합 니 다.페이지 의 디 스 플레이 를 사용자 정의 하려 면 인터페이스 에 있 는 render()와 hasPages()를 작성 하면 됩 니 다.
먼저 하나의 paginate()를 간단하게 실현 하고'이전 페이지'와'다음 페이지'를 보 여 줍 니 다.중간 은 페이지 숫자의 예 입 니 다.
새 파일 은 다음 과 같 습 니 다(개인 습관)
app/Foundations/Pagination/CustomerPresenter.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(' '),//
$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();
}
}
이렇게 간단 합 니 다.주로 render()방법 입 니 다.만약 에 프로젝트 에서 페이지 스타일 을 수정 하거나 페이지 이동 과 같은 수 요 를 추가 하려 면 그 중의 각 디 스 플레이 방법 중의 html 요 소 를 다시 쓰 면 됩 니 다.유연 합 니 다.Blade 템 플 릿 에서 도 이 를 고 쳐 야 합 니 다.예 를 들 어 Paginator 를$users 라 고 부 르 는 것 보다 기본 페이지 표시 가 이 렇 습 니 다.{!! $users->render() !!}
사용자 정의 페이지 표시 로 변경:
{!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}
자,이렇게 하면 페이지 에 페이지 링크 에'이전 페이지'와'다음 페이지'에 숫자 를 넣 는 스타일 을 볼 수 있 을 것 입 니 다.
그럼 simplePaginate 를 확장 하면?사실은 간단 합 니 다.아까 의 customer Presenter 를 계승 하여 hasPages 와 render 를 실현 하면 왜 제 가 위 에서 소스 코드 를 보 는 방식 으로 볼 수 있 는 지 알 수 있 습 니 다.예 를 들 어 우 리 는'전편'과'다음 편'으로 바 뀌 었 습 니 다.
새 App\\Foundation\\Pagination\\CustomerSimple Presenter.php
<?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(
'<ul class="pager">%s %s</ul>',
$this->getPreviousButton(' '),
$this->getNextButton(' ')
));
}
return '';
}
}
페이지 표시:{!! with(new \App\Foundations\Pagination\CustomerSimplePresenter($categories))->render() !!}
방법 은 바로 이 방법 입 니 다.자신의 수요 에 따라 html 요 소 를 표시 하 는 방법 을 구체 적 으로 수정 하면 됩 니 다.
옮 겨 싣 기 설명:라 이언 에서 옮 겨 싣 는 것 은 풋내기|LNMP 기술 창고 노트
이상 은 본 고의 모든 내용 이 므 로 여러분 들 이 PHP 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.