0

ポートレット A 内の最初のビューとポートレット B 内の 2 番目のビュー (同じ .war 内の両方のポートレット) の 2 つのビューを通信しようとしています。そのために、JSF の「f:viewParam」機能と「f:param」機能を使用して、(ポートレット A ビューから) プロパティをリクエスト オブジェクトに注入することにしました。リクエスト オブジェクトから取得し、そのプロパティ値をビュー スコープのバッキング Bean プロパティに渡します。

Portlet-A ビュー コード:

<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 コード:

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

ポートレット B のビューは、ポートレット A のビューが表示されるページとは異なる、Liferay ベースのページに表示する必要があることに注意してください。

ポートレット B ビュー コード:

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

portlet-B が表示されると、ブラウザーのアドレス フィールドは「http://host:8080/viewer」に設定され、タグは「0」(ゼロ) としてレンダリングされます。

目標とするタスクを実行している方法が正しいかどうかはわかりません。しかし、もしそうなら、なぜそれが機能しないのかわかりません。ですから、助けやコメントをいただければ幸いです。前もって感謝します。

4

1 に答える 1

0

Portlet-A ビュー コード:

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

JS コード:

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

ポートレット B ビューのコード (ポートレット B ビューは、ポートレット A ビューが表示されるページとは異なる、Liferay ベースのページに表示する必要があります):

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

ポートレット 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"));
  }
}

このように、ViewParams を使用する必要はありません。ポートレット B 側の init() PostConstruct メソッドで取得されるように、El 'itemId' パラメータが http 要求に追加されます。また、ビューは新しい別のページに表示されます。

于 2016-08-02T08:45:48.080 に答える