Есть две вещи, которые вам нужно сделать, чтобы заставить это работать.В целом, это довольно просто.Он описан в DBIC Cookbook .
Контроллер
Ваш list
метод, так как он содержит только полный список страниц без страниц, который был сохранен в вашем base
цепной метод.Теперь вам нужно добавить код, чтобы получить параметр URL и уменьшить список.
sub list :Chained('base'): PathPart('list'): Args(0) {
my ($self, $c) = @_;
if (my $page = $c->req->params->{page}) {
# TODO: validate $page
my $rs = $c->stash->{books};
$c->stash->{books} = $rs->search(undef, {
page => $page,
rows => 10, # or how many you want
});
}
$c->stash(template => 'book/list.tt2');
}
Этот код заменит ваш сохраненный набор результатов новым, к которому прикреплен LIMIT
.Помните, что наборы результатов могут связываться в стек, поэтому с каждым новым ->search
вы называете один объект набора результатов, возвращается новый, более детализированный.Никакой SQL не запускается до тех пор, пока позже в вашем шаблоне, где вы используете его в контексте списка, что подразумевает вызов ->all
.
Нет необходимости вносить какие-либо изменения в шаблон для отображения меньшего списка.
Однако вы, вероятно, хотите контролировать свою нумерацию страниц.Вы можете сделать это с помощью объекта Data :: Page .Ваш набор результатов обеспечивает это для вас.Однако это происходит за счет дополнительного COUNT
запроса.Включите переменную окружения DBIC_TRACE=1
, чтобы взглянуть на запросы, выполняемые в фоновом режиме, если вас интересует, что происходит.
В вашем методе list
, в который мы только что добавили приведенный выше код, спрячьтепейджер.
my $rs = $c->stash->{books};
$c->stash->{books} = $rs->search(undef, {
page => $page,
rows => 10, # or how many you want
});
$c->stash->{pager} = $rs->pager;
Template
Теперь нам нужно отобразить некоторые элементы управления в шаблоне.Я не буду показывать все из них, но только дать вам представление.Поскольку мы по-прежнему поддерживаем полный список, мы можем отображать элементы управления только при наличии пейджера.
<table>
[%# ... %]
<tbody>
[% FOREACH book IN books -%]
<tr>
[%# ... %]
</tr>
[% END -%]
</tbody>
</table>
[% IF pager %]
<ul>
<li><a href="?page=[% pager.first_page %]">First page</a></li>
</ul>
[% END %]
Здесь нет необходимости использовать c.uri_for
, потому что все, что мы делаем, это добавляем параметр URL.Браузер пользователя достаточно умен, чтобы сделать этот относительный URL-адрес только с параметрами, указывающими на то же, на котором он уже был.Таким образом, если пользователь просматривает https://example.org/list?page=2
, щелкнув ссылку Первая страница ?page=1
, вы фактически перейдете к https://example.org/list?page=1
.