ADF Facesコマンド・コンポーネントからのダイアログの起動について

ダイアログは、特別なJSFナビゲーション・ルールと組み合せて、ADF Facesコマンド・コンポーネント(oracle.adf.view.faces.component.UIXCommand)から起動できます。現行のページに「Show Me More」(詳細表示)コマンド・ボタンがあると仮定します。このボタンがクリックされると、ADF Facesは、showMore.jspxダイアログ・ページを新しいウィンドウで起動します。このダイアログ・ページには「Done」(終了)コマンド・ボタンがあります。このボタンがクリックされると、ADF Facesは、ダイアログを閉じて元のページに戻ります。

このトピックでは、次の各項について説明します。

ダイアログの起動元となるJSFページの作成

コマンド・コンポーネントでは、ダイアログをプログラムによって表示するactionメソッドを単一で使用するか、アクションの静的な結果を使用して、ダイアログ・ページへの通常のナビゲーションを実行できます。ダイアログは別のダイアログからも起動できることに注意してください。

ダイアログを起動するコマンド・ボタンがあるページで、次の属性をコマンド・コンポーネントに設定します。

属性useWindow="true"は、"dialog:"で開始するアクション結果と組み合せて使用します。結果が"dialog:"で開始しない場合は、useWindow="true"の場合でもダイアログは起動されません。同様に、"dialog:"で開始する結果が定義されている場合でも、useWindow="false"の場合またはuseWindowが設定されていない場合、ダイアログは起動されません。

useWindow="true"で、アクション結果がdialog:結果でない場合、新しいプロセスは開始されません。アクション結果がdialog:結果で、useWindow="false"または未設定の場合、新しいプロセスは開始されますが、新しいウィンドウは起動されません。

たとえば、ダイアログを起動する次のJSFページがあると仮定します。

<af:commandButton text="Show More Information" 
                  partialSubmit="true" 
                  action="dialog:showMore"
                  returnListener="#{backingBean.handleReturn}"
                  useWindow="true"
                  windowHeight="200"
                  windowWidth="300"/>    

バッキングBeanでは、次のようになります。

...
public void handleReturn(ReturnEvent ReturnEvent)
{
  Object returnedValue = event.getReturnValue();
  // ... process the return value as desired ...
}
...    

(静的な結果を使用せずに)プログラムによってダイアログを表示するには、actionメソッドを使用します。actionメソッドから戻る結果も"dialog:"で開始する必要があります。次に例を示します。

<af:commandButton text="Show More Information"
                  useWindow="true"
                  action="#{backingBean.goSomewhere}"/>    

バッキングBeanでは、次のようになります。

...
public String goSomewhere()
{
  if (isUserLoggedOut())
  {
    return "dialog:loggedOutWarning";
  }
  else
  {
    return "dialog:showMore";
  }
}
...     

actionメソッドを使用するか、静的なアクション結果を使用するかに関係なく、クライアント・ブラウザがポップアップ・ウィンドウをサポートしている場合は、ダイアログが新しいウィンドウで起動します。それ以外の場合、ADF Facesは、現在のページの状態をすべて保存し、現行のウィンドウに単純にダイアログを表示します。ダイアログの終了時には、handleReturn()がコールされます。

ダイアログを表示するためのJSFナビゲーション・ルールの定義

ダイアログへのナビゲーションは、特別なdialog:結果を使用して標準的なJSFナビゲーション・ルールを定義することで管理します。このルールの定義は、ダイアログを起動するコマンド・ボタンに対して、actionメソッドを使用するか静的なアクション結果を使用するかに関係なく必要です。

faces-config.xmlの例を示します。

<navigation-rule>

  <from-view-id>/*</from-view-id>

  <navigation-case>
    <from-outcome>dialog:showMore</from-outcome>
    <to-view-id>/showMore.jspx</to-view-id>
  </navigation-case>

</navigation-rule>    

ダイアログ・ページの作成と戻り値の供給

次に、ダイアログ・ページ(ダイアログ情報が記載されているJSFページ)を説明します。前述の例にあるダイアログ・ページshowMore.jspxには、オリジナル・ページから選択した内容に関する詳細情報が表示されます。

このダイアログ・ページには、ダイアログが(発行ボタンや取消しボタンによって)終了したことを、ADF Facesに伝える方法を用意する必要があります。このようなボタンがクリックされた場合は、AdfFacesContext.returnFromDialog()メソッドをコールする必要があります。このメソッドは、ダイアログ・ページが新しいウィンドウに表示されていたか、現行のウィンドウに表示されていたかに関係なくコールできます。新しいウィンドウが使用されていた場合、ダイアログ・ウィンドウは自動的に閉じます。このメソッドを使用すると、ReturnEventで(ダイアログからの)戻り値を渡すこともできます。これは、オリジナル・ページのコマンド・ボタンに登録されているreturnListenerに配布されます。

ダイアログ・ページに「Select」と「Cancel」という名前のコマンド・ボタンがあると仮定します。

<af:panelButtonBar>
  <af:commandButton text="Cancel" immediate="true" action="#{dialogBacking.cancel}"/>
  <af:commandButton text="Select" action="#{dialogBacking.select}"/>
</af:panelButtonBar>    

バッキングBeanでは、次のようになります。

...
public String cancel()
{
  AdfFacesContext.getCurrentInstance().returnFromDialog(null, null);
  return null;
}

public String select()
{
  ...
  // Get the return value  
  Object value = ...;
  // Return the value
  AdfFacesContext.getCurrentInstance().returnFromDialog(value, null);
  ...
  return null;
}    

注意: ダイアログ内から別のダイアログを起動する場合は、表示している最初のページでAdfFacesContext.returnFromDialog()メソッドをコールする必要はありません。最初のページから必要に応じて様々なページに移動できますが、最終的にはAdfFacesContext.returnFromDialog()をコール必要があります。

完全な例については、「Oracle ADF Facesアプリケーションの開発ガイドライン」のADF Facesダイアログ・フレームワークに関する説明を参照してください。

ヒント: af:returnActionListenerタグを使用すると、AdfFacesContext.returnFromDialog()を使用してJavaコードを記述しなくても、ダイアログから値を戻すことができます。詳細は、「af:returnActionListenerおよびダイアログ戻り値について」を参照してください。


selectInputTextおよびダイアログの起動について
ADF Facesでのダイアログに対する値の受渡しについて
ADF Facesコマンドおよび移動コンポーネントについて