2016-07-11 37 views
0

Ich versuche, zwei Ansichten zu kommunizieren, die erste Ansicht innerhalb von Portlet-A und die zweite Ansicht innerhalb von Portlet-B (beide Portlets innerhalb desselben .war). Um dies zu tun, habe ich beschlossen, die Funktionen JSF 'f: viewParam' und 'f: param' zu verwenden, um eine Eigenschaft (aus Portlet-A-Ansicht) in das Anfrageobjekt zu injizieren, so dass die Portlet-B-Ansicht Sie können sie aus dem Anforderungsobjekt abrufen und einen solchen Eigenschaftswert an eine View-Bereichs-Backed-Bean-Eigenschaft übergeben.Anforderungsparameter in Ansichtsbereichs-Bean einspeisen (verschiedene Portlets)

Portlet-A Code anzeigen:

<p:dataScroller value="#{searchManager.List}" var="ccp" > 
    ... 
    <p:link value="#{ccp.title}" onclick="myonClick(event)" > 
     <f:param name="id" value="#{ccp.id}" />    
    </p:link> 
    ... 
</p:dataScroller> 

JS-Code:

function myonClick(event) { 
    event.preventDefault(); 
    window.open("viewer", "_blank"); 
} 

anzumerken, dass Portlet-B Ansicht haben sich auf eine Liferay basierte Seite, anders als die eine, wo die anzuzeig Portlet-Eine Ansicht wird angezeigt.

Portlet-B Code anzeigen:

<f:metadata> 
    <f:viewParam name="id" value="#{resultItemManager.id}" />  
</f:metadata> 

<h:head /> 

<h:body> 
    <p>Details:</p> 
     <h:outputText value="#{resultItemManager.id}" /> 
</h:body> 

Wenn Portlet-B angezeigt wird, wird das Browser-Adressfeld auf 'http://host:8080/viewer' und dem Tag wird als '0' (Null) gemacht.

Ich weiß nicht, ob die Art, wie ich die gezielte Aufgabe mache, die richtige ist oder nicht. Aber wenn es ist, ich weiß nicht, warum es nicht funktioniert. Also ich würde wirklich jede Hilfe/Kommentare schätzen. Vielen Dank im Voraus.

+0

Es scheint, als ob Sie versuchen, [Inter-Portlet-Kommunikation (IPC)] zu erreichen (https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-inter-portlet-communication -ipc-). Ich würde Ihnen empfehlen, sich die Liferay Faces-Beispielportlets anzusehen. Sehen Sie sich die jsf-ipc-events [Buchungen] an (https://github.com/liferay/liferay-faces-bridge-impl/tree/4.x/demo/jsf-ipc-events-bookings-portlet) und [ Kunden] (https://github.com/liferay/liferay-faces-bridge-impl/tree/4.x/demo/jsf-ipc-events-customers-portlet) portlets ... – stiemannkj1

+0

... oder die [ jsf-ipc-pub-render-params-portlet] (https://github.com/liferay/liferay-faces-bridge-impl/tree/4.x/demo/jsf-ipc-pub-render-params-portlet). – stiemannkj1

+0

Sicherlich ist es eine Aufgabe, die unter einer IPC-Perspektive erfüllt wird. Und die von Ihnen bereitgestellten Links sind geeignet. Ich habe jedoch einen Weg gefunden, das zu lösen, was ich ohne das IPC-Paradigma tun wollte. Die Art der Lösung basiert auf der Verwendung der 'getOriginalServletRequest()' Methode aus der 'com.liferay.portal.util.PortalUtil' Liferay Klasse. – txapeldot

Antwort

0

Portlet-A Code anzeigen:

<p:dataScroller value="#{searchManager.List}" var="ccp" > 
... 
    <p:link value="#{ccp.title}" onclick="myonClick(event, #{ccp.id})" /> 
... 
</p:dataScroller> 

JS-Code:

function myonClick(event, itemId) { 
    event.preventDefault(); 
    window.open("viewer" + "?id=" + itemId, "_blank"); 
} 

Portlet-B Code anzeigen (Portlet-B Ansicht haben sich auf eine Liferay-basierte Seite angezeigt werden, anders die, wo die Portlet-A-Ansicht angezeigt wird):

<h:body> 
    <p>Details</p> 
    <h:outputText value="#{itemManager.id}" />    
</h:body> 

Portlet-B-Seite verwaltet bean:

@ManagedBean(name = "resultItemManager") 
@ViewScoped 
public class ItemManager implements Serializable { 

    @ManagedProperty(value = "") 
    public long id; 

    ... 

    @PostConstruct 
    public void init() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ExternalContext extContext = facesContext.getExternalContext(); 
    RenderRequest renderRequest = (RenderRequest) extContext.getRequest(); 
    HttpServletRequest httpRequest = PortalUtil.getOriginalServletRequest(
     PortalUtil.getHttpServletRequest(renderRequest)); 
    this.id = Long.parseLong(httpRequest.getParameter("id")); 
    } 
} 

Auf diese Weise muss ViewParams nicht verwendet werden. El 'itemId' param wird an die http-Anfrage angehängt, so dass sie in der init() PostConstruct-Methode auf der Portlet-B-Seite abgerufen wird. Außerdem wird die Ansicht auf einer neuen anderen Seite angezeigt.