dotCMS: paginate results from pulling related contents
Pull Related Content
In dotCMS, the #pullRelatedContent() macro is used to create a list of all content related to some base content through a named relationship.
Syntax for the call is as below. The nice thing about it is that the call doesn't care if your content inode
refers to a child or parent to the relationship. For example, let's say you have a bunch of books and a bunch of authors linked through a relationship called book_authors
. In the call below, content inode
could the inode
of a book or an author.
#pullRelatedContent("relationship name" "content inode" "limit" "sort by")
After the call, you will have a $list
variable available that references a java.util.ArrayList
with your results.
Paginating Content
When you have a query that you know will return a large set of results, you should paginate
the results. This means showing only a portion of the results at a time with controls that let user go to the next/previous page or even click on a specific page number within the results. In dotCMS, the #pageContent() does this.
#pageContent("query" "sort by" "# per page" "# current page")
Actually, all it does is process your query and leave you with the following variables: list
, totalResults
and totalPages
. You then output the actual pagination controls for yourself based on this information.
Paginating Related Content
Both #pageContent()
and #pullRelatedContent()
take query as a parameter and leave you with a $list
- which means you cannot call #pageContent()
on the results of #pullRelatedContent()
(e.g. #pageContent(#pullRelatedContent(...), ...)
.
So how do you paginate related content?
The answer is that you need to use a relationship query in #pageContent()
, providing the identity
(not inode
of the content whose related items you wish to show. I do this with my own macro, as below.
#macro ( paginateRelatedContent $relationshipName $baseInode ) #set($x = 0) #set($x = $webapi.getIdentifierInode($baseInode)) #if($x < 1) #set($x = $inode) #end #set($uQuery = "+type:content +live:true +deleted:false +${relationshipName}:${x}") #pageContent("$uQuery" "text1" "3" "$page") #end
Syntax is below.
#paginateRelatedContent("name of a relationship" "content inode")
Here is my post about this on the dotCMS Yahoo group: Paginate related content?