2016-07-11 2 views
0

J'essaie de communiquer deux vues, la première vue dans le portlet-A et la seconde vue dans le portlet-B (les deux portlets dans le même fichier .war). Pour ce faire, j'ai décidé d'utiliser les fonctions JSF 'f: viewParam' et 'f: param' afin d'injecter une propriété (de la vue portlet-A) dans l'objet request, de sorte que la vue portlet-B peut le récupérer à partir de l'objet de requête et transmettre cette valeur de propriété à une propriété bean backed scope.Injecter des paramètres de requête dans le bean tronqué (différents portlets)

portlets Un code de vue:

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

Code JS:

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

Notez que la vue portlet-B doivent être affichés sur une page basée sur Liferay, différent de celui où le portlet-A est affiché.

portlets-B code de la vue:

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

Lorsque portlet-B s'affiche, le champ d'adresse du navigateur est réglé sur 'http://host:8080/viewer' et l'étiquette obtient rendu '0' (zéro).

Je ne sais pas si la façon dont je fais la tâche ciblée est la bonne ou non. Mais si c'est le cas, je ne sais pas pourquoi ça ne marche pas. Donc j'apprécierais vraiment toute aide/commentaires. Merci d'avance.

+0

Il semble que vous essayez d'accomplir [communication inter-portlet (IPC)] (https://web.liferay.com/web/meera.success/blog/-/blogs/liferay-inter-portlet-communication -ipc-). Je vous recommande de consulter les exemples de portlets Liferay Faces. Découvrez les événements jsf-ipc [réservations] (https://github.com/liferay/liferay-faces-bridge-impl/tree/4.x/demo/jsf-ipc-events-bookings-portlet) et [ clients] (https://github.com/liferay/liferay-faces-bridge-impl/tree/4.x/demo/jsf-ipc-events-customers-portlet) portlets ... – stiemannkj1

+0

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

Certainement, c'est une tâche à accomplir dans une perspective IPC. Et les liens que vous avez fournis sont adaptés. Cependant, j'ai trouvé un moyen de résoudre ce que je voulais faire sans utiliser le paradigme IPC. La façon de le résoudre est basée sur l'utilisation de la méthode 'getOriginalServletRequest()' de la classe Liferay 'com.liferay.portal.util.PortalUtil'. – txapeldot

Répondre

0

portlets Un code de vue:

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

Code JS:

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

portlets B code de la vue (vue portlets-B doivent être affichés sur une page basée sur Liferay, différent celui où le portlet-A vue est affiché):

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

gérés côté portlet-B 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")); 
    } 
} 

De cette façon, il n'est pas nécessaire d'utiliser ViewParams. El 'itemId' param est ajouté à la requête http pour qu'il soit récupéré dans la méthode init() PostConstruct du côté Portlet-B. De plus, la vue est affichée sur une nouvelle page différente.