Liferay如何确定在页面上显示哪些portlet

时间:2015-09-01 07:41:02

标签: java liferay liferay-6 portlet portal

我目前正在尝试以编程方式在页面上放置和操作内容(JournalArticle)并面临一些问题。主要问题是我不了解Liferay如何知道哪些portlet放在页面上。

我以为会是这样的:

  • 用户打开如下页面:... / [group] / page
  • Liferay在Layout表中查找与groupIdfriendlyURL
  • 匹配的布局
  • 现在它会解析typeSettings列以获得类似这样的内容:
    • 柱-1 = 56_INSTANCE_G2dgK2HoXq2l
    • 因此第一栏中有一个JournalArticle
  • 现在使用布局的PortletPreferencesplid = 56_INSTANCE_G2dgK2HoXq2l
  • 获取portletId
  • 有一个提供groupIdarticleId
  • 的XML
  • 使用groupIdarticleId获取JournalArticle并显示它。

但似乎缺少某些东西。假设我们添加一个新的JournalArticle(我个人最喜欢的)JournalArticleLocalService.addArticle(...)。 现在,要将其添加到页面,我们执行此操作:

//get a new instanceId for the journalArticle
LayoutTypePortlet layoutTypePortlet = (LayoutTypePortlet) layout.getLayoutType();
String portletInstanceId = layoutTypePortlet.addPortletId( userId, portletId, "column-1", 1, false);

//gather some other infos
long companyId = article.getCompanyId();
long ownerId = PortletKeys.PREFS_OWNER_ID_DEFAULT;
int onwerType = PortletKeys.PREFS_OWNER_TYPE_LAYOUT;
long plid = layout.getPlid();

//get the preferences with the plid and instanceId
PortletPreferences preferences = PortletPreferencesLocalServiceUtil.getPreferences( companyId, ownerId, ownerType, plid, portletInstanceId);

//set the prefs
preferences.setValue( "articleId", article.getArticleId() );
preferences.setValue( "groupId", String.valueOf( article.getGroupId() ) );

//store updated prefs back to db
PortletPreferencesLocalServiceUtil.updatePreferences( ownerId, ownerType, plid, portletInstanceId, preferences);

//update the layout (is this necessary?)
LayoutLocalService.updateLayout( layout.getGroupId, layout.isPrivateLayout(), layout.getLayoutId(), layout.getTypeSettings() );

//finally fire PortletLayoutListener
Portlet portlet = PortletLocalServiceUtil.getPortletById( companyId, portletInstanceId );
PortletLayoutListener portletLayoutListener = portlet.getPortletLayoutListenerInstance();
if ( portletLayoutListener != null ) {
    portletLayoutListener.onAddToLayout( portletInstanceId, plid );
}

当我运行此代码时,everthing看起来很好。如果我按照上面描述的方式,Liferay应该在页面上显示新的JournalArticle。但事实并非如此。

为了证明我的理论,我手动添加了一篇文章,然后将其从布局的TypeSettings中删除(使用SQL Developer)。 Liferay在刷新页面后仍显示该文章。只有在重新启动服务器后它才会消失(缓存)。 但即使我重新启动服务器,我的编程方式添加的文章也没有显示出来。

我错过了什么?

提前致谢,~Fabi

我还在运行Liferay 6.1.20EE

0 个答案:

没有答案