Настройка
В других фреймворках страничный вывод может быть большой проблемой. Laravel же делает этот процесс безболезненным. В файле настроек app/config/view.php есть единственный параметр: pagination — который указывает, какой шаблон нужно использовать при создании навигации по страницам. Изначально Laravel включает в себя два таких шаблона.
Шаблон pagination::slider выведет «умный» список страниц в зависимости от текущего положения, а шаблон pagination::simple просто создаст ссылки «Назад» и «Вперёд» для простой навигации. Оба шаблона изначально совместимы с Twitter Bootstrap.
Использование
Есть несколько способов разделения данных на страницы. Самый простой — используя метод PHPpaginate()
объекта-строителя запросов или на модели Eloquent.
Страничный вывод выборки из БД
$users = DB::table('users')->paginate(15);
На данный момент операции страничного вывода, которые используют оператор PHPgroupBy
, не могут эффективно выполняться в Laravel. Если вам необходимо использовать PHPgroupBy
для постраничного набора результатов, рекомендуется делать запрос в БД вручную и использовать PHPPaginator::make()
.
Страничный вывод запроса Eloquent
$allUsers = User::paginate(15);
$someUsers = User::where('votes', '>', 100)->paginate(15);
Аргумент, передаваемый методу PHPpaginate()
— число строк, которые вы хотите видеть на одной странице. Как только вы получили результаты вы можете показать их с помощью шаблона и создать ссылки на страницы методом PHPlinks()
:
<div class="container">
<?php foreach ($users as $user): ?>
<?php echo $user->name; ?>
<?php endforeach; ?>
</div>
<?php echo $users->links(); ?>
Это всё, что нужно для создания страничного вывода! Заметьте, что нам не понадобилось уведомлять фреймворк о номере текущей страницы — Laravel определит его сам.
добавлено в 4.1 ()
Вы можете получить информацию о текущем положении с помощью этих методов:
PHPgetCurrentPage()
PHPgetLastPage()
PHPgetPerPage()
PHPgetTotal()
PHPgetFrom()
PHPgetTo()
PHPcount()
добавлено в 4.2 ()
Если в вашем страничном представлении вы показываете только ссылки «Далее» и «Назад», тогда у вас есть вариант использовать метод PHPsimplePaginate()
для выполнения более эффективного запроса. Это полезно для больших наборов данных, когда вам не требуется показывать точное количество страниц в вашем представлении:
$someUsers = User::where('votes', '>', 100)->simplePaginate(15);
Создание страничного вывода вручную
Иногда вам может потребоваться создать объект страничного вывода вручную. Вы можете сделать это методом PHPPaginator::make()
:
$paginator = Paginator::make($items, $totalItems, $perPage);
Настройка URI для вывода ссылок
$users = User::paginate();
$users->setBaseUrl('custom/url');
Пример выше создаст ссылки наподобие:
http://example.com/custom/url?page=2.
Параметры в ссылках
Вы можете добавить параметры запросов к ссылкам страниц с помощью метода PHPappends()
страничного объекта:
<?php echo $users->appends(array('sort' => 'votes'))->links(); ?>
Код выше создаст ссылки наподобие:
http://example.com/something?page=2&sort=votes.
добавлено в 4.1 ()
Если вы хотите добавить «хэш-фрагмент» в URL-адреса страничного вывода, вы можете использовать метод PHPfragment()
:
<?php echo $users->fragment('foo')->links(); ?>
Вызов этого метода сгенерирует URL-адреса наподобие:
http://example.com/something?page=2#foo
Преобразование в JSON
Класс PHPPaginator
реализует соглашение Illuminate\Support\Contracts\JsonableInterface и предоставляет метод PHPtoJson()
. Вы также можете преобразовать экземпляр PHPPaginator
в JSON, вернув его из маршрута. JSON-форма экземпляра будет включать некоторые «мета-данные», такие как total, current_page, last_page, from и to. Данные экземпляра будут доступны через ключ data в массиве JSON.
Пользовательские представители
Представитель (presenter) страничного вывода по умолчанию совместим с автозагрузкой «из коробки», но вы можете настроить его по вашему выбору.
Наследование абстрактного представителя
Наследуйте класс PHPIlluminate\Pagination\Presenter
и реализуйте его абстрактные методы. Например, PHPPresenter
для Zurb Foundation может выглядеть так:
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, которое будет служить в качестве пользовательского представителя. Затем замените значение параметра confpagination
в конфигурационном файле app/config/view.php на имя нового представления. И наконец поместите следующий код в представление вашего пользовательского представителя:
<ul class="pagination">
<?php echo with(new ZurbPresenter($paginator))->render(); ?>
</ul>