PHP 프레임 워 크 Laravel 플러그 인 페 이 징 사용자 정의 페이지 구현

Laravel 의 페이지 를 나 누 는 것 은 매우 편리 합 니 다.사실은 확장 하기 도 쉽 습 니 다.다음은 예 를 들 어 paginate()와 simplePaginate()방법 을 확장 하여 우리 가 사용자 정의 페이지 스타일 을 실현 합 니 다.예 를 들 어'이전 페이지'와'다음 페이지'를 표시 합 니 다.물론 확장 하 는 방법 을 파악 하면 원 하 는 페이지 를 자 유 롭 게 확장 할 수 있 습 니 다.예 를 들 어 한 페이지 로 넘 어가 면 모두 몇 개의 기록 이 있 는 지,현재 표 시 된 기록 범위 등 바라 바라 의 것 이다.
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 프로 그래 밍 을 배 우 는 데 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기