Постраничный вывод данных (пагинация)
11.x
.
Почему это важно?
Настройка
В других фрейморках пагинация (постраничный вывод данных) может быть большой проблемой. Laravel же делает этот процесс безболезненным. В файле настроек app/config/view.php
есть единственный параметр pagination
, который указывает, какой шаблон (views) нужно использовать при создании навигации по страницам. Изначально Laravel включает в себя два таких шаблона.
Шаблон pagination::slider
выведет “умный” список страниц в зависимости от текущего положения, а шаблон pagination::simple
просто создаст ссылки “Назад” и “Вперёд” для простой навигации. Оба шаблона совместимы с Twitter Bootstrap.
Использование
Есть несколько способов разделения данных на страницы. Самый простой – используя метод paginate
объекта-[построителя запросов](/queries] или на модели Eloquent.
Постраничный вывод выборки из БД
$users = DB::table('users')->paginate(15);
Примечание: Если вы используете
groupBy
в запросе, то встроенная пагинация Laravel будет работать неэффективно. В этом случае вам нужно сделать пагинацию вручную при помощиPaginator::make
.
Постраничный вывод запроса Eloquent
$allUsers = User::paginate(15);
$users = User::where('votes', '>', 100)->paginate(15);
Аргумент, передаваемый методу paginate
– число строк, которые вы хотите видеть на одной странице. Блок пагинации в шаблоне отображаются методом links
:
<div class="container">
<?php foreach ($users as $user): ?>
<?php echo $user->name; ?>
<?php endforeach; ?>
</div>
<?php echo $users->links(); ?>
Это всё, что нужно для создания страничного вывода! Заметьте, что нам не понадобилось уведомлять фреймворк о номере текущей страницы – Laravel определит его сам. Номер страницы добавляется к урлу в виде строки запроса с параметром page: ?page=N
.
Вы можете получить информацию о текущем положении с помощью этих методов:
getCurrentPage
getLastPage
getPerPage
getTotal
getFrom
getTo
Простая пагинация
If you are only showing “Next” and “Previous” links in your pagination view, you have the option of using the simplePaginate
method to perform a more efficient query. This is useful for larger datasets when you do not require the display of exact page numbers on your view:
Если вам нужна простая навигация, состоящая только из кнопок “Вперед” и “Назад” (полезно на больших объемах данных, где нужны только последние данные), то воспользуйтесь методом simplePaginate
. Это уменьшит количество запросов к БД.
$someUsers = User::where('votes', '>', 100)->simplePaginate(15);
Создание пагинации вручную
Иногда вам может потребоваться создать объект пагинации вручную. Вы можете сделать это методом `Paginator::make`:
$paginator = Paginator::make($items, $totalItems, $perPage);
Настройка URI для вывода ссылок
$users = User::paginate();
$users->setBaseUrl('custom/url');
Пример выше создаст ссылки наподобие: http://example.com/custom/url?page=2
Параметры в ссылках
Вы можете добавить параметры запросов к ссылкам страниц с помощью метода appends
страничного объекта:
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>
Код выше создаст ссылки наподобие http://example.com/something?page=2&sort=votes
Чтобы добавить к урлу хэш-последовательность (“#xyz” в конце урла), используйте метод fragment
:
<?php echo $users->fragment('foo')->links(); ?>
Код выше создаст ссылки типа http://example.com/something?page=2#foo
Конвертация To JSON
Класс Paginator
реализует (implements) Illuminate\Support\Contracts\JsonableInterface
, следовательно, у него есть метод toJson
, который используется для вывода пагинируемой информации в формате json. Помимо пагинируемых данных, которые располагаются в data
, этот метод добавляет мета-информацию, а именно: total
, current_page
, last_page
, from
, to
.
Изменение отображения
По умолчанию пагинация в Laravel совместима с Twitter Bootstrap. Если вы хотите изменить html-код ссылок пагинации, вам нужно использовать свой презентер.
Расширение абстрактного презентера
Допустим, наш проект построен на css-фреймворке Zurb Foundation. Расширим (extends) Illuminate\Pagination\Presenter
и реализуем его абстрактные методы:
class ZurbPresenter extends Illuminate\Pagination\Presenter {
public function getActivePageWrapper($text)
{
return '<li class="current"><a href="">'.$text.'</a></li>';
}
public function getDisabledTextWrapper($text)
{
return '<li class="unavailable"><a href="">'.$text.'</a></li>';
}
public function getPageLinkWrapper($url, $page, $rel = null)
{
return '<li><a href="'.$url.'">'.$page.'</a></li>';
}
}
Использование своего презентера
Создаем шаблон в
app/views
, который должен отображать ссылки пагинации, с таким, например, содержимым:-
render(); ?>
В конфиге
app/config/view.php
указываем имя этого шаблона (параметр'pagination'
).