Adding a Plugins Portlet to the Control Panel

A "Gotcha!" situation came up today when I attempted to add a portlet developed in the plugins environment to the Control Panel (which is a new feature being developed for 5.2.0 that you can read about in Jorge's blog entry).

In a nutshell, the Control Panel provides a centralized administrative interface for the entire portal. Unlike a standard layout where you 'manage pages' and put portlets anywhere, whether or not a portlet shows up inside of the Control Panel depends on whether or not you've set the following nodes in your liferay-portlet.xml:

  • control-panel-entry-category: The 'category' where your portlet will appear. There are currently 4 valid values for this element: 'my', 'content', 'portal', and 'server'.
  • control-panel-entry-weight: Determines the relative ordering for your portlet within a given category. The higher the number, the lower in the list your portlet will appear within that category.
  • control-panel-entry-class: The name of a class that implements the ControlPanelEntry interface which determines who can see the portlet in the control panel via an isVisible method.

By making sure to define these elements in your liferay-portlet.xml, you can theoretically add any portlet (whether they be portlets built in the Extensions environment or Plugins environment) to the new Control Panel interface.

In my case, I couldn't think of a page/layout which would fit for the plugin I was developing, but since it had administrative elements to it, I felt the best place for it would be the Control Panel. So, I updated the dtd for liferay-portlet.xml to 5.2.0 and added the appropriate control panel elements.

Unexpectedly, the new plugin portlet did not show up in the Control Panel.

After debugging com.liferay.portal.util.PortalImpl, I verified that the portlet was recognized as a Control Panel portlet, and that it was added it to the java.util.Set, but by the time it returned from the method, the portlet had disappeared. I was at a loss for why.

However, it turns out those abstract algebra classes that I took in college came in handy, and I realized where the "Gotcha!" was hidden:

Set
   
   
   
   
    
    
    
     portletsSet = new TreeSet
    
    
    
    
      ( new PortletControlPanelWeightComparator());   
    
   
   
   
   

By their mathematical definition, every element in a set must be unique. After checking com.liferay.portal.util.comparator.PortletControlPanelWeightComparator, I discovered that the control panel render weight is the only thing that matters for determining uniqueness of a portlet within a Control Panel category. As long as render weights are equal, they are treated as the same portlet.

In summary, my portlet shared the same render weight as another Control Panel portlet (I gave it the same render weight as My Account because I copy-pasted), so it was getting replaced as soon as the My Account portlet was added to the java.util.TreeSet. Thus, why it was clearly being added but disappeared by the time it returned from the method.

So, in the event that you are planning to leverage the new Control Panel feature for portlets that you're developing, bear in mind that you need to keep your render weights different from the portlets which exist in Liferay and from other portlets you may want to add to your Liferay instance, and you'll be okay.

Alternatively, you could extend com.liferay.portal.util.PortalImpl, override the definition of getControlPanelPortlets, and use a different comparator which checks portlet ids as well in the event of ties.

Blogs
Hi Minhchau,

Good Point! The control panel render weight for control-panel-entry-weight is the only thing that matters for determining uniqueness of a portlet within a control panel category.

Thanks

Jonas Yuan
Doesn't it make more sense to add these elements to liferay-display.xml?
Still unable to see my portlets in the control panel even with unique weight. Any ideas?
I found the problem. In the liferay-portlet.xml file, make sure that "ajaxable" is set to false for your portlet.
Also you need to set instanceable to false before it can be displayed
[...] Hola, Aquí hay un pequeño tutorial: http://www.liferay.com/web/guest/community/wiki/-/wiki/Main/Control+Panel Ejemplo sobre ControlPanelEntry, ojo extendemos BaseControlPanelEntry (ver tutorial)... [...] Read More
Nice post.
For a case which is vise versa - I want to add control panel portlet on portal page, currently we have to create ext to add a OOB liferay portlet on the portal page.

Its a common feature in many liferay portal requirements and so we should be able to achieve this by minimum efforts by some configurations only.

I have created one request for this feature to Liferay.

Please vote for this if you like it.

http://issues.liferay.com/browse/LPS-42946

Thanks,
Roshan Qureshi