>  기사  >  백엔드 개발  >  Laravel은 Pagination 플러그인을 사용하여 사용자 정의 페이지 매김을 구현합니다.

Laravel은 Pagination 플러그인을 사용하여 사용자 정의 페이지 매김을 구현합니다.

*文
*文원래의
2018-01-02 10:03:202068검색

Laravel은 사용자 정의 페이지 매김을 구현하기 위해 어떻게 페이지 매김 플러그인을 사용합니까? 이 기사에서는 사용자 정의 페이징을 구현하기 위한 PHP 프레임워크 Laravel5.1 플러그인 페이지네이션에 대한 관련 정보를 주로 소개합니다. 그것이 모두에게 도움이 되기를 바랍니다.

Laravel의 페이지 매김은 매우 편리하며 실제로 확장하기가 매우 쉽습니다. 아래 예를 들어 paginate() 및 simplePaginate() 메소드를 확장하여 "이전 페이지" 및 "다음" 표시와 같은 사용자 정의 페이징 스타일을 구현해 보겠습니다. 물론 확장 방법을 익히면 특정 페이지로 점프해서 페이징에 총 레코드 수를 표시하는 등 원하는 페이징을 제약 없이 확장할 수 있다. 현재 표시된 레코드 범위는 어쩌구 저쩌구입니다. . .

5.1과 5.2는 같은 방법이어야 합니다. 여기서는 5.2 버전을 사용하고 있습니다. 문서에서는 Paginator가 쿼리 빌더 및 Eloquent의 simplePaginate 메소드에 해당하는 반면 LengthAwarePaginator는 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의 인스턴스입니다. 페이징 표시를 실현하기 위해 렌더 메소드를 사용합니다. 그렇지 않은 경우 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(
        &#39;<ul class="pagination">%s %s %s</ul>&#39;,
        $this->getPreviousButton(),
        $this->getLinks(),
        $this->getNextButton()
      ));
    }

    return &#39;&#39;;
  }
......
}

여기에서 BootstrapThreePresenter가 PresenterContract 인터페이스를 구현하고 render()가 페이징임을 알 수 있습니다. 표시된 것은 생성자의 첫 번째 매개변수 PaginatorContract가 실제로 Paginator라는 것입니다. Presenter 인터페이스에 정의되고 구현되어야 하는 메소드인 PresenterContract를 계속 살펴보겠습니다.

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 메서드를 정의합니다.

좋아, 이제 페이징 표시를 사용자 정의하려면 자체 Presenter를 작성하여 인터페이스와 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(
        &#39;<ul class="pagination">%s %s %s</ul>&#39;,
        $this->getPreviousButton(&#39;上一页&#39;),//具体实现可以查看该方法
        $this->getLinks(),
        $this->getNextButton(&#39;下一页&#39;)//具体实现可以查看该方法
      ));
    }

    return &#39;&#39;;
  }

  /**
   * 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) ? &#39;&#39; : &#39; rel="&#39; . $rel . &#39;"&#39;;

    return &#39;<li><a href="&#39; . htmlentities($url) . &#39;"&#39; . $rel . &#39;>&#39; . $page . &#39;</a></li>&#39;;
  }

  /**
   * Get HTML wrapper for disabled text.
   *
   * @param string $text
   * @return string
   */
  protected function getDisabledTextWrapper($text)
  {
    return &#39;<li class="disabled hide"><span>&#39; . $text . &#39;</span></li>&#39;;
  }

  /**
   * Get HTML wrapper for active text.
   *
   * @param string $text
   * @return string
   */
  protected function getActivePageWrapper($text)
  {
    return &#39;<li class="active"><span>&#39; . $text . &#39;</span></li>&#39;;
  }

  /**
   * Get a pagination "dot" element.
   *
   * @return string
   */
  protected function getDots()
  {
    return $this->getDisabledTextWrapper(&#39;...&#39;);
  }

  /**
   * 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 요소만 다시 작성하면 됩니다. 이는 매우 유연하며 블레이드 템플릿에서 수정해야 합니다. 예를 들어, 기본 페이지 매기기는 $users입니다. 디스플레이는 다음과 같습니다:

{!! $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(
        &#39;<ul class="pager">%s %s</ul>&#39;,
        $this->getPreviousButton(&#39;上一篇&#39;),
        $this->getNextButton(&#39;下一篇&#39;)
      ));
    }

    return &#39;&#39;;
  }

}

페이지 매김 표시:

{!! with(new AppFoundationsPaginationCustomerSimplePresenter($categories))-> ;render() !!}

방법은 이 방법입니다. 특정 수정을 하고 필요에 따라 html 요소를 표시하는 해당 방법을 다시 작성하세요.

관련 권장 사항:

Laravel을 사용하여 Gravatar 아바타 주소를 생성하는 우아한 방법

Laravel 비밀번호 재설정 예에 대한 자세한 설명

laravel 작성 APP 인터페이스(API)

위 내용은 Laravel은 Pagination 플러그인을 사용하여 사용자 정의 페이지 매김을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.