我刚开始在Liferay(6.2)中进行开发。 我们正在为我们的客户建立一个门户网站,我们正在使用JSF和primefaces。
核心功能非常出色。但现在我有点卡住了。 我们有一些页面,客户可以在那里查看购买的物品和其他东西。工作也很棒。
但不,我想从项目(详细信息)转到另一个页面,并将itemnumber
作为参数。
itemnumber
。portlet仅由我们插入(不是客户 - 他们只有"只读"访问权限)
这是解决这个问题的正确方法吗?怎么能实现呢?
答案 0 :(得分:2)
这取决于您的项目的要求,是否;
1.您希望保持在同一页面上以显示pop_up上的项目详细信息,或者
2.您希望导航到携带请求参数的不同页面,并根据该参数值,过滤某些数据并显示详细信息。
如果您遵循第一种方法,则可以在数据表或带有唯一item_number
的网格中为每个项目放置详细信息链接。将此链接绑定到bean的方法(actionListener),并根据从操作中提取的item_number
填充项目详细信息。
或者,如果您遵循第二种方法,您只需将详细信息页面的链接(静态或动态从portlet的首选项)绑定到queryString
的超链接,例如/details?item_number=x
其中{{ 1}}是唯一的x
。在详细信息页面(删除详细信息portlet的位置)中,从请求中提取该参数并填充项目详细信息。
只要您的要求得到满足,这两种方法都可以。但是,避免重定向会很好。
<强>更新强>
在项目portlet中添加以下链接item_number
:
dataTable
其中<h:outputLink target="_blank" value="/group/pages/message">
Go to Messages
<f:param name="item_number" value="#{item.itemNumber}" />
</h:outputLink>
是页面的网址,/group/pages/message
是item.itemNumber
中item
的动态值。
将以下代码添加到消息bean的构造函数中:
dataTable
答案 1 :(得分:1)
由于facelets(JSF视图)位于不同的portlet中,因此需要执行Inter Portlet Communication (IPC)
。
您可以将IPC建立在portlet会话上,以将itemnumber
传递给messages
portlet。要执行此操作,请在发件人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>
将itemnumber
传递给messages
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);
检索它
renderRequest.getParameter("identifier");
// Do what ever you want...
传递itemnumber
的最后一种方法是使用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;
}
}
在所有情况下,由于您的portlet处于不同的战争中,您需要在portlet-ext.properties
文件中添加此属性以允许位于不同Liferay页面中的Portlet之间的IPC
portlet.public.render.parameter.distribution=layout-set