リンクのクリック時に新しいIFrameポートレットを追加しようとしています。私はいくつかの問題でそれを達成しました。Liferayでページをリロードする際にポートレットインスタンスを追加する
まず私はLiferayのSDKを使用してポートレットを作成し、デフォルトview.jsp
カスタマイズ:
<portlet:renderURL var="pageDisp">
<portlet:param name="jspPage" value="/view.jsp" />
</portlet:renderURL>
<a href="<%=pageDisp%>&clink=g">Google</a> <br />
<a href="<%=pageDisp%>&clink=y">Yahoo</a> <br />
<a href="<%=pageDisp%>&clink=d">Daily Tech</a> <br />
<a href="<%=pageDisp%>&clink=w">Wired</a> <br />
は
<portlet-class>test.LinksPortlet</portlet-class>
へ
<portlet-class>com.liferay.util.bridges.mvc.MVCPortlet</portlet-class>
からportlet.xml
を変更し、私がフォローを実施していますLinksPortlet
のコードINGの:上記の実装で
public void render(RenderRequest request, RenderResponse response) throws PortletException, java.io.IOException {
log("LinksPortlet:render");
try {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(com.liferay.portal.kernel.util.WebKeys.THEME_DISPLAY);
LayoutTypePortlet layoutTypePortlet = themeDisplay.getLayoutTypePortlet();
List<Portlet> portletList = layoutTypePortlet.getPortlets();
for(Portlet p : portletList) {
log(p.getPortletId());
log(p);
log(p.getDisplayName());
log(p.getInitParams());
}
String c = request.getParameter("clink");
log(c);
if(c != null && (c.equals("g") || c.equals("y") || c.equals("d") || c.equals("w"))) {
String portletId = layoutTypePortlet.addPortletId(Long.parseLong(request.getRemoteUser()), PortletKeys.IFRAME, "column-2", -1);
log("portletId: "+portletId);
long companyId = themeDisplay.getCompanyId();
long ownerId = PortletKeys.PREFS_OWNER_ID_DEFAULT;
int ownerType = PortletKeys.PREFS_OWNER_TYPE_LAYOUT;
Layout layout = themeDisplay.getLayout();
PortletPreferences prefs = PortletPreferencesLocalServiceUtil.getPreferences(companyId, ownerId, ownerType, layout.getPlid(), portletId);
Locale locale = new Locale("en", "US");
prefs.setValue("portlet-setup-use-custom-title", "true");
if(c.equals("g")) {
prefs.setValue("src","http://www.google.com");
prefs.setValue("portlet-setup-title-" + LocaleUtil.toLanguageId(locale), "Google");
}
else if(c.equals("y")) {
prefs.setValue("src","http://www.yahoo.com");
prefs.setValue("portlet-setup-title-" + LocaleUtil.toLanguageId(locale), "Yahoo");
}
else if(c.equals("d")) {
prefs.setValue("src", "http://www.dailytech.com");
prefs.setValue("portlet-setup-title-" + LocaleUtil.toLanguageId(locale), "Daily Tech");
}
else if(c.equals("w")) {
prefs.setValue("src", "http://www.wired.com");
prefs.setValue("portlet-setup-title-" + LocaleUtil.toLanguageId(locale), "Wired");
}
PortletPreferencesLocalServiceUtil.updatePreferences(ownerId, ownerType, layout.getPlid(), portletId, prefs);
portletList = layoutTypePortlet.getPortlets();
for(Portlet p : portletList) {
if(p.getPortletId().equals(portletId)) {
break;
}
}
LayoutLocalServiceUtil.updateLayout(layout.getGroupId(), layout.isPrivateLayout(), layout.getLayoutId(), layout.getTypeSettings());
}
}
catch(Exception e) {
log("LinksPortlet:doView:Exception");
e.printStackTrace();
}
super.render(request, response);
}
問題は、新しいポートレットは、ページのリロード後、画面に表示されていることである: http://www.go-ahead.in/books/1.JPG http://www.go-ahead.in/books/2.JPG http://www.go-ahead.in/books/3.JPG
問題の理由は、ということです新しいポートレットは、レイアウトのレンダリングの開始後に追加されます。ページ/レイアウトの読み込み中に実行中のアクションを実行するためのフックをカスタマイズまたは追加することは可能ですか?ポートレットが追加されたliferayのソースLayoutAction.javaを見つけました。ライフレットのソースコードを変更せずにポートレットを追加するためのポストフックを追加する方法はありますか?
私はLiferay 6.0.5を使用しています。
ありがとうございます。