Пользовательский просмотр страниц в Laravel 5

Laravel 4.2 имеет возможность указать пользовательское представление в app/config/view.php например:

 /* |-------------------------------------------------------------------------- | Pagination View |-------------------------------------------------------------------------- | | This view will be used to render the pagination link output, and can | be easily customized here to show any view you like. A clean view | compatible with Twitter's Bootstrap is given to you by default. | */ 'pagination' => 'pagination_slider-alt' 

Это исчезло в Laravel 5 по крайней мере относительно view.php .

Есть ли способ воспроизвести это поведение в Laravel 5 ?

Solutions Collecting From Web of "Пользовательский просмотр страниц в Laravel 5"

В Laravel 5.3+ используйте

 $users->links('view.name') 

В Laravel 5.0 – 5.2 вместо

 $users->render() 

использование

 @include('pagination.default', ['paginator' => $users]) 

просмотров / пагинация / default.blade.php

 @if ($paginator->lastPage() > 1) <ul class="pagination"> <li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}"> <a href="{{ $paginator->url(1) }}">Previous</a> </li> @for ($i = 1; $i <= $paginator->lastPage(); $i++) <li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}"> <a href="{{ $paginator->url($i) }}">{{ $i }}</a> </li> @endfor <li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}"> <a href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a> </li> </ul> @endif 

Вот и все.


Если у вас много страниц, используйте этот шаблон:

просмотров / пагинация / limit_links.blade.php

 <?php // config $link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now) ?> @if ($paginator->lastPage() > 1) <ul class="pagination"> <li class="{{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}"> <a href="{{ $paginator->url(1) }}">First</a> </li> @for ($i = 1; $i <= $paginator->lastPage(); $i++) <?php $half_total_links = floor($link_limit / 2); $from = $paginator->currentPage() - $half_total_links; $to = $paginator->currentPage() + $half_total_links; if ($paginator->currentPage() < $half_total_links) { $to += $half_total_links - $paginator->currentPage(); } if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) { $from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1; } ?> @if ($from < $i && $i < $to) <li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}"> <a href="{{ $paginator->url($i) }}">{{ $i }}</a> </li> @endif @endfor <li class="{{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}"> <a href="{{ $paginator->url($paginator->lastPage()) }}">Last</a> </li> </ul> @endif 

В Laravel 5 пользовательская разбивка на страницы основана на презентаторах (классах) вместо представлений.

Предполагая, что в вашем маршрутизируемом коде есть

 $users = Users::paginate(15); 

В L4 вы делали что-то вроде этого в своих взглядах:

 $users->appends(['sort' => 'votes'])->links(); 

В L5 вы вместо этого:

 $users->appends(['sort' => 'votes'])->render(); 

Метод render() принимает экземпляр Illuminate\Contracts\Pagination\Presenter . Вы можете создать собственный класс, который реализует этот контракт и передать его методу render() . Обратите внимание, что Presenter – это интерфейс , а не класс, поэтому вы должны его реализовать , а не расширять . Вот почему вы получаете ошибку.

В качестве альтернативы вы можете расширить языковой параметр Laravel (чтобы использовать его логику разбиения на страницы), а затем передать существующий экземпляр pagination ( $users->... ) для расширенного конструктора классов. Это действительно то, что я сделал для создания моего собеседника Zurb Foundation на основе презентатора Bootstrap, предоставленного Laravel. Он использует всю логику разбиения на страницы Laravel и только переопределяет методы рендеринга.

С моим пользовательским презентатором мои взгляды выглядят так:

 with(new \Stolz\Laravel\Pagination($users->appends(['sort' => 'votes'])))->render(); 

И мой персонализированный ведущий:

 <?php namespace Stolz\Laravel; use Illuminate\Pagination\BootstrapThreePresenter; class Pagination extends BootstrapThreePresenter { /** * Convert the URL window into Zurb Foundation HTML. * * @return string */ public function render() { if( ! $this->hasPages()) return ''; return sprintf( '<ul class="pagination" aria-label="Pagination">%s %s %s</ul></div>', $this->getPreviousButton(), $this->getLinks(), $this->getNextButton() ); } /** * Get HTML wrapper for disabled text. * * @param string $text * @return string */ protected function getDisabledTextWrapper($text) { return '<li class="unavailable" aria-disabled="true"><a href="javascript:void(0)">'.$text.'</a></li>'; } /** * Get HTML wrapper for active text. * * @param string $text * @return string */ protected function getActivePageWrapper($text) { return '<li class="current"><a href="javascript:void(0)">'.$text.'</a></li>'; } /** * Get a pagination "dot" element. * * @return string */ protected function getDots() { return $this->getDisabledTextWrapper('&hellip;'); } } 

Если в Laravel 4.2 я бы использовал:

 {{ $users->links('view.name') }} 

В Laravel 5 вы можете воспроизвести вышеупомянутое:

 @include('view.name', ['object' => $users]) 

Теперь в включенном представлении $object будет иметь доступные методы разбиения на страницы, такие как currentPage() , lastPage() , perPage() и т. Д.

Вы можете просмотреть все доступные методы по адресу http://laravel.com/docs/5.0/pagination

Для Laravel 5.3 (и может быть в других версиях 5.X) добавьте пользовательский код разбивки на страницы в папку просмотра.

ресурсы / виды / пагинация / default.blade.php

 @if ($paginator->hasPages()) <ul class="pagination"> {{-- Previous Page Link --}} @if ($paginator->onFirstPage()) <li class="disabled"><span>&laquo;</span></li> @else <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">&laquo;</a></li> @endif {{-- Pagination Elements --}} @foreach ($elements as $element) {{-- "Three Dots" Separator --}} @if (is_string($element)) <li class="disabled"><span>{{ $element }}</span></li> @endif {{-- Array Of Links --}} @if (is_array($element)) @foreach ($element as $page => $url) @if ($page == $paginator->currentPage()) <li class="active"><span>{{ $page }}</span></li> @else <li><a href="{{ $url }}">{{ $page }}</a></li> @endif @endforeach @endif @endforeach {{-- Next Page Link --}} @if ($paginator->hasMorePages()) <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">&raquo;</a></li> @else <li class="disabled"><span>&raquo;</span></li> @endif </ul> @endif 

затем вызовите этот файл просмотра с разбивкой по страницам из основного файла вида в виде

 {{ $posts->links('pagination.default') }} 

Обновите страницу / default.blade.php, но вы хотите

Может быть, уже слишком поздно, но я хотел бы поделиться другим настраиваемым шаблоном разбивки на страницы, который я создал, создавая первые / следующие и последние / предыдущие ссылки. Он также скрывает ссылки, когда пользователь уже находится на первой / последней странице.

(Необязательно) Вы также можете определить интервал ссылок (количество ссылок до и после текущей страницы)

Пример использования:

  @include('pagination', ['paginator' => $users]) 

или

 @include('pagination', ['paginator' => $users, 'interval' => 5]) 

Вот суть: https://gist.github.com/xxnoobmanxx/33f6082d009c20f77499252b89c35dea

И код:

 @if (isset($paginator) && $paginator->lastPage() > 1) <ul class="pagination"> <?php $interval = isset($interval) ? abs(intval($interval)) : 3 ; $from = $paginator->currentPage() - $interval; if($from < 1){ $from = 1; } $to = $paginator->currentPage() + $interval; if($to > $paginator->lastPage()){ $to = $paginator->lastPage(); } ?> <!-- first/previous --> @if($paginator->currentPage() > 1) <li> <a href="{{ $paginator->url(1) }}" aria-label="First"> <span aria-hidden="true">&laquo;</span> </a> </li> <li> <a href="{{ $paginator->url($paginator->currentPage() - 1) }}" aria-label="Previous"> <span aria-hidden="true">&lsaquo;</span> </a> </li> @endif <!-- links --> @for($i = $from; $i <= $to; $i++) <?php $isCurrentPage = $paginator->currentPage() == $i; ?> <li class="{{ $isCurrentPage ? 'active' : '' }}"> <a href="{{ !$isCurrentPage ? $paginator->url($i) : '#' }}"> {{ $i }} </a> </li> @endfor <!-- next/last --> @if($paginator->currentPage() < $paginator->lastPage()) <li> <a href="{{ $paginator->url($paginator->currentPage() + 1) }}" aria-label="Next"> <span aria-hidden="true">&rsaquo;</span> </a> </li> <li> <a href="{{ $paginator->url($paginator->lastpage()) }}" aria-label="Last"> <span aria-hidden="true">&raquo;</span> </a> </li> @endif </ul> @endif 

Laravel 5 поставляется с загрузчиком Bootstrap 4, если кому-то это нужно.

Сначала создайте нового поставщика услуг.

 php artisan make:provider PaginationServiceProvider 

В методе register пропустите закрытие класса paginator Laravel, который создает и возвращает нового ведущего.

 <?php namespace App\Providers; use Illuminate\Pagination\BootstrapFourPresenter; use Illuminate\Pagination\Paginator; use Illuminate\Support\ServiceProvider; class PaginationServiceProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { Paginator::presenter(function($paginator) { return new BootstrapFourPresenter($paginator); }); } } 

Зарегистрировать нового поставщика в config/app.php

 'providers' => [ //.... App\Providers\PaginationServiceProvider::class, ] 

Я нашел этот пример в Bootstrap 4 Pagination With Laravel

Laravel 5.2 использует для этого докладчиков. Вы можете создавать пользовательские презентаторы или использовать предопределенные. Laravel 5.2 использует BootstrapThreePrensenter из коробки, но легко использовать BootstrapFroutPresenter или любые другие пользовательские докладчики.

 public function index() { return view('pages.guestbook',['entries'=>GuestbookEntry::paginate(25)]); } 

В шаблоне клинка вы можете использовать следующую формулу:

 {!! $entries->render(new \Illuminate\Pagination\BootstrapFourPresenter($entries)) !!} 

Для создания пользовательских презентаторов я рекомендую посмотреть видео Codecourse об этом.

Быстрое исправление JS для разбивки страницы Bootstrap 4 в Laravel 5+

Просто разместите нижеприведенный скрипт на своей странице:

  <script> $('.pagination li').addClass('page-item'); $('.pagination li a').addClass('page-link'); $('.pagination span').addClass('page-link'); </script> 

Преимущества: сохраняет серверный процессор, не нуждается в настройках в вашем приложении.

Вот один для Laravel 5, Bootstrap 4 и без синтаксиса Blade (для тех, кто находят его бесконечно труднее читать ).

Использовать вместо:

 {!! $users->render() !!} 

Использование:

 @include('partials/pagination', ['paginator' => $users]) 

Если partials/pagination является вашим файлом шаблона клинка с нижним содержимым, вставленным в него.

 // Number of links to show. Odd numbers work better $linkCount = 7; $pageCount = $paginator->lastPage(); if ($pageCount > 1) { $currentPage = $paginator->currentPage(); $pagesEitherWay = floor($linkCount / 2); $paginationHtml = '<ul class="pagination">'; // Previous item $previousDisabled = $currentPage == 1 ? 'disabled' : ''; $paginationHtml .= '<li class="page-item '.$previousDisabled.'"> <a class="page-link" href="'.$paginator->url($currentPage - 1).'" aria-label="Previous"> <span aria-hidden="true">&laquo;</span> <span class="sr-only">Previous</span> </a> </li>'; // Set the first and last pages $startPage = ($currentPage - $pagesEitherWay) < 1 ? 1 : $currentPage - $pagesEitherWay; $endPage = ($currentPage + $pagesEitherWay) > $pageCount ? $pageCount : ($currentPage + $pagesEitherWay); // Alter if the start is too close to the end of the list if ($startPage > $pageCount - $linkCount) { $startPage = ($pageCount - $linkCount) + 1; $endPage = $pageCount; } // Alter if the end is too close to the start of the list if ($endPage <= $linkCount) { $startPage = 1; $endPage = $linkCount < $pageCount ? $linkCount : $pageCount; } // Loop through and collect for ($i = $startPage; $i <= $endPage; $i++) { $disabledClass = $i == $currentPage ? 'disabled' : ''; $paginationHtml .= '<li class="page-item '.$disabledClass.'"> <a class="page-link" href="'.$paginator->url($i).'">'.$i.'</a> </li>'; } // Next item $nextDisabled = $currentPage == $pageCount ? 'disabled' : ''; $paginationHtml .= '<li class="page-item '.$nextDisabled.'"> <a class="page-link" href="'.$paginator->url($currentPage + 1).'" aria-label="Next"> <span aria-hidden="true">&raquo;</span> <span class="sr-only">Next</span> </a> </li>'; $paginationHtml .= '</ul>'; echo $paginationHtml; } 

помимо ответа @MantasD, я хотел бы предложить всеобъемлющую настраиваемую разбивку на страницы Laravel. Предполагая использование Laravel 5.2 и следующего вида:

 @include('pagination.default', ['pager' => $users]) 

Особенности

  • Показывать предыдущие и следующие кнопки и отключать их, если они не применяются
  • Отображение значка первой и последней страницы только в том случае, если предыдущая и следующая страницы не выполняются
  • Создавайте относительные ссылки ex: (10, 100, 500 и т. Д.) Вместо ограничений страниц
  • Отображение результата от x до y каждой страницы с помощью вспомогательной функции.

default.blade.php

 @if($pager->lastPage() != 1) <ul class="pagination"> @unless($pager->currentPage() < 3) <li class="paginate_button previous"> <a href="{{ $pager->url(1) }}" title="First Page"><i class="fa fa-angle-double-left"></i></a> </li> @endunless <li class="paginate_button previous @unless($pager->previousPageUrl())disabled @endunless"> <a href="{{ $pager->previousPageUrl() }}"><i class="fa fa-angle-left"></i></a> </li> @while($pager->paging++ < $pager->lastPage()) @if (abs($pager->paging - $pager->currentPage()) >= 2) {{-- Generate relative links (eg. +10,etc) --}} @if(in_array(abs($pager->paging - $pager->currentPage()), array(10, 50, 100, 500, 1000)) and $pager->paging != 1 and $pager->paging != $pager->lastPage()) <li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless"> <a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}"> <!-- + {{ $pager->paging - $pager->currentPage() }} -->{{ $pager->paging }} </a> </li> @endif @else <li class="paginate_button @unless($pager->currentPage() != $pager->paging)active @endunless"> <a title="Results from {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['start'] }} to {{ PaginationStartEnd($pager->paging, $pager->perPage(), $pager->total())['end'] }} of {{ $pager->total() }}" href="{{ $pager->url($pager->paging) }}"> {{ $pager->paging }} </a> </li> @endif @endwhile <li class="paginate_button next @unless($pager->nextPageUrl())disabled @endunless"> <a href="{{ $pager->nextPageUrl() }}"><i class="fa fa-angle-right"></i></a> </li> @unless($pager->lastPage() - $pager->currentPage() < 2) <li class="paginate_button next"> <a href="{{ $pager->url($pager->lastPage()) }}" title="Last Page"><i class="fa fa-angle-double-right"></i></a> </li> @endunless </ul> @endif 

Функция PaginationStartEnd

 if (!function_exists('PaginationStartEnd')) { function PaginationStartEnd($currentPage, $perPage, $total) { $pageStart = number_format( $perPage * ($currentPage - 1)); $pageEnd = $pageStart + $perPage; if ($pageEnd > $total) $pageEnd = $total; $pageStart++; return array('start' => number_format($pageStart), 'end' => number_format($pageEnd)); } } 

Вы можете использовать и настроить его по своему усмотрению.

Примечание: $ pager-> paging – переменная, установленная на 0, объявленная в действии контроллера

Привет, мой код для разбивки на страницы: Используйте в blade-сервере @include ('pagination.default', ['paginator' => $ users])

Просмотров / пагинация / default.blade.php

 @if ($paginator->lastPage() > 1) si la pagina actual es distinto a 1 y hay mas de 5 hojas muestro el boton de 1era hoja --> if actual page is not equals 1, and there is more than 5 pages then I show first page button --> @if ($paginator->currentPage() != 1 && $paginator->lastPage() >= 5) << @endif <!-- si la pagina actual es distinto a 1 muestra el boton de atras --> @if($paginator->currentPage() != 1) <li> <a href="{{ $paginator->url($paginator->currentPage()-1) }}" > < </a> </li> @endif <!-- dibuja las hojas... Tomando un rango de 5 hojas, siempre que puede muestra 2 hojas hacia atras y 2 hacia adelante --> <!-- I draw the pages... I show 2 pages back and 2 pages forward --> @for($i = max($paginator->currentPage()-2, 1); $i <= min(max($paginator->currentPage()-2, 1)+4,$paginator->lastPage()); $i++) <li class="{{ ($paginator->currentPage() == $i) ? ' active' : '' }}"> <a href="{{ $paginator->url($i) }}">{{ $i }}</a> </li> @endfor <!-- si la pagina actual es distinto a la ultima muestra el boton de adelante --> <!-- if actual page is not equal last page then I show the forward button--> @if ($paginator->currentPage() != $paginator->lastPage()) <li> <a href="{{ $paginator->url($paginator->currentPage()+1) }}" > > </a> </li> @endif <!-- si la pagina actual es distinto a la ultima y hay mas de 5 hojas muestra el boton de ultima hoja --> <!-- if actual page is not equal last page, and there is more than 5 pages then I show last page button --> @if ($paginator->currentPage() != $paginator->lastPage() && $paginator->lastPage() >= 5) <li> <a href="{{ $paginator->url($paginator->lastPage()) }}" > >> </a> </li> @endif </ul> 

Благодаря сообщению MantisD, для Bootstrap 4 это работало хорошо.

 <?php $link_limit = 7; // maximum number of links (a little bit inaccurate, but will be ok for now) ?> @if ($paginator->lastPage() > 1) <div id="news_paginate" class="dataTables_paginate paging_simple_numbers"> <ul class="pagination"> <li id="news_previous" class="paginate_button page-item previous {{ ($paginator->currentPage() == 1) ? ' disabled' : '' }}"> <a class="page-link" tabindex="0" href="{{ $paginator->url(1) }}">Previous</a> </li> @for ($i = 1; $i <= $paginator->lastPage(); $i++) <?php $half_total_links = floor($link_limit / 2); $from = $paginator->currentPage() - $half_total_links; $to = $paginator->currentPage() + $half_total_links; if ($paginator->currentPage() < $half_total_links) { $to += $half_total_links - $paginator->currentPage(); } if ($paginator->lastPage() - $paginator->currentPage() < $half_total_links) { $from -= $half_total_links - ($paginator->lastPage() - $paginator->currentPage()) - 1; } ?> @if ($from < $i && $i < $to) <li class="paginate_button page-item {{ ($paginator->currentPage() == $i) ? ' active' : '' }}"> <a class="page-link" href="{{ $paginator->url($i) }}">{{ $i }}</a> </li> @endif @endfor <li id="news_next" class="paginate_button page-item {{ ($paginator->currentPage() == $paginator->lastPage()) ? ' disabled' : '' }}"> @if($paginator->currentPage() == $paginator->lastPage()) <a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()) }}" >End</a> @else <a class="page-link" tabindex="0" href="{{ $paginator->url($paginator->currentPage()+1) }}" >Next</a> @endif </li> </ul> </div> @endif 

Если вы хотите изменить номер страницы в url вместо того, чтобы получать данные типа / pageNo. ex: / 2. вы можете использовать jquery для изменения URL-адреса. У меня есть некоторые данные в методе get с url.

 $(function () { $('.pagination li a').each(function () { var link = $(this).attr('href'); var pageText = $(this).text(); var activePage = parseInt($('.pagination li.active span').text()); if (pageText.trim() == "«") { pageText = activePage - 1; } else if (pageText.trim() == "»") { pageText = activePage + 1; } link = link.replace('?', '/' + pageText + '?'); link = link.replace('&page=' + pageText, ''); $(this).attr('href', link); console.log(link); }); }) 

если вы хотите украсить внешний вид своей разбивки на страницы, я использую класс из бутстрапа, чтобы сделать его более простым и легким

  @if ($students->lastPage() > 1) <ul class="pagination ml-auto"> <li class="{{ ($students->currentPage() == 1) ? ' disabled' : '' }} page-item"> <a class=" page-link " href="{{ $students->url(1) }}" aria-label="Previous"> <span aria-hidden="true">&laquo;</span> <span class="sr-only">Previous</span> </a> </li> @for ($i = 1; $i <= $students->lastPage(); $i++) <li class="{{ ($students->currentPage() == $i) ? ' active' : '' }} page-item"> <a class=" page-link " href="{{ $students->url($i) }}">{{ $i }}</a> </li> @endfor <li class="{{ ($students->currentPage() == $students->lastPage()) ? ' disabled' : '' }} page-item"> <a href="{{ $students->url($students->currentPage()+1) }}" class="page-link" aria-label="Next"> <span aria-hidden="true">&raquo;</span> <span class="sr-only">Next</span> </a> </li> </ul> @endif 

В 5.5 links() заменяется на render() который, похоже, работает аналогичным образом. [Официальная DOC]

замещать

 {{ $replies->links() }} 

с

 {{ $replies->render("pagination::default") }} 

Следующие команды будут генерировать шаблон resources/views/vendor/pagination в resources/views/vendor/pagination

 artisan vendor:publish --tag=laravel-pagination artisan vendor:publish 

В любом файле вида (файлы лезвий) вы можете использовать эти шаблоны, например, следующие:

  • {{ $replies->render("pagination::default") }}
  • {{ $replies->render("pagination::bootstrap-4") }}
  • {{ $replies->render("pagination::simple-bootstrap-4") }}
  • {{ $replies->render("pagination::semantic-ui") }}