2011-02-07 2 views
1

リンクのクリック時に新しい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を使用しています。

ありがとうございます。

答えて

0

問題の解決方法が見つかりました。

コードをrenderメソッドからprocessActionに移動し、<portlet:actionURL>タグを使用してリンクを作成しました。

関連する問題