This demo is a single Apex custom controller, two Visualforce pages and a wrapper class allowing the user to search an object by keyword (via Dynamic SOQL) and return the results in a page block table with corresponding checkboxes. Selecting one or more checkboxes and clicking the 'See Results' button displays the list of the selected items.
This is a very common function as you typically want to search for stuff and then process some selected stuff.
You can run this demo on my developer site.
Custom Controller - CategorySearchController
public class CategorySearchController {
// the results from the search. do not init the results or a blank rows show up initially on page load
public List<categoryWrapper> searchResults {get;set;}
// the categories that were checked/selected.
public List<categoryWrapper> selectedCategories {
get {
if (selectedCategories == null) selectedCategories = new List<categoryWrapper>();
return selectedCategories;
}
set;
}
// the text in the search box
public string searchText {
get {
if (searchText == null) searchText = 'Category'; // prefill the serach box for ease of use
return searchText;
}
set;
}
// constructor
public CategorySearchController() {}
// fired when the search button is clicked
public PageReference search() {
if (searchResults == null) {
searchResults = new List<categoryWrapper>(); // init the list if it is null
} else {
searchResults.clear(); // clear out the current results if they exist
}
// Note: you could have achieved the same results as above by just using:
// searchResults = new List<categoryWrapper>();
// dynamic soql for fun
String qry = 'Select c.Name, c.Id From Cat3__c c Where c.Name LIKE '%'+searchText+'%' Order By c.Name';
// may need to modify for governor limits??
for(Cat3__c c : Database.query(qry)) {
// create a new wrapper by passing it the category in the constructor
CategoryWrapper cw = new CategoryWrapper(c);
// add the wrapper to the results
searchResults.add(cw);
}
return null;
}
public PageReference next() {
// clear out the currently selected categories
selectedCategories.clear();
// add the selected categories to a new List
for (CategoryWrapper cw : searchResults) {
if (cw.checked)
selectedCategories.add(new CategoryWrapper(cw.cat));
}
// ensure they selected at least one category or show an error message.
if (selectedCategories.size() > 0) {
return Page.Category_Results;
} else {
ApexPages.addMessage(new ApexPages.message(ApexPages.severity.ERROR,'Please select at least one Category.'));
return null;
}
}
// fired when the back button is clicked
public PageReference back() {
return Page.Category_Search;
}
}
Visualforce Search Page - Category_Search
<apex:page controller="CategorySearchController">
<apex:form >
<apex:pageBlock mode="edit" id="block">
<apex:pageBlockButtons >
<apex:commandButton action="{!next}" value="See Results" disabled="{!ISNULL(searchResults)}"/>
</apex:pageBlockButtons>
<apex:pageMessages />
<apex:pageBlockSection >
<apex:pageBlockSectionItem >
<apex:outputLabel for="searchText">Search for Categories</apex:outputLabel>
<apex:panelGroup >
<apex:inputText id="searchText" value="{!searchText}"/>
<!-- We could have rerendered just the resultsBlock below but we want the -->
<!-- 'See Results' button to update also so that it is clickable. -->
<apex:commandButton value="Search" action="{!search}" rerender="block" status="status"/>
</apex:panelGroup>
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
<apex:actionStatus id="status" startText="Searching... please wait..."/>
<apex:pageBlockSection title="Search Results" id="resultsBlock" columns="1">
<apex:pageBlockTable value="{!searchResults}" var="c" rendered="{!NOT(ISNULL(searchResults))}">
<apex:column width="25px">
<apex:inputCheckbox value="{!c.checked}"/>
</apex:column>
<apex:column value="{!c.cat.Name}" headerValue="Name"/>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Visualforce Results Page - Category_Results
<apex:page controller="CategorySearchController">
<apex:form >
<apex:pageBlock >
<apex:pageBlockButtons >
<apex:commandButton action="{!back}" value="Back"/>
</apex:pageBlockButtons>
<apex:pageMessages />
<apex:pageBlockSection title="You Selected" columns="1">
<apex:pageBlockTable value="{!selectedCategories}" var="c">
<apex:column value="{!c.cat.Name}"/>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Wrapper Class - CategoryWrapper
public class CategoryWrapper {
public Boolean checked{ get; set; }
public Cat3__c cat { get; set;}
public CategoryWrapper(){
cat = new Cat3__c();
checked = false;
}
public CategoryWrapper(Cat3__c c){
cat = c;
checked = false;
}
public static testMethod void testMe() {
CategoryWrapper cw = new CategoryWrapper();
System.assertEquals(cw.checked,false);
CategoryWrapper cw2 = new CategoryWrapper(new Cat3__c(name='Test1'));
System.assertEquals(cw2.cat.name,'Test1');
System.assertEquals(cw2.checked,false);
}
}