2016-07-19 73 views
0

我剛開始在Liferay(6.2)中開發。 我們正在爲我們的客戶製作一個門戶網站,我們正在使用JSF和primefaces。鏈接到Liferay中的其他頁面/ portlet

核心功能運作良好。但現在我有點卡住了。 我們已經有一些頁面,客戶可以在那裏查看購買物品和其他東西。作品也很棒。

但是不,我想從項目(細節)轉到另一頁並以itemnumber作爲參數。

  1. 用戶轉到第一頁(他的所有購買的物品)
  2. 點擊詳細 - >此項目的細節顯示。在這裏我想鏈接到「消息」。
  3. 現在用戶在頁面上的「消息」和篩選器被設置爲itemnumber

Portlet都是隻有我們插入(而不是客戶 - 他們只有「只讀」權限)

這甚至對這個問題的正確方法?這怎麼可能實現?

+0

糾正我,如果我不明白你的問題。您有3頁:1-'購買物品'2-'物品細節'和3-'消息'。你想通過保留itemnumber的值來將用戶從'Item detail'重定向到'messages'? –

+0

我有2頁。 '買了物品'(這顯示了細節,但在同一頁上)。和'消息'。顯示所有消息。但如果我從'items'頁面跳轉到'messages'頁面,我想用所選項目中的id初始化篩選器。 – griFlo

+0

在同一個portlet中是否購買了物品和消息? –

回答

2

這取決於您的項目的要求,是否;
1.您希望保留在同一頁面上以顯示pop_up上的項目詳細信息或
2.您想導航到攜帶請求參數的不同頁面並根據該參數值篩選某些數據並顯示細節。

如果您遵循第一種方法,您可以將每個項目的詳細信息鏈接放在數據表或網格中,並攜帶唯一的item_number。將此鏈接綁定到bean的方法(actionListener)並根據從操作中提取的item_number填充項目詳細信息。

或者如果按照第2的方法,你可以簡單地綁定詳細信息頁面的鏈接(靜態或動態的portlet的偏好)與queryString超鏈接一樣/details?item_number=x其中x是唯一item_number。在詳細信息頁面(您的詳細信息portlet被刪除的位置),從請求中提取該參數並填充項目詳細信息。

這兩種方法都很好,只要您的要求得到滿足。但是,避免重定向會很好。

更新:

添加以下鏈接你dataTable在項目的portlet:

<h:outputLink target="_blank" value="/group/pages/message"> 
    Go to Messages 
    <f:param name="item_number" value="#{item.itemNumber}" /> 
</h:outputLink> 

哪裏/group/pages/message是頁面的URL和item.itemNumber是你itemdataTable的動態值。

添加以下代碼到你的消息bean的構造函數:

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); 
PortletRequest portletRequest = (PortletRequest) externalContext.getRequest(); 
HttpServletRequest httpServletRequest = 
    PortalUtil.getOriginalServletRequest(PortalUtil.getHttpServletRequest(portletRequest)); 

int itemNumber = ParamUtil.getInteger(httpServletRequest, "item_number", 0); 

if (itemNumber > 0) { 
    // Filter messages here based on itemNumber 
} 
+0

抱歉。我想我沒有讓自己清楚。清單和細節工作正常。此外,消息頁面在那裏工作。但是我發現沒有好的方法可以從項目細節跳轉到消息頁面,並使用項目ID填充篩選器。 – griFlo

+0

您的列表數據是否存在於數據表中? –

+0

是的。我的列表數據在數據表中 – griFlo

1

由於你的小面(JSF視圖)在不同的portlet,您需要執行Inter Portlet Communication (IPC)

使用IPC Portlet會話

您可以根據portlet會話的IPC來傳遞你的itemnumbermessages門戶。要執行此,在發件人的portlet,獲取會話的portlet如下

PortletSession portletSession = renderRequest.getPortletSession(); 
portletSession.setAttribute("key", value ,PortletSession.APPLICATION_SCOPE); 

而在接收器的portlet

PortletSession portletSession = renderRequest.getPortletSession(); 
String value = (String) portletSession.getAttribute("key ",PortletSession.APPLICATION_SCOPE); 
// Do what ever you want... 

在兩個portlet,添加以下屬性在liferay-portlet.xml文件

private-session-attributes>false</private-session-attributes> 



IPC使用公共呈現參數

另一種方式來傳遞你的itemnumbermessages的portlet是使用public render parameters。要做到這一點,你需要定義一個公共呈現參數

<portlet-app ...> 
    ... 
    <public-render-parameter> 
     <identifier>identifier</identifier> 
     <qname xmlns:x="http://namespace.com">x:identifier</qname> 
    </public-render-parameter> 
    ... 
</portlet-app> 

而且在的portlet其聲明如下

<portlet> 
    ... 
    <supported-public-render-parameter>identifier</supported-public-render-parameter> 
    ... 
<portlet> 

然後,您可以發送itemnumber如下

actionReponse.setRenderParameter("identifier", value); 

檢索它使用事件

最後的方式來傳遞你的itemnumber

renderRequest.getParameter("identifier"); 
// Do what ever you want... 



IPC是使用event。由於您正在使用JSF作爲Portlet框架,因此Portlet之間的事件發生完全不同。你必須遵循以下步驟:

1.定義事件

portlet.xml文件

<event-definition xmlns:event="http://www.namespace.com"> 
    <qname>identifier</qname> 
    <value-type>java.lang.String</value-type> 
</event-definition> 

2.創建一個事件橋處理

創建一個定義事件實施BridgeEventHandler的課程如下

public class CustomBridgeEventHandler implements BridgeEventHandler { 


     @Override 
     public EventNavigationResult handleEvent(FacesContext facesContext, Event event) { 

      EventNavigationResult eventNavigationResult = null; 

      // Processing the event will be written here... 

      return eventNavigationResult; 
     } 
    } 

3。發件人portlet 在發件人portlet中,您需要在portlet.xml文件中聲明事件和網橋處理程序。

事件

<portlet> 
    ... 
    <supported-publishing-event xmlns:event="http://www.namespace.com"> 
     <qname>identifier</qname> 
    </supported-publishing-event> 
    ... 
</portlet> 

<portlet> 
    ... 
    <init-param> 
     <name>javax.portlet.faces.bridgeEventHandler</name> 
     <value>com.roufid.tutorials.bridge.CustomBridgeEventHandler</value> 
    </init-param> 
    ... 
</portlet> 

火災的事件

public void yourMethod() { 
    // Getting the faces context. 
    FacesContext fc = FacesContext.getCurrentInstance(); 

    // Getting the portlet action response. 
    ActionResponse actionReponse = (ActionResponse) fc.getExternalContext().getResponse(); 

    // Firing the event 
    QName qName = new QName("http://www.namespace.com ", "identifier"); 
    actionReponse.setEvent(qName, dataYouWantToSend); 
} 

4.接收器portlet 在接收器portlet中,您需要在portlet.xml文件中聲明事件和橋處理器。

事件

<portlet> 
    ... 
    <supported-publishing-event xmlns:event="http://www.namespace.com"> 
     <qname>identifier</qname> 
    </supported-publishing-event> 
    ... 
</portlet> 

<portlet> 
    ... 
    <init-param> 
     <name>javax.portlet.faces.bridgeEventHandler</name> 
     <value>com.roufid.tutorials.bridge.CustomBridgeEventHandler</value> 
    </init-param> 
    ... 
</portlet> 

過程中的橋樑處理器

public class CustomBridgeEventHandler implements BridgeEventHandler { 

    @Override 
    public EventNavigationResult handleEvent(FacesContext facesContext, Event event) { 

     EventNavigationResult eventNavigationResult = null; 

     String eventQName = event.getQName().toString(); 

     // Processing the defined event. 
     if (eventQName.equals("{http://www.namespace.com}identifier")) { 

      // Getting the event value. 
      String value = (String) event.getValue(); 

      // Do what ever you want here... 
    } 

     return eventNavigationResult; 
    } 
} 
事件10

在所有情況下,因爲你的portlet是在不同的戰爭,你需要在portlet-ext.properties文件添加這個屬性,讓位於不同的Liferay頁面

portlet.public.render.parameter.distribution=layout-set 


更多信息portlet之間的IPC和示例

相關問題