链接到Liferay

时间:2016-07-19 06:45:51

标签: jsf primefaces liferay

我刚开始在Liferay(6.2)中进行开发。 我们正在为我们的客户建立一个门户网站,我们正在使用JSF和primefaces。

核心功能非常出色。但现在我有点卡住了。 我们有一些页面,客户可以在那里查看购买的物品和其他东西。工作也很棒。

但不,我想从项目(详细信息)转到另一个页面,并将itemnumber作为参数。

  1. 用户转到第一页(所有他购买的商品)
  2. 点击详细信息 - >显示此项目的详细信息。在这里,我想链接到"消息"。
  3. 现在用户在页面上"消息"并且过滤器设置为itemnumber
  4. portlet仅由我们插入(不是客户 - 他们只有"只读"访问权限)

    这是解决这个问题的正确方法吗?怎么能实现呢?

2 个答案:

答案 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/messageitem.itemNumberitem的动态值。

将以下代码添加到消息bean的构造函数中:

dataTable

答案 1 :(得分:1)

由于facelets(JSF视图)位于不同的portlet中,因此需要执行Inter Portlet Communication (IPC)

使用portlet会话的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>


IPC使用公共渲染参数

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... 


IPC使用事件

传递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 


更多信息和示例