我目前正在尝试以编程方式在页面上放置和操作内容(JournalArticle)并面临一些问题。主要问题是我不了解Liferay如何知道哪些portlet放在页面上。
我以为会是这样的:
Layout
表中查找与groupId
和friendlyURL
typeSettings
列以获得类似这样的内容:
PortletPreferences
和plid
= 56_INSTANCE_G2dgK2HoXq2l portletId
groupId
和articleId
groupId
和articleId
获取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