Version 3 end of life
This version of Silverstripe CMS will not recieve any additional bug fixes or documentation updates. Go to documentation for the most recent stable version.

How to Create a Paginated List

In order to create a paginated list, create a method on your controller that first creates a SS_List that contains all your record, then wraps it in a PaginatedList object. The PaginatedList object should also passed the SS_HTTPRequest object so it can read the current page information from the "?start=" GET var.

The PaginatedList will automatically set up query limits and read the request for information.

mysite/code/Page.php

	/**
	 * Returns a paginated list of all pages in the site.
	 */
	public function PaginatedPages() {
		$list = Page::get();

		return new PaginatedList($list, $this->getRequest());
	}

Note that the concept of "pages" used in pagination does not necessarily mean that we're dealing with Page classes, it's just a term to describe a sub-collection of the list. [/notice]

There are two ways to generate pagination controls: PaginatedList::Pages() and PaginatedList::PaginationSummary(). In this example we will use PaginationSummary().

The first step is to simply list the objects in the template:

mysite/templates/Page.ss

	<ul>
		<% loop $PaginatedPages %>
			<li><a href="$Link">$Title</a></li>
		<% end_loop %>
	</ul>

switch between pages:

mysite/templates/Page.ss

	<% if $PaginatedPages.MoreThanOnePage %>
		<% if $PaginatedPages.NotFirstPage %>
			<a class="prev" href="$PaginatedPages.PrevLink">Prev</a>
		<% end_if %>
		<% loop $PaginatedPages.Pages %>
			<% if $CurrentBool %>
				$PageNum
			<% else %>
				<% if $Link %>
					<a href="$Link">$PageNum</a>
				<% else %>
					...
				<% end_if %>
			<% end_if %>
			<% end_loop %>
		<% if $PaginatedPages.NotLastPage %>
			<a class="next" href="$PaginatedPages.NextLink">Next</a>
		<% end_if %>
	<% end_if %>

[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 PaginatedList will break the pagination. You can disable automatic limiting using the PaginatedList::setLimitItems() method when using custom lists.

	$myPreLimitedList = Page::get()->limit(10);

	$pages = new PaginatedList($myPreLimitedList, $this->getRequest());
	$pages->setLimitItems(false);

Setting the limit of items

	$pages = new PaginatedList(Page::get(), $this->getRequest());
	$pages->setPageLength(25);

list.

Template Variables

VariableDescription
$MoreThanOnePageReturns true when we have a multi-page list, restricted with a limit.
$NextLink, $PrevLinkThey will return blank if there's no appropriate page to go to, so $PrevLink will return blank when you're on the first page.
$CurrentPageCurrent page iterated on.
$TotalPagesThe actual (limited) list of records, use in an inner loop
$TotalItemsThis returns the total number of items across all pages.
$PagesTotal number of pages.
$PageNumPage number, starting at 1 (within $Pages)
$LinkLinks to the current controller URL, setting this page as current via a GET parameter
$CurrentBoolReturns true if you're currently on that page

API Documentation