2011-03-31 03:01:04 +02:00
|
|
|
# Paginating A List
|
|
|
|
|
|
|
|
Adding pagination to a `[api:DataList]` or `[DataObjectSet]` is quite simple. All
|
|
|
|
you need to do is wrap the object in a `[api:PaginatedList]` decorator, which takes
|
|
|
|
care of fetching a sub-set of the total list and presenting it to the template.
|
|
|
|
|
|
|
|
In order to create a paginated list, you can create a method on your controller
|
|
|
|
that first creates a `DataList` that will return all pages, and then wraps it
|
2012-06-17 06:01:48 +02:00
|
|
|
in a `[api:PaginatedList]` object. The `PaginatedList` object is also passed the
|
2011-03-31 03:01:04 +02:00
|
|
|
HTTP request object so it can read the current page information from the
|
|
|
|
"?start=" GET var.
|
|
|
|
|
|
|
|
The paginator will automatically set up query limits and read the request for
|
|
|
|
information.
|
|
|
|
|
|
|
|
:::php
|
|
|
|
/**
|
|
|
|
* Returns a paginated list of all pages in the site.
|
|
|
|
*/
|
|
|
|
public function PaginatedPages() {
|
|
|
|
$pages = DataList::create('Page');
|
|
|
|
return new PaginatedList($pages, $this->request);
|
|
|
|
}
|
|
|
|
|
|
|
|
## Setting Up The Template
|
|
|
|
|
|
|
|
Now all that remains is to render this list into a template, along with pagination
|
|
|
|
controls. There are two ways to generate pagination controls:
|
2012-06-17 06:01:48 +02:00
|
|
|
`[api:PaginatedList->Pages()]` and `[api:PaginatedList->PaginationSummary()]`. In
|
2011-03-31 03:01:04 +02:00
|
|
|
this example we will use `PaginationSummary()`.
|
|
|
|
|
|
|
|
The first step is to simply list the objects in the template:
|
|
|
|
|
|
|
|
:::ss
|
|
|
|
<ul>
|
|
|
|
<% control PaginatedPages %>
|
|
|
|
<li><a href="$Link">$Title</a></li>
|
|
|
|
<% end_control %>
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
By default this will display 10 pages at a time. The next step is to add pagination
|
|
|
|
controls below this so the user can switch between pages:
|
|
|
|
|
|
|
|
:::ss
|
|
|
|
<% if PaginatedPages.MoreThanOnePage %>
|
|
|
|
<% if PaginatedPages.NotFirstPage %>
|
|
|
|
<a class="prev" href="$PaginatedPages.PrevLink">Prev</a>
|
|
|
|
<% end_if %>
|
|
|
|
<% control PaginatedPages.Pages %>
|
|
|
|
<% if CurrentBool %>
|
|
|
|
$PageNum
|
|
|
|
<% else %>
|
|
|
|
<% if Link %>
|
|
|
|
<a href="$Link">$PageNum</a>
|
|
|
|
<% else %>
|
|
|
|
...
|
|
|
|
<% end_if %>
|
|
|
|
<% end_if %>
|
|
|
|
<% end_control %>
|
|
|
|
<% if PaginatedPages.NotLastPage %>
|
|
|
|
<a class="next" href="$PaginatedPages.NextLink">Next</a>
|
|
|
|
<% end_if %>
|
|
|
|
<% end_if %>
|
|
|
|
|
|
|
|
If there is more than one page, this block will render a set of pagination
|
2012-06-17 06:01:48 +02:00
|
|
|
controls in the form `[1] ... [3] [4] [[5]] [6] [7] ... [10]`.
|
|
|
|
|
|
|
|
## Paginating Custom Lists
|
|
|
|
|
|
|
|
In some situations where you are generating the list yourself, the underlying
|
|
|
|
list will already contain only the items that you wish to display on the current
|
|
|
|
page. In this situation the automatic limiting done by `[api:PaginatedList]`
|
|
|
|
will break the pagination. You can disable automatic limiting using the
|
|
|
|
`[api:PaginatedList->setLimitItems()]` method when using custom lists.
|