Эта статья морально устарела :( . Приглашаю продолжить ваше знакомство с Salesforce на нашем Форуме!
В связи с тем, что salesforce нас жестко ограничивает в количестве (1000 единиц в списке) и размере (135 кб view state) данных отображаемых на visuslforce странице использование пагинации является жизненной необходимостью. Планировать ее использование необходимо сразу, чтобы в дальнейшем не оправдываться перед заказчиком когда страница свалится на проде при попытке отобразить реальные данные.
Пример использования пагинации приведу на нашей странице Books из приложения Library. Сделаем так, чтобы наша таблица с книгами содержала не более десяти книг. Вот сам код обновленной страницы и контроллера:
BooksController.cls
public with sharing class BooksController {
public String SearchBookKeyword { get; set; }
public Integer noOfRecords{get; set;}
public Integer size{get;set;}
public List<Book__c> Books { get{
return (List<Book__c>)setCon.getRecords();
} set; }
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size = 10;
string queryString = 'SELECT Id, Name, ISBN__c, Date_Of_Publication__c, (SELECT Id, Author__c, Author__r.Name FROM Book_Author__r) FROM Book__c WHERE Name LIKE \'%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%\'';
SYSTEM.DEBUG('queryString - '+queryString);
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString));
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}
public void SearchBooks() {
setCon = null;
setCon.setPageNumber(1);
}
}
<apex:page controller="BooksController" >
<h1>Books</h1>
<apex:form >
<apex:inputText value="{!SearchBookKeyword}" />
<apex:commandButton action="{!SearchBooks}" value="Search" rerender="BookTableBox" status="SearchStatus"/>
<apex:actionStatus id="SearchStatus">
<apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet>
<apex:facet name="stop"></apex:facet>
</apex:actionStatus>
<apex:outputPanel layout="block" id="BookTableBox">
<apex:panelGrid columns="7">
<apex:commandButton action="{!setCon.first}" status="PaginationStatus" reRender="BookTableBox" value="|<" disabled="{!!setCon.hasPrevious}" title="First Page"/>
<apex:commandButton action="{!setCon.previous}" status="PaginationStatus" reRender="BookTableBox" value="<" disabled="{!!setCon.hasPrevious}" title="Previous Page"/>
<apex:commandButton action="{!setCon.next}" status="PaginationStatus" reRender="BookTableBox" value=">" disabled="{!!setCon.hasNext}" title="Next Page"/>
<apex:commandButton action="{!setCon.last}" status="PaginationStatus" reRender="BookTableBox" value=">|" disabled="{!!setCon.hasNext}" title="Last Page"/>
<apex:outputText >{!(setCon.pageNumber * size)+1-size}-{!IF((setCon.pageNumber * size)>noOfRecords, noOfRecords,(setCon.pageNumber * size))} of {!noOfRecords}</apex:outputText>
<apex:actionStatus id="PaginationStatus">
<apex:facet name="start"><img src="/img/loading.gif" alt="" /></apex:facet>
<apex:facet name="stop"></apex:facet>
</apex:actionStatus>
</apex:panelGrid>
<table id="BookTable">
<tr>
<th>Name</th>
<th>ISBN</th>
<th>Date Of Publication</th>
<th>Author</th>
<th></th>
</tr>
<apex:repeat value="{!Books}" var="book">
<tr>
<td>
<apex:outputField value="{!book.Name}"/>
</td>
<td>
<apex:outputField value="{!book.ISBN__c}"/>
</td>
<td>
<apex:outputField value="{!book.Date_Of_Publication__c}"/>
</td>
<td>
<apex:repeat value="{!book.Book_Author__r}" var="author">
<apex:outputField value="{!author.Author__r.Name}"/> <br />
</apex:repeat>
</td>
<td>
<a href="#">Edit</a><br />
<a href="#">Delete</a>
</td>
</tr>
</apex:repeat>
</table>
</apex:outputPanel>
</apex:form>
</apex:page>
public with sharing class BooksController {
public String SearchBookKeyword { get; set; }
public Integer noOfRecords{get; set;}
public Integer size{get;set;}
public List<Book__c> Books { get{
return (List<Book__c>)setCon.getRecords();
} set; }
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size = 10;
String SearchBookKeywordCreteria = '%'+(SearchBookKeyword == null ? '' : SearchBookKeyword)+'%';
List<Book__c> BookList = [SELECT Id, Name, ISBN__c, Date_Of_Publication__c, (SELECT Id, Author__c, Author__r.Name FROM Book_Author__r) FROM Book__c WHERE Name LIKE :SearchBookKeywordCreteria LIMIT 10000];
setCon = new ApexPages.StandardSetController(BookList);
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}
public void SearchBooks() {
setCon = null;
setCon.setPageNumber(1);
}
}