Cet article présente principalement les informations pertinentes sur la pagination du plug-in PHP Laravel5.1 pour implémenter une pagination personnalisée. Les amis dans le besoin peuvent s'y référer
La pagination de Laravel est très pratique, et elle est en fait assez. facile à développer. Prenons un exemple et étendons les méthodes paginate() et simplePaginate() pour implémenter notre style de pagination personnalisé, comme afficher la "page précédente" et la "page suivante" au lieu de "《" et "》 Bien sûr". , une fois que vous maîtrisez la méthode d'expansion, vous pouvez sans scrupules développer une pagination souhaitée, par exemple accéder à une certaine page, afficher le nombre total d'enregistrements dans la pagination, la plage d'enregistrements actuellement affichés, etc. . .
5.1 et 5.2 devraient être la même méthode. J'utilise ici la version 5.2. La documentation nous indique que Paginator correspond au générateur de requêtes et à la méthode simplePaginate d'Eloquent, tandis que lengthAwarePaginator est équivalent à la méthode paginate. Jetons ensuite un coup d'œil au code source. Plus précisément, comment paginate implémente render() ?
Ce qui est transmis dans render() est une instance de Presenter et la méthode de rendu instanciée. est appelé pour réaliser l'affichage de la pagination. Sinon, appelez render() dans BootstrapThreePresenter pour voir ce que fait BootstrapThreePresenter
Illuminate/Pagination/BootstrapThreePresenter.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(); } ...... }
Ici, vous pouvez voir que BootstrapThreePresenter implémente l'interface de PresenterContract. render() est la véritable implémentation de l'affichage de pagination. Le premier paramètre PaginatorContract dans la méthode constructeur est en fait un Paginator. Ensuite, PresenterContract correspond aux méthodes définies dans l'interface Presenter qui doivent être implémentées
illuminate/contracts/Pagination/Presenter.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 ''; } ...... }
Il définit les méthodes render et hasPages qui doivent être implémentées
<?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(); }
Le nouveau fichier est le suivant (habitude personnelle)
app/Foundations/Pagination/CustomerPresenter.phpC'est aussi simple que cela, principalement la méthode render() Si vous devez modifier le style de pagination ou ajouter des sauts de pagination dans le projet, réécrivez simplement les éléments html dans chaque méthode d'affichage, très flexible. doit également être modifié dans le modèle de lame. Par exemple, notre Paginator s'appelle $users, et l'affichage de pagination par défaut est comme ceci :
{!! $users->render() ! !}
<?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(); } }
{!! with(new AppFoundationsPaginationCustomerPresenter($categories))->render() !!}
D'accord, vous devriez maintenant pouvoir voir sur la page que les liens de pagination contiennent le style « page précédente » et « page suivante » plus des chiffres.
Et si vous étendiez simplePaginate ? C'est en fait très simple. Il vous suffit d'hériter de CustomerPresenter tout à l'heure et d'implémenter hasPages et de le rendre. Quant à savoir pourquoi, vous pouvez simplement le regarder comme j'ai vu le code source. ci-dessus. Par exemple, nous le modifions en "Article précédent" " et "Article suivant"
New AppFoundationsPaginationCustomerSimplePresenter.php
Affichage de la pagination :
<?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 ''; } }
La méthode est cette méthode, Pour des modifications spécifiques, réécrivez simplement la méthode correspondante d'affichage des éléments html en fonction de vos propres besoins.
Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !Recommandations associées :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!