Ссылка на другую страницу / портлет в Liferay

jsf primefaces liferay

429 просмотра

2 ответа

1333 Репутация автора

Я только начал с разработки в Liferay (6.2). Мы создаем портал для наших клиентов и используем JSF и Primefaces.

Основная функциональность работает отлично. Но сейчас я немного застрял. У нас есть несколько страниц, где клиенты могут просматривать купленные товары и другие вещи. Работает также отлично.

Но нет, я хочу перейти от элемента (детали) к другой странице и принять itemnumberпараметр as.

  1. Пользователь переходит на первую страницу (все его купленные товары)
  2. Нажатие на детали -> детали для этого элемента показаны. Здесь я хочу ссылку на «сообщения».
  3. Теперь пользователь находится на странице «Сообщения» и фильтр установлен на itemnumber.

Портлеты вставляются только нами (не клиентом - они имеют доступ только для чтения)

Это даже правильный подход к этой проблеме? как это можно реализовать?

Автор: griFlo Источник Размещён: 19.07.2016 06:45

Ответы (2)


2 плюса

4392 Репутация автора

Это зависит от требований вашего проекта, будь то;
1. Вы хотите остаться на той же странице, чтобы отобразить сведения об элементе в pop_up или,
2. Вы хотите перейти на другую страницу, содержащую параметр (параметры) запроса, и на основе значений этого параметра определенные данные фильтруются и отображаются детали. ,

Если вы придерживаетесь 1-го подхода, вы можете поместить ссылку на детали для каждого элемента в таблицу данных или уникальную сетку item_number. Свяжите эту ссылку с методом бина (actionListener) и заполните детали элемента, основываясь на item_numberизвлеченных из действия.

Или , если вы будете следовать 2 - й подход, вы можете просто связать ссылку подробно страницы (статические или динамические от предпочтений портлета) в гиперссылке с queryStringкак /details?item_number=xгде xявляется уникальным 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/messageURL-адрес страницы и item.itemNumberдинамическое значение вашего itemв dataTable.

Добавьте следующий код в ваш конструктор 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
}
Автор: Parkash Kumar Размещён: 19.07.2016 07:31

1 плюс

7669 Репутация автора

Поскольку ваши лицевые стороны (представления JSF) находятся в разных портлетах, вам необходимо выполнить Inter Portlet Communication (IPC).

IPC с использованием сеанса портлета

Вы можете основывать свой IPC на сеансе портлета, чтобы передавать его itemnumberв messagesпортлет. Для этого в портлете отправителя получите портлет сеанса, как показано ниже

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

И в портлете получателя

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

В обоих портлетах добавьте следующее свойство в liferay-portlet.xmlфайл

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



IPC с использованием публичных параметров рендеринга

Другой способ , чтобы передать ваши itemnumberв messagesпортлет использовать 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>
    ...
    <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качестве инфраструктуры портлетов, события между портлетами совершенно разные. Вы должны выполнить следующие шаги:

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.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.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-ext.propertiesфайл, чтобы разрешить IPC между портлетами, расположенными на разных страницах Liferay.

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


Больше информации и примеров

Автор: Radouane ROUFID Размещён: 19.07.2016 10:23
Вопросы из категории :
32x32