Liferay的Portlet Configuration页面,都有几个固定的Tab页,比如“权限”,“导出导入”等,这些是在什么地方定义的呢?
我们知道,portal/render_portlet.jsp负责界面上一个portlet的解析功能,包括这个portlet再编辑模式下的最大、最小、配置、外观等MODE的实现。
仔细分析一下这个页面,点击一个portlet的configuration按钮时,执行的逻辑如下:
if (Validator.isNotNull(portlet.getConfigurationActionClass())) {
urlConfiguration.setParameter("struts_action", "/portlet_configuration/edit_configuration");
}
else {
urlConfiguration.setParameter("struts_action", "/portlet_configuration/edit_permissions");
}
就是如果再portlet的配置信息中(Liferay-portlet.xml)中包含了configuration的信息,那么就执行edit_configuration action, 也就是再配置页面中包含客户化的portlet配置信息的页面(configuration.jsp),具体如何实现,我们稍后分析。如果没有客户化的信息需要定制,那么,我们就可以通过一个标准的配置实现edit_permissions来实现。这里面只有权限、导入导出等通用的设置功能。
再Portlet Configuration这个Portlet下,如何调用其他Portlet的Configuration.jsp, 这个就需要查看EditConfigurationAction里定义了。代码如下:
try {
portlet = getPortlet(req);
}
catch (PrincipalException pe) {
}
ConfigurationAction configurationAction = getConfigurationAction(portlet);
if (configurationAction != null) {
configurationAction.processAction(config, req, res);
}
看到了吧,这里首先获取是对哪个Portlet进行Config的,获取其ConfigurationAction(统一的Interface),然后调用其processAction方法。
而在显示jsp页面时,根据定义执行了edit_configuration.jsp,分析其源码可以知道,这个页面引入了tab1.jsp, tab2.jsp两个页面。
<liferay-util:include page="/html/portlet/portlet_configuration/tabs1.jsp">
<liferay-util:param name="tabs1" value="setup" />
</liferay-util:include>
默认的tab选项是setup页,也就是你编写的configuration.jsp所在的那个tab。在tab2.jsp中对这个Tab进行了详细的定义:
// Configuration
PortletURL configurationURL = renderResponse.createRenderURL();
configurationURL.setWindowState(WindowState.MAXIMIZED);
configurationURL.setParameter("struts_action", "/portlet_configuration/edit_configuration");
configurationURL.setParameter("redirect", redirect);
configurationURL.setParameter("returnToFullPageURL", returnToFullPageURL);
configurationURL.setParameter("portletResource", portletResource);
configurationURL.setParameter("previewWidth", previewWidth);
注意:上面的portletResource就是你自己的Portlet的portletId,通过这个portletId才能让EditConfigurationAction获知这个被配置的Portlet的ConfigurationActionClass.
<liferay-ui:tabs
names="current,archived"
param="tabs2"
url0="<%= configurationURL.toString() %>"
url1="<%= archivedSetupsURL.toString() %>"
/>