В Laravel отличная библиотека страничного вывода, потому что страничный вывод является одной из основных задач, а библиотека берёт на себя почти всю работу. Раньше изменять свои шаблоны страничного вывода было так же просто, как и работать с самой библиотекой.
Но в целях упрощения экспорта библиотеки страничного вывода в проекты на других фреймворках, в Laravel 5.0 (а может и раньше) появилась намного более сложная — но более переносимая — система шаблонов страничного вывода.
К счастью, в Laravel 5.3 всё стало так, как раньше — легко и просто.
Как работает страничный вывод в Laravel
Для тех, кто не знаком со страничным выводом Laravel, вот краткий обзор того, как он работает.
// файл с маршрутами
Route::get('tasks', function () {
return view('tasks.index')
->with('tasks', Task::paginate(10));
});
// resource/views/tasks/index.blade.php
@foreach ($tasks as $task)
<!-- вывод задачи или чего-то другого -->
@endforeach
{{ $tasks->links() }}
По умолчанию метод PHPpaginate()
на ваших объектах Eloquent читает параметры вашего запроса и определяет, на какой странице вы находитесь. В данном примере он прочитает параметр ?page и возьмёт 10 записей для этой страницы. Он передаст эти 10 записей, и когда мы пойдём циклом PHPforeach
по переменной PHP$tasks
, то цикл будет идти по этим 10 записям.
Но если вы получите эти 10 записей с помощью именно PHPpaginate()
, вместо чего-то наподобие PHPall()
, то вам будет доступен новый метод на объекте PHP$tasks
(или другом результате Eloquent) — это метод PHPlinks()
, он возвращает строку представления, предназначенную для вывода списка кнопок перехода по страницам:
xml<ul class="pagination"> <li class="disabled"><span>«</span></li> <li class="active"><span>1</span></li> <li><a href="http://53pagination.dev?page=2">2</a></li> <li><a href="http://53pagination.dev?page=3">3</a></li> <li><a href="http://53pagination.dev?page=2" rel="next">»</a></li> </ul>
Настройка шаблона страничного вывода в Laravel 5.3
Хорошо, давайте приступим к делу. Как настроить этот шаблон в 5.3?
Отвечающий за отрисовку шаблон по умолчанию находится в компоненте PHPIlluminate\Pagination
в файле resources/views/bootstrap-3.blade.php. Сейчас он выглядит так:
xml<ul class="pagination"> <!-- Ссылка на предыдущую страницу --> @if ($paginator->onFirstPage()) <li class="disabled"><span>«</span></li> @else <li><a href="{{ $paginator->previousPageUrl() }}" rel="prev">«</a></li> @endif <!-- Элементы страничной навигации --> @foreach ($elements as $element) <!-- Разделитель "Три точки" --> @if (is_string($element)) <li class="disabled"><span>{{ $element }}</span></li> @endif <!-- Массив ссылок --> @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 <!-- Ссылка на следующую страницу --> @if ($paginator->hasMorePages()) <li><a href="{{ $paginator->nextPageUrl() }}" rel="next">»</a></li> @else <li class="disabled"><span>»</span></li> @endif </ul>
Для настройки страничного вывода есть два способа: публиковать встроенное представление и редактировать его, или создать новый файл и вручную привязать PHPPaginator
к нему.
Публикация файлов
Наверное самый простой способ — выполнить shphp artisan vendor:publish
. Эта команда опубликует шаблон в vendor/pagination, и вы сможете просто отредактировать его там. Этот вариант предпочтительнее, когда вам не нужны какие-либо специфические настройки.
Ручная привязка файлов
Вы можете создать свой собственный файл страничного вывода и привязаться к нему вручную. Создайте новый файл, дублирующий оригинал, и отредактируйте его в соответствии с вашими задачами. Сохраните его куда-нибудь в resources/views. Пока для простоты используем resources/views/partials/pagination.blade.php.
Теперь зарегистрируем его. Запустите PHP\Illuminate\Pagination\LengthAwarePaginator::defaultView('partials.paginator')
в методе PHPboot()
поставщика услуг (service provider).
Если вы хотите настроить шаблон только для одного конкретного PHPPaginator
, вы можете передать имя представления в метод PHPlinks()
:
Резюме
Итак, для того, чтобы это всё заработало, я сделал следующее:
- Клонировал самую свежую версию Laravel 5.3
- Выполнил Composer install
- Выполнил
shphp artisan vendor:publish
- Отредактировал resources/views/vendor/pagination/default.blade.php и настроил его на свой вкус
Эта инструкция показывает, как настроить Paginator с известной длиной, который встречается чаще всего. Но если вы работаете с простым PHPPaginator
, то его тоже можно настроить — в качестве основы используйте файл simple-default вместо default.
Комментарии (1)
добавьте плиз возможность удаления своих коменттов