Home>Article>Backend Development> About the PHP framework Laravel plug-in Pagination method to implement custom paging

About the PHP framework Laravel plug-in Pagination method to implement custom paging

不言
不言 Original
2018-06-13 15:58:43 2230browse

This article mainly introduces the relevant information about the PHP framework Laravel5.1 plug-in Pagination to implement custom paging. Friends who need it can refer to

Laravel’s paging is very convenient, and it is actually quite easy to expand. Let's take an example and extend the paginate() and simplePaginate() methods to implement our custom paging style, such as displaying "previous page" and "next page" instead of "《" and "》". Of course, once you master the expansion method, you can unscrupulously expand a paging you want, such as jumping to a certain page, displaying the total number of records in the paging, the currently displayed record range, and so on. . .

5.1 and 5.2 should be the same method. I am using the 5.2 version here. The documentation tells us that Paginator corresponds to the query builder and Eloquent's simplePaginate method, while LengthAwarePaginator is equivalent to the paginate method. Then let’s take a look at the source code to see how this paginate implements render(),

Illuminate/Pagination/LengthAwarePaginator.php

What is passed in
render(); } ...... }

render() is an instance of Presenter, and the instantiated render method is called to realize paging display. If not, call render() in BootstrapThreePresenter to see what BootstrapThreePresenter does

Illuminate/Pagination/BootstrapThreePresenter.php

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( '
    %s %s %s
', $this->getPreviousButton(), $this->getLinks(), $this->getNextButton() )); } return ''; } ...... }

Here you can see that BootstrapThreePresenter implements the interface of PresenterContract. render() is the real implementation of paging display. The first parameter PaginatorContract in the construction method is actually a Paginator. Let’s continue to look at PresenterContract. That is, what methods are defined in the Presenter interface and need to be implemented

illuminate/contracts/Pagination/Presenter.php


      

The render and hasPages methods are defined and need to be implemented

Okay, now we are very clear. If we want to customize the paging display, we must write our own Presenter to implement the interface. render() and hasPages() in it will do the trick.

First of all, let's simply implement a paginate() to display "previous page" and "next page", with an example of pagination numbers in the middle.

Create a new file as follows (personal habit)

app/Foundations/Pagination/CustomerPresenter.php

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( '
    %s %s %s
', $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 '
  • ' . $page . '
  • '; } /** * Get HTML wrapper for disabled text. * * @param string $text * @return string */ protected function getDisabledTextWrapper($text) { return '
  • ' . $text . '
  • '; } /** * Get HTML wrapper for active text. * * @param string $text * @return string */ protected function getActivePageWrapper($text) { return '
  • ' . $text . '
  • '; } /** * 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(); } }

    It’s that simple, mainly the render() method. If you need to modify the paging style or add paging jumps in the project, just rewrite the html elements in each display method. It’s very easy. Flexible, this also needs to be fixed in the blade template. For example, our Paginator is called $users. The default paging display is like this:

    {!! $users->render() !!}
    Modify to our customized paging display:

    {!! with(new \App\Foundations\Pagination\CustomerPresenter($categories))->render() !!}
    Okay, now you should be able to see on the page that the paging links contain the style of "previous page" and "next page" plus numbers.

    So what if you extend simplePaginate? It's actually very simple. You just need to inherit the CustomerPresenter just now and implement hasPages and render. As for why, you can just look at it the way I viewed the source code above. For example, we change it to "Previous article" "and"Next article"

    New App\Foundations\Pagination\CustomerSimplePresenter.php

    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( '
      %s %s
    ', $this->getPreviousButton('上一篇'), $this->getNextButton('下一篇') )); } return ''; } }

    Pagination display:

    {!! with(new \App\Foundations\Pagination\CustomerSimplePresenter($categories))->render() !!}

    The method is this method. Just modify it and rewrite the corresponding method of displaying html elements according to your own needs.

    The above is the entire content of this article. I hope it will be helpful to everyone's study. For more related content, please pay attention to the PHP Chinese website!

    Related recommendations:

    Pages and Form Validation in Laravel 4

    How to solve the problem of Laravel's throttle middleware failure

    The above is the detailed content of About the PHP framework Laravel plug-in Pagination method to implement custom paging. For more information, please follow other related articles on the PHP Chinese website!

    Statement:
    The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn