사용자 정의 페이징을 구현하기 위한 PHP 프레임워크 Laravel 플러그인 페이지 매김 방법 정보

不言
풀어 주다: 2023-04-01 06:16:01
원래의
2319명이 탐색했습니다.

이 글에서는 커스텀 페이징을 구현하기 위한 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(
        &#39;<ul class="pagination">%s %s %s</ul>&#39;,
        $this->getPreviousButton(),
        $this->getLinks(),
        $this->getNextButton()
      ));
    }

    return &#39;&#39;;
  }
......
}
로그인 후 복사

여기에서 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();
}
로그인 후 복사

는 구현해야 하는 render 및 hasPages 메서드를 정의합니다

좋아, 이제 매우 명확해졌습니다. 페이징 표시를 사용자 정의하려면 직접 작성해야 합니다. Presenter 인터페이스에서 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(
        &#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 요소만 다시 작성하면 됩니다. 이는 매우 유연하며 블레이드 템플릿에서 수정해야 합니다. 예를 들어 Paginator는 $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 AppFoundationsPaginationCustomerSimple 발표자($categories ))->render( ) !!}


메서드가 바로 이 메서드입니다. 필요에 따라 html 요소를 표시하는 해당 메서드를 다시 작성하면 됩니다.

위 내용은 이 글의 전체 내용입니다. 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용은 PHP 중국어 홈페이지를 주목해주세요!

관련 권장 사항:

Laravel 4의 페이지 및 양식 유효성 검사

Laravel의 스로틀 미들웨어 오류 문제를 해결하는 방법

위 내용은 사용자 정의 페이징을 구현하기 위한 PHP 프레임워크 Laravel 플러그인 페이지 매김 방법 정보의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿