Постраничный вывод данных (пагинация)
Настройка
В других фрейморках пагинация (постраничный вывод данных) может быть большой проблемой. 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'
).