I recently came across a situation where the requirement was to create some navigation in a theme that spans communities. This is something that you would normally want to just hardcode in the links and move on to the next task. This scenario was different because the admin team wanted to leverage Liferay’s permissioning model so they could restrict who had access to the links. Since there were so many unknowns as to how the portal would grow and be leveraged, I decided to take advantage of a couple features that are new in Liferay v6.
WCM Modifications
The basic solution starts by creating a structure and template in Liferay’s WCM. I created these artifacts in Liferay’s new Global content repository / library and used them to create the links that would show up in the navigation. In my case, the links went to a different server altogether.
The Structure (GLOBAL-NAV-LINK-STRUCTURE)
<root> <dynamic-element name="label" type="text" index-type="" repeatable="false"/> <dynamic-element name="target" type="list" index-type="" repeatable="false"> <dynamic-element name="_self" type="_self" index-type="" repeatable="false" /> <dynamic-element name="_parent" type="_parent" index-type="" repeatable="false"/> <dynamic-element name="_top" type="_top" index-type="" repeatable="false"/> <dynamic-element name="_blank" type="_blank" index-type="" repeatable="false"/> </dynamic-element> <dynamic-element name="style" type="text" index-type="" repeatable="false"/> <dynamic-element name="href" type="text" index-type="" repeatable="false"/> <dynamic-element name="alt" type="text" index-type="" repeatable="false"/>
</root>
The Template (GLOBAL-NAV-LINK-TEMPLATE)
<a href="$href.getData()"
style="$style.getData()" target="$target.getData()" alt="$alt.getData()"><span>$label.getData()</span></a>
Custom Fields Modifications
Once the content items were created, I added three custom variables to the Page object in the Control Panel.
Control Panel > Portal > Custom Fields > Page
Theme Changes
Smaller bits of code are generally easier to understand and maintain. Rather than adding several lines of code to the existing files in the theme, I created a new file in the _diffs directory and added the appropriate reference in the navigation.vm file.
custom-navigation.vm
#set( $sid = $theme_display.getLayout().getExpandoBridge().getAttribute("structure-id") ) #set( $tid = $theme_display.getLayout().getExpandoBridge().getAttribute("template-id") ) #set( $gid = $getterUtil.getLong($theme_display.getLayout().getExpandoBridge().getAttribute("global-group-id") ) ) #set( $approved = $getterUtil.getInteger("0"))#set( $journalArticleLocalService = $serviceLocator.findService("com.liferay.portlet.journal.service.JournalArticleLocalService") ) #set( $articles = $journalArticleLocalService.getStructureArticles( $gid, $sid ) )#foreach( $article in $articles ) #if( $article.getStatus() == $approved && $journalArticleLocalService.isLatestVersion($gid, $article.getArticleId(), $article.getVersion(), $article.getStatus()) ) <li>$journalArticleLocalService.getArticleContent($article,$tid,"","",$theme_display)</li> #end #end
Permission Changes
The final step is to modify the roles so they can view the custom attributes on the Page object. I will show you how to do that on the Guest role, but you will probably want to do this for the User and/or Power User role depending on how you are setup.
Control Panel > Portal > Roles > Guest > Actions > Define Permissions
Save your changes and you are good to go. Now you can embed WCM content in a Liferay v6 theme!