이 글에서는 커스텀 페이징을 구현하기 위한 PHP 프레임워크 Laravel5.1 플러그인 Pagination에 대한 관련 정보를 주로 소개합니다. 필요한 친구들이 참고하면 됩니다.
Laravel의 페이징은 실제로 확장도 매우 쉽습니다. 여기에 예가 있습니다. paginate() 및 simplePaginate() 메서드를 확장하여 "" 및 "》" 대신 "이전 페이지" 및 "다음 페이지"를 표시하는 등의 사용자 정의 페이징 스타일을 구현합니다. 메소드가 마스터됨 특정 페이지로 점프, 페이징에 레코드 개수 표시, 현재 표시되는 레코드 범위 표시 등 원하는 페이징을 무작정 확장할 수 있습니다. . .
5.1과 5.2는 같은 방법이어야 합니다. 여기서는 5.2 버전을 사용하고 있습니다. 문서에서는 Paginator가 쿼리 빌더 및 Eloquent의 simplePaginate 메소드에 해당하는 반면 LengthAwarePaginator는 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 인스턴스에 전달되고 호출됩니다. 페이징 표시를 실현하기 위한 인스턴스화된 렌더링 방법. 그렇지 않은 경우 BootstrapThreePresenter에서 render()를 호출하여 BootstrapThreePresenter가 무엇을 하는지 확인하세요.
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 ''; } ...... }
여기에서 BootstrapThreePresenter가 Presenter Contract 인터페이스를 구현한다는 것을 볼 수 있습니다. render()는 실제입니다. 페이징 표시 구현. 생성 메서드의 첫 번째 매개변수인 PaginatorContract는 구현해야 하는 Presenter 인터페이스에 정의된 메서드인 PresenterContract를 계속 살펴보겠습니다. 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(); }
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(); } }
{!! $users->render() !!}
맞춤형 페이지 매김 디스플레이로 수정됨:
{!! with(new AppFoundationsPaginationCustomerPresenter($categories) )-> render()!!}
좋아, 이제 페이지의 페이징 링크에서 "이전 페이지" 및 "다음 페이지" 스타일과 숫자를 볼 수 있습니다.
그렇다면 simplePaginate를 확장하면 어떨까요? 지금 당장 CustomerPresenter를 상속하고 hasPages를 구현하면 됩니다. 그 이유는 예를 들어 제가 본 것처럼 보시면 됩니다. , "이전 기사" 및 "다음 기사"로 변경합니다. 기사 "
New AppFoundationsPaginationCustomerSimplePresenter.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 AppFoundationsPaginationCustomerSimple 발표자($categories ))->render( ) !!}
메서드가 바로 이 메서드입니다. 필요에 따라 html 요소를 표시하는 해당 메서드를 다시 작성하면 됩니다.
Laravel 4의 페이지 및 양식 유효성 검사
Laravel의 스로틀 미들웨어 오류 문제를 해결하는 방법
위 내용은 사용자 정의 페이징을 구현하기 위한 PHP 프레임워크 Laravel 플러그인 페이지 매김 방법 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!