ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebCenter PortalおよびOracle JDeveloperでのポータルの開発
11gリリース1 (11.1.1.8.3)
E49666-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

19 コンポーザを使用した実行時編集機能の拡張

この章では、コンポーザの宣言的でプログラム可能な拡張性メカニズムを使用して、ビジネス・ニーズに合うように実行時機能をカスタマイズする方法について説明します。

この章の内容は、次のとおりです。

19.1 拡張性オプションの概要

コンポーザは、カスタマイズ可能なアプリケーション・ページを構築するフレームワークを提供します。デフォルトの機能に加えて、コンポーザのフレームワークを拡張し、エンド・ユーザーが使用できる実行時機能を拡張できます。アプリケーションのadf-config.xmlファイルおよびコンポーザの拡張ファイルpe_ext.xmlで拡張機能を構成する必要があります。これらのファイルの詳細は、第19.1.8項「構成ファイル」を参照してください。

この項では、コンポーザの実行時機能を宣言的に拡張するために使用できるオプションについて説明します。次のサブセクションが含まれます:

19.1.1 コンポーザのアドオン

デフォルトのコンポーザ・ツールバー(図19-1)は、次のものを含んでいます。

  • ページ・タイトル: 編集モードで開いているページのタイトルを示します。

  • 「ページ・プロパティ」アイコン: 「ページ・プロパティ」ダイアログを開き、ユーザーがホスト・ページのメタデータを編集できるようにします。

  • 「ページのリセット」アイコン: 現在の編集セッションでページに行った変更を元に戻します。

  • 「閉じる」ボタン: 編集モードを終了し、標準UIにユーザーを戻します。

図19-1 コンポーザのツールバーのデフォルト・アドオン

図19-1の説明が続きます
「図19-1 コンポーザのツールバーのデフォルト・アドオン」の説明

「ページ・プロパティ」および「ページのリセット」アイコンはアドオンの例です。これらのアイコンをクリックして、ページ・プロパティの編集およびページ・カスタマイズのリセットを行うためのパネルを表示します。通常、アドオンは、ページ編集モードのコンポーザのツールバーのアイコンとしてレンダリングされるカスタム・タスク・フローです。「ページ・プロパティ」アドオンと「ページのリセット」アドオンとともに表示されるアドオンを作成できます。たとえば、コンポーザのツールバーに「リビジョン」アイコンが表示されるように、ページ・リビジョン履歴を表示するアドオンを作成できます。このアイコンをクリックするとページのリビジョン履歴が表示されます。「ページ・プロパティ」アドオンと「ページのリセット」アドオンを、作成するカスタム・アドオンと置き換えることもできます。

カスタムのアドオンを構成するプロセスには、タスク・フローの作成、これらのJARファイルへのパッケージ化およびこれらのコンポーザ拡張ファイルでの定義が含まれます。詳細は、第19.2項「コンポーザのアドオンの作成」を参照してください。

19.1.2 コンポーザのカスタム・プロパティ・パネル

「コンポーネント・プロパティ」ダイアログには、様々なタブに属性のカテゴリが表示されます。各タブは、プロパティ・パネルと呼ばれます。コンポーザのデフォルトの「コンポーネント・プロパティ」ダイアログは、Oracle JDeveloperのプロパティ・インスペクタに似ています。コンポーネントのカスタム・プロパティ・パネルを作成して登録し、これらにコンポーネント・プロパティを移入し、「コンポーネント・プロパティ」ダイアログのデフォルトのタブとともにこれらをタブとして表示できます。

カスタム・プロパティ・パネルを構成するプロセスには、タスク・フローとしてのこれらの作成、これらのJARファイルへのパッケージ化およびこれらのコンポーザ拡張ファイルでの定義が含まれます。詳細は、第19.3項「カスタム・プロパティ・パネルの作成」を参照してください。

19.1.3 コンポーザのイベント・ハンドラ

コンポーザには、実行時にページを編集するための直感的なユーザー・インタフェースが用意されています。これには、「保存」ボタン、「閉じる」ボタン、「削除」ボタンなどのUIコンポーネントが含まれます。ユーザーがコンポーザでボタンやアイコンをクリックすると、イベント・ハンドラで確実に特定のアクションが実行されます。イベント・ハンドラは、コンポーザのイベントが起動されると、コンポーザによってコールされて戻されるコードです。コンポーザの各UIイベントはイベント・ハンドラと関連付けられています。イベントの起動時に異なる処理または複数の処理を実行して、コンポーザの本来の機能を拡張する必要がある場合があります。たとえば、ユーザーが「保存」をクリックしたとき、デフォルトでコンポーネントに用意されている保存動作に加えて、キャッシュした情報のクリーニングやリソースへの接続などの追加のタスクを実行するようにアプリケーションを構成する必要がある場合があります。イベント・ハンドラを使用してこれを実現できます。詳細は、第19.6項「コンポーザUIイベントのイベント・ハンドラの構成」を参照してください。

19.1.4 ドロップ・ハンドラ

リソース・カタログは、ユーザーがページに追加できるリソースを提供します。リソース名の隣の「追加」リンクで、ユーザーはリソースをページに追加できます。コンポーザは、ドロップ・ハンドラを提供し、カタログで追加操作を処理します。デフォルトでは、ドロップ・ハンドラはカタログの各リソースに対して構成されています。リソースへのドロップ処理の完全な制御を提供する場合、そのリソースに追加のドロップ・ハンドラを作成できます。そうすると、「追加」リンクは、リソースをページに追加するための様々なオプションを備えたコンテキスト・メニューを表示します。1つ以上のドロップ・ハンドラを作成し、カタログでリソースの様々なフレーバを処理できます。

次のタイプのドロップ・ハンドラを追加できます。

  • コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるJavaクラス。この場合、リソースは選択したデータ・フレーバに基づくページに追加されます。

  • コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるタスク・フロー。この場合、リソースのどの情報をページに表示する必要があるかをユーザーが決定できるタスク・フローが起動されます。

詳細は、第19.7項「リソース・カタログのドロップ・ハンドラの構成」を参照してください。

19.1.5 コンポーネントのプロパティ・フィルタ

「コンポーネント・プロパティ」ダイアログは、選択したコンポーネントのプロパティを表示します。デフォルトでは、コンポーザは特定のコンポーネント・プロパティをフィルタ処理し、プロパティのサブセットをユーザーに表示します。フィルタを宣言的に定義して、ユーザーに表示する必要がないプロパティをさらに非表示にしたり、非表示のプロパティを表示したりできます。詳細は、第19.8項「プロパティ・フィルタの定義」を参照してください。

19.1.6 カスタマイズ・マネージャ

カスタマイズ・マネージャは、ページやタスク・フローなどのオブジェクトに関するアプリケーションのカスタマイズをユーザーがダウンロード、アップロード、リセットおよび削除できるタスク・フローです。コンポーザ内またはコンポーザ外のある管理ページ上でカスタマイズ・マネージャを構成できます。カスタマイズ・マネージャの構成および使用の詳細は、第19.9項「カスタマイズ・マネージャ・タスク・フローのパラメータ・サポートの有効化」を参照してください。

19.1.7 コンポーザのツールバーのカスタマイズ

デフォルトのコンポーザ・ツールバーには、図19-2に示すように、ページ名、「ページ・プロパティ」アイコンと「ページのリセット」アイコンおよび「閉じる」ボタンの各要素が表示されます。

図19-2 デフォルト要素を備えたコンポーザのツールバー

図19-2の説明が続きます
「図19-2 デフォルト要素を備えたコンポーザのツールバー」の説明

要素を追加、削除または再配置してツールバーをカスタマイズできます。既存の要素をカスタム要素でオーバーライドすることも可能です。たとえば、編集しているページの名前をユーザーに表示しない場合、ページ名を表示するメッセージを削除できます。

コンポーザのツールバーのカスタマイズの詳細は、第19.10項「コンポーザのツールバーのカスタマイズ」を参照してください。

19.1.8 構成ファイル

この章で説明する拡張性構成を開始する前に、理解する必要がある2つの重要な構成ファイルがあります。この章で説明するほとんどの拡張機能は、これらのファイルで定義されます。

  • コンポーザ拡張ファイル(pe_ext.xml)

    コンポーザ拡張ファイル(pe_ext.xml)では、コンポーザが提供する編集機能を拡張できます。このファイル内で、要素を追加して新しいコンポーザ・アドオンおよびカスタム・プロパティ・パネルを登録し、選択的にパネルをレンダリングし、イベント・ハンドラを登録し、プロパティ・フィルタを定義できます。pe_ext.xmlファイルは、デフォルトではアプリケーションで使用できません。アドオン、プロパティ・パネルまたはイベント・ハンドラなどのタスクを初めて実行するときにこのファイルを作成する必要があります。このファイルをプロジェクトのWebコンテキスト・ルートの下のMETA-INFディレクトリまたはapplication_home/project/src/META-INFディレクトリに作成します。アプリケーションを実行するとき、pe_ext.xmlファイルは、アプリケーションのクラスパスに含まれているJARファイルから取得されます。アプリケーションには複数の拡張ファイルを含めることができます。ただし、拡張ファイルを含むJARがアプリケーションのクラスパスで使用でき、pe_ext.xmlファイルが処理のために取得されるようにする必要があります。META-INFフォルダにpe_ext.xmlが含まれている各JARが処理され、コンポーザの拡張機能がロードされて結合されます。コンポーザの機能を拡張するためにpe_ext.xmlで定義できる様々な要素の詳細は、第B.2.1項「pe_ext.xml」を参照してください。

  • アプリケーションのadf-config.xmlファイル

    adf-config.xmlファイルは、通常デプロイ時に決定され、実行時に変更されることがあるアプリケーション・レベルの設定を指定します。コンポーザでの新しいアドオンおよびカスタム・プロパティ・パネルの登録、カスタマイズ・レイヤーの作成などのタスクを実行するとき、adf-config.xmlファイルに適切なエントリを追加する必要があります。adf-config.xmlファイルはアプリケーションを作成するときに自動的に作成され、Page Customizableコンポーネントをページに追加すると特定の構成がこのファイルに追加されます。

    adf-config.xmlで作成できるコンポーザ固有構成の詳細は、第B.2.2項「adf-config.xml」を参照してください。

19.2 コンポーザのアドオンの作成

コンポーザには、実行時編集のために次のデフォルトのアドオンが用意されています。

これらに加えて、コンポーザで新規アドオンを登録できます。たとえば、コンポーザのツールバーに「リビジョン」アイコンが表示されるように、ページ・リビジョン履歴を表示するアドオンを作成できます。このアイコンをクリックするとページのリビジョン履歴が表示されます。

この項の内容は、次のとおりです。

19.2.1 アドオンの作成および登録の方法

コンポーザのツールバーにあるアイコンから起動できるカスタム・タスク・フローを作成および登録できます。登録されたすべてのアドオンに、ツールバーに表示される関連アイコンがあります。

この項では、アドオンを作成し、これをコンポーザを使用して登録する手順を順を追って説明します。ここには、アプリケーションに関する情報を表示するアドオンの作成方法を示す例が含まれています。例のアドオンは、ユーザーがクリックしてアプリケーションの情報を含むタスク・フローを起動できるコンポーザのツールバーの「情報」アイコン(図19-3)をレンダリングします。

図19-3 コンポーザのツールバーの「情報」アイコン

図19-3の説明が続きます
「図19-3 コンポーザのツールバーの「情報」アイコン」の説明

この項には次のサブセクションが含まれます:

19.2.1.1 アドオン・タスク・フローの作成

コンポーザのアドオンは、JSPXページまたはページ・フラグメントを使用して作成するタスク・フローです。

アドオンを作成するには:

  1. アプリケーション・プロジェクトで、custompanelview.jsffというJSFFファイルを作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」を選択してから「JSFページ」またはJSFフラグメントを選択します。

    3. 「OK」をクリックします。

  2. 例19-1に示すようなコードを追加してフラグメントを設計します。

    例19-1 JSFFフラグメントのサンプル・コード

    <?xml version='1.0' encoding='UTF-8'?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
              xmlns:af="http://xmlns.oracle.com/adf/faces/rich">
      <af:panelGroupLayout id="pnlgrp1" layout="vertical" halign="center">
        <af:spacer id="sp1" height="20" />
        <af:image id="customimage"              source="/images/DemoLogo.jpg"
                  shortDesc="Demo Logo"/>
        <af:spacer id="sp2" height="20"/>
        <af:outputText id="output1" value="This is a sample shopping cart application based on Oracle ADF Framework.
    It also uses the Oracle WebCenter Portal Framework to enable collaboration, application customization and user customization features."/>
        <af:spacer id="sp3" height="20"/>
        <af:outputText id="output2" value="Build : 11.1.1"
                       inlineStyle="font-weight:bold;"/>
      </af:panelGroupLayout>
    </jsp:root>
    

    注意:

    実行時、アドオン・パネルは、このフラグメントのコンテンツに合うように自動的にサイズ設定されます。


  3. custom-panel-task-flowというタスク・フロー定義を作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」「ADFタスク・フロー」の順に選択します。

    3. 「OK」をクリックします。

  4. タスク・フロー定義に作成したcustompanelview.jsffフラグメントをドロップします。


    関連項目:

    『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFタスク・フローのスタート・ガイド


  5. タスク・フロー定義ファイルを保存します。

(オプション)1つのアプリケーションでタスク・フローを作成し、これを別のアプリケーションで使用する場合、まずADFライブラリでこのタスク・フローをパッケージ化し、使用するアプリケーションに結果として得られるJARを追加する必要があります。

ADFライブラリでタスク・フローをパッケージ化するには:

  1. タスク・フローのデプロイメント・プロファイルを作成します。

    1. 「ポータル」プロジェクトを右クリックし、「新規」を選択します。

    2. 「新規ギャラリ」で、「一般」を開き、「デプロイメント・プロファイル」「ADFライブラリのJARファイル」の順に選択して「OK」をクリックします。

    3. 「デプロイメント・プロファイルの作成 -- ADFライブラリJARファイル」ダイアログで、デプロイメント・プロファイルの名前を入力して「OK」をクリックします。

    4. 「ADFライブラリJARデプロイメント・プロファイルのプロパティ」ダイアログで「OK」をクリックします。

    5. 「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。

  2. アプリケーション・ナビゲータで、プロジェクト・フォルダを右クリックして、「デプロイ」デプロイメント・プロファイル名の順に選択します。

  3. 「デプロイ」ダイアログで、「ADFライブラリのJARファイルへのデプロイ」を選択します。

  4. 「終了」をクリックします。

    こうすることによって、JARファイルを含むdeployフォルダが<Application_Root>\Portal\deploy\にあるプロジェクト・フォルダに作成されます。

アドオンを使用する任意のアプリケーションにこのJARファイルを追加できます。

19.2.1.2 コンポーザを使用したアドオンの登録

タスク・フローを作成した後、これをコンポーザを使用して登録し、デフォルトのオプションとともにコンポーザのツールバーに表示されるようにする必要があります。

コンポーザを使用してアドオンを登録するには:

  1. コンポーザ拡張ファイルがまだ存在していない場合、このファイル(pe_ext.xml)をプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME\Portal\src\META-INFディレクトリ)の下のMETA-INFディレクトリに作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」「XML文書」の順に選択します。

    3. 「OK」をクリックします。

    ファイルの名前をpe_ext.xmlにします。

  2. ファイルの<addon-config>要素をネストされた<panels>要素とともに追加します。

  3. アドオンとして登録する各タスク・フローに1つの<panel>要素を追加します。

    拡張ファイルの<panels>要素には、パネルを必要な数だけ宣言できます。

    例19-2に、<panel>エントリを備えた拡張ファイルのコードを示します。

    例19-2 コンポーザの拡張ファイル

    <?xml version="1.0" encoding="US-ASCII" ?>
    <pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
      <addon-config>
        <panels>
          <panel name="oracle.custom.panel" title="About"
                 icon="http://myforums.oracle.com/jive3/images/question-pts-available-16x16.gif"
                 taskflow-id="/WEB-INF/custom-panel-task-flow.xml#custom-panel-task-flow" />
        </panels>
      </addon-config>
    </pe-extension>
    

    addon-configおよび他のネストされた要素の詳細は、第B.2.1.1項「addon-config」を参照してください。

  4. (オプション)次の例に示すようにevent-handlers要素をpanel要素内に追加して、カスタム・パネルにイベント・ハンドラを登録します。

    <event-handlers>
      <event-handler event="close">
        oracle.custom.TaskFlowEventHandler
      </event-handler>
    </event-handlers>
    

    詳細は、第19.6項「コンポーザUIイベントのイベント・ハンドラの構成」を参照してください。

  5. pe_ext.xmlファイルを保存します。

19.2.1.3 アドオンのadf-config.xmlへの登録

アドオンを登録するには、これへの参照をアプリケーションのadf-config.xmlファイルに追加する必要があります。addon-panelsエントリを追加して新しいアドオンを定義します。

アドオンをadf-config.xmlファイルに登録するには:

  1. アプリケーションのadf-config.xmlファイルを開きます。これは、「アプリケーション・リソース」パネルの「ディスクリプタ」の下のADF META-INFフォルダにあります。

  2. ファイルで次のネームスペースをadf-config要素内に追加します。

    xmlns:pe="http://xmlns.oracle.com/adf/pageeditor/config"
    
  3. ネームスペースを付けて<pe:page-editor-config>エントリを追加し、その中に<pe:addon-panels>を含めます。

    カスタム・アドインを登録するとき、デフォルトのアドオンはデフォルトでコンポーザに表示されます。デフォルトのアドオンをすべて表示するには、<pe:addon-panels>タグのshow-default-addons属性をtrueに設定する必要があります。この属性のデフォルト値はfalseです。

    <pe:addon-panels>内で、例19-3に示すように新しいパネルの<pe:addon-panel>エントリを追加します。

    name属性には、コンポーザ拡張ファイルでパネルの登録に使用した名前が含まれている必要があります。

    例19-3 adf-config.xmlで参照される新しいアドオン

    <pe:page-editor-config xmlns="http://xmlns.oracle.com/adf/pageeditor/config">
      <pe:addon-panels show-default-addons="true">
      
        <pe:addon-panel name="oracle.custom.panel" />
      
      </pe:addon-panels>
    </pe:page-editor-config>
    

    注意:

    <addon-panels>の下で<addon-panel>エントリをまったく指定しない場合、デフォルトのオプションのみがコンポーザに表示されます。


  4. adf-config.xmlファイルを保存します。

adf-config.xmlで作成できるコンポーザ固有構成の詳細は、第B.2.2項「adf-config.xml」を参照してください。

19.2.2 実行時の処理

コンポーザを使用して登録するカスタム・アドインは、デフォルトのアドインとともにコンポーザのツールバーにレンダリングされます。

この例では、コンポーザのツールバーに「情報」アイコンがレンダリングされます(図19-4)。

図19-4 コンポーザのツールバーの「情報」アイコン

図19-4の説明が続きます
「図19-4 コンポーザのツールバーの「情報」アイコン」の説明

このアイコンをクリックすると、アプリケーションの情報タスク・フローが表示されます(図19-5)。


注意:

アドオン・パネルは、タスク・フロー内のコンテンツに合せて自動的にサイズ設定されます。


図19-5 アプリケーションの情報タスク・フロー

図19-5の説明が続きます
「図19-5 アプリケーションの情報タスク・フロー」の説明

19.2.3 コンポーザのデフォルトのアドオンの除外方法

「ページ・プロパティ」、「ページのリセット」および「カスタマイズ・マネージャ」の各アイコンをコンポーザのツールバーに表示または非表示にすることを選択できます。これらのアドオンのいずれかを非表示にするには、<pe:addon-panels>show-default-addons属性をtrueに設定し、非表示にするデフォルトのアドオンのエントリを追加し、そのアドオンのrendered属性をfalseに設定する必要があります。

例19-4に、「ページ・プロパティ」アドオンを非表示にするコードを示します。

例19-4 「ページのリセット」オプションを除外したadf-config.xmlファイル

<pe:addon-panels show-default-addons="true">
  <!-- Hide the Reset Page add-on -->
  <pe:addon-panel name="oracle.adf.pageeditor.addonpanels.page-reset" rendered="false"/>
  
  . . . 
  
</pe:addon-panels>

除外されたアドオン(「ページのリセット」)はコンポーザのツールバーに表示されません。他のデフォルトのアドオンはデフォルトの順序でツールバーに表示されます。

19.2.4 カスタマイズ・マネージャのアドオンの表示方法

カスタマイズ・マネージャは、タスク・フロー、ページおよび指定したページのページ・フラグメントのアプリケーションのカスタマイズをユーザーが管理できるコンポーザのアドオンです。詳細は、第16.5.17項「アプリケーションのカスタマイズの管理」を参照してください。

カスタマイズ・マネージャのアドオンは、コンポーザのライブラリで使用できますが、デフォルトではレンダリングされません。これを有効にするには、次の例に示すように、<pe:page-editor-config>内部の<pe:addon-panel>要素を使用してアプリケーションのadf-config.xmlファイルでこれを構成します。

<pe:page-editor-config xmlns="http://xmlns.oracle.com/adf/pageeditor/config">
  <pe:addon-panels show-default-addons="true">
    <pe:addon-panel name="oracle.adf.pageeditor.addonpanels.customization-manager"/>
  
    . . . 
  
  </pe:addon-panels>
  . . . 
</pe:page-editor-config>

この構成を行うと、コンポーザのツールバーは、図19-6に示すように「カスタマイズ・マネージャ」アイコンを表示します。

図19-6「カスタマイズ・マネージャ」アイコン

図19-6の説明が続きます
「図19-6「カスタマイズ・マネージャ」アイコン」の説明

19.2.5 アドオンを選択的に表示する方法

ビジネス要件に応じて、コンポーザで様々なユーザーが使用できるアドオンを選択的に非表示にする必要がある場合があります。アドオンを選択的に非表示にするには、例19-5に示すように、<pe:addon-panels>show-default-addons属性をtrueに設定し、非表示にするデフォルトのアドオンのエントリを追加し、EL式を使用してそのアドオンのrendered属性をfalseにする必要があります。

例19-5 adf-config.xmlファイルのrendered属性の設定

<pe:page-editor-config xmlns="http://xmlns.oracle.com/adf/pageeditor/config">
  <pe:addon-panels show-default-addons="true">
    <pe:addon-panel name="oracle.adf.pageeditor.addonpanels.page-reset" 
                 rendered="#{securityBean.userInPageResetRole}" />  
    . . . 
  </pe:addon-panels>
  . . . 
</pe:page-editor-config>

この例では、securityBeanバッキングBeanは、ログイン・ユーザーのロールに応じてtrueまたはfalseのいずれかを返します。返された値がfalseの場合、コンポーザはコンポーザのツールバーに「ページのリセット」アイコンを表示しません。返された値がtrueの場合、コンポーザは「ページのリセット」アイコンを表示します。


注意:

コンポーザのツールバーで「ページのリセット」アイコンを非表示にすると、タスク・フローのコンテンツの編集中に表示される「タスク・フローのリセット」アイコンも非表示になります。

renderedのデフォルト値はtrueです。つまり、アドオンにrendered属性を指定しないと、そのアドオンは常に表示されます。


19.3 カスタム・プロパティ・パネルの作成

ユーザーがコンポーネントの「編集」アイコンをクリックすると、コンポーザは、「コンポーネント・プロパティ」ダイアログにコンポーネントのプロパティを表示します。「コンポーネント・プロパティ」ダイアログには、一連のタブが用意されています。各タブは、関係する属性のグループを表示します。属性には、コンポーネントの動作および視覚的スタイルのプロパティを制御する関連値があります。たとえば、「スタイル」タブは、幅、高さ、背景色などのコンポーネントのスタイル関係のプロパティを表示します。

同様に、ユーザーが「ページ・プロパティ」アイコンをクリックすると、「ページ・プロパティ」ダイアログが独自の一連のタブとともに開きます。これらのタブには、表示関連のページ・プロパティ、ページ・パラメータおよびセキュリティ設定が含まれています。

「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログに表示されるタブとともにレンダリングするカスタム・プロパティ・パネルを作成して登録できます。また、デフォルトのパネルの削除やカスタム・プロパティ・パネルへの置換も行えます。たとえば、Sourceプロパティのピッカーを表示することによってImageコンポーネントのよりフレンドリなプロパティ・パネルを開発できます。こうすることによって、ユーザーは使用可能なオプションからイメージを容易に選択できるようになります。

この項では、カスタム・プロパティ・パネルの作成方法を説明します。デフォルトのプロパティ・パネルを除外、オーバーライドおよび選択的にレンダリングする方法も説明します。次のサブセクションが含まれます:

19.3.1 カスタム・プロパティ・パネルの作成および登録の方法

カスタム・プロパティ・パネルの作成は、アドオンの作成と似ています。つまり、カスタム・プロパティ・パネルをタスク・フローとして作成し、これをコンポーザ拡張ファイルに登録します。ただし、コンポーザのアドオンはadf-config.xmlファイルのaddon-panels要素を使用して構成されるのに対して、カスタム・プロパティ・パネルは拡張ファイル自体のproperty-panels要素を使用して構成されます。

カスタム・プロパティ・パネルを構成して、常に「コンポーネント・プロパティ」ダイアログに表示できます。または、パネルを構成して、特定のコンポーネントまたはタスク・フローが編集のために選択されたときのみ表示することも可能です。

この項では、カスタム・プロパティ・パネルを作成および登録する方法を説明します。次のサブセクションが含まれます:

19.3.1.1 カスタム・プロパティ・パネルの作成

プロパティ・パネルには、ページまたはコンポーネントのプロパティを編集する方法が用意されています。たとえば、ユーザーは、選択したタスク・フローで「編集」アイコンをクリックし、そのパラメータ値を変更し、「コンポーネント・プロパティ」ダイアログでその視覚的属性を変更できます。

コンポーザでは、プロパティ・パネルをコンポーネントおよびタスク・フローと関連付けることができます。ユーザーがコンポーネントまたはタスク・フローの「編集」アイコンをクリックすると、コンポーザは「コンポーネント・プロパティ」ダイアログを開き、オブジェクトと関連付けたカスタム・プロパティ・パネルをデフォルトのプロパティ・パネルとともに表示します。

カスタム・プロパティ・パネルを作成し、これをコンポーザ拡張ファイルで宣言する手順は、コンポーザのアドオンを作成して宣言する手順と似ています。詳細は、第19.2.1.1項「アドオン・タスク・フローの作成」および第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

例19-6に、pe_ext.xmlファイルでのサンプルのプロパティ・パネル宣言を示します。

例19-6 pe_ext.xmlでのカスタム・プロパティ・パネル宣言

<pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
  <addon-config>
    <panels>
      <panel name="sample-panel" title="Sample Panel"
             taskflow-id="/WEB-INF/sample_task_flow.xml#sample_task_flow"/>
    </panels>
  </addon-config>
</pe-extension>

カスタム・パネルを作成し、pe_ext.xmlファイルで宣言した後、例19-7に示すように、<property-panels>要素を使用してこれを構成する必要があります。こうすることによって、パネルは、コンポーザ・コンポーネント・プロパティおよび「ページ・プロパティ」ダイアログで自動的に表示されます。

例19-7 pe_ext.xmlでのカスタム・プロパティ・パネル構成

<addon-config>
  <panels>
    . . . 
  </panels>
  <property-panels>
    <property-panel name="samplepanel">
      <panel name="sample-panel" rendered="true"/>
    </property-panel>
  </property-panels>
</addon-config>

1つの<panel>要素を使用して、各カスタム・パネルを登録します。<panel>は、「コンポーネント・プロパティ」ダイアログのタブに対応します。任意の数の<panel>要素を追加できます。

19.3.1.2 コンポーネントに対するカスタム・プロパティ・パネルの登録

拡張ファイルにカスタム・パネルを登録するとき、パネルをコンポーネントまたはタスク・フローと関連付けることができます。カスタム・プロパティ・パネルはそのコンポーネントまたはタスク・フローに対してのみレンダリングされます。この項では、特定のコンポーネントに対してプロパティ・パネルを登録する方法を説明します。

コンポーネントに対してプロパティ・パネルを登録するには:

  1. コンポーザ拡張ファイル(pe_ext.xml)を作成します(これがまだ存在していない場合)。

    拡張ファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

  2. pe_ext.xmlファイルの<addon-config>セクション内に<property-panels>要素を追加します。

  3. <property-panel>宣言を<property-panels>要素内に追加します。

    <property-panel>エントリは複数指定できます。

  4. <property-panel>要素内で、<component>要素を追加してコンポーネントの実行時クラス名(オプション)および<panel>要素を指定し、ファイルの<addon-config>セクションのパネルを宣言する際に使用した名前を指定します。

    例19-8に、コンポーネントの完全修飾クラス名を指定することでCommand Buttonコンポーネントに関連付けられたカスタム・プロパティ・パネルを示します。Oracle ADFコンポーネントとその実行時クラスの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。

    例19-8 コンポーネントに対してプロパティ・パネルを登録するコード

    <pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
      <addon-config>
        <property-panels>
          <property-panel name="cmdbtn">
            <component>oracle.adf.view.rich.component.rich.nav.RichCommandButton</component>
            <panel name="prop.panel.cmdbtn" />
            <panel name="prop.panel.generic" /> 
          </property-panel>
        </property-panels>
      </addon-config>
      . . . 
    </pe-extension>
    

    注意:

    プロパティ・パネルを登録するとき、これをコンポーネントまたはタスク・フローと関連付けない場合(次の項で説明)、登録したパネルは常に「コンポーネント・プロパティ」ダイアログおよび「ページ・プロパティ」ダイアログにレンダリングされます。

    コンポーネントに複数のプロパティ・パネルを構成するには、複数の<panel>要素を<property-panel>要素内に含めることができます。<property-panels>要素およびそのネストされた要素の詳細は、第B.2.1.2項「property-panels」を参照してください。


    「子コンポーネント」、「スタイル」、「パラメータ」などのすべてのデフォルトのパネルは、定義したカスタム・パネルとともに表示されます。

19.3.1.3 タスク・フローに対するカスタム・プロパティ・パネルの登録

コンポーザ拡張ファイルに登録することで、タスク・フローのカスタム・プロパティ・パネルを定義できます。例19-9に、タスク・フローへのカスタム・プロパティ・パネルの登録に使用されるサンプル・コードを示します。

特定のタスク・フローに対して登録されたカスタム・プロパティ・パネルは、これが関連付けられたタスク・フローが選択された場合のみ表示されます。それ以外の場合には、デフォルトのプロパティ・パネルが表示されます。


注意:

タスク・フロー固有のカスタム・プロパティ・パネルは、タスク・フロー・パラメータまたはタスク・フローの動作と関係のあるその他の側面をカスタマイズする際にのみ使用します。

カスタム・プロパティ・パネルは、Oracle JSF Portlet Bridgeを使用してレンダリングされたタスク・フローに関連付けられている場合には動作しません。


タスク・フローに対してプロパティ・パネルを登録するには:

  1. pe_ext.xmlファイルの<addon-config>要素内に<property-panels>要素を追加します。

    拡張ファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

  2. この中にproperty-panel宣言を追加します。

    property-panelエントリは複数指定できます。

  3. taskflow-id要素およびpanel要素をproperty-panel要素内に追加します。

    taskflow-id要素を追加してタスク・フロー名を指定します。panel要素を追加して、ファイルのaddon-configセクションでプロパティ・パネルを宣言する際に使用した名前を指定します。

    例19-9に、dashboardタスク・フローと関連付けられたカスタム・プロパティ・パネルを示します。

    例19-9 タスク・フロー・インスタンスにプロパティ・パネルを登録するためのコード

    <pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
      <addon-config>
        <property-panels>
          <property-panel name="dashboard">
            <taskflow-id>/WEB-INF/dashboard-taskflow#prop-panel</taskflow-id>
            <panel name="dashboard.prop-panel" />
          </property-panel>
        </property-panels>
      </addon-config>
      . . . 
    </pe-extension>
    

    注意:

    • (<component>または<taskflow-id>タグを使用して)カスタム・プロパティ・パネルをコンポーネントまたはタスク・フローと関連付けない場合、登録したパネルは、「コンポーネント・プロパティ」ダイアログおよび「ページ・プロパティ」ダイアログのすべてのページ、タスク・フローおよびコンポーネントにレンダリングされます。

      property-panel要素内には、複数のpanel要素を登録できます。property-panels要素およびそのネストされた要素の詳細は、第B.2.1.2項「property-panels」を参照してください。

    • パネルのタスク・フロー・フラグメントでカスタム・プロパティ・パネルに関する属性およびパラメータをエンド・ユーザーが編集できるようにするには、表示する各プロパティのShow Propertyコンポーネントを追加する必要があります。Show Propertyコンポーネントの値属性は、プロパティおよびパラメータの値の読取りおよび書込みを行うロジックを含むマネージドBeanと関連付けられます。詳細は、第19.3.6項「カスタム・プロパティ・パネルでのプロパティおよびパラメータの表示方法」を参照してください。


19.3.2 実行時の処理

カスタム・プロパティ・パネルを特定のコンポーネントまたはタスク・フローと関連付けた場合、実行時このパネルは、指定したコンポーネントまたはタスク・フローから起動した「コンポーネント・プロパティ」ダイアログでタブとしてレンダリングされます。カスタム・プロパティ・パネルを特定のコンポーネントまたはタスク・フローと関連付けなかった場合、実行時このカスタム・プロパティ・パネルは、すべてのページ、コンポーネントおよびタスク・フローに対して「ページ・プロパティ」ダイアログと「コンポーネント・プロパティ」ダイアログの両方でタブとしてレンダリングされます。


注意:

「コンポーネント・プロパティ」ダイアログおよび「ページ・プロパティ」ダイアログで、カスタム・パネルは、タスク・フローを含むタブ・コンポーネントによってサイズ設定されます。タブ・コンポーネント自体のサイズは、現在適用されているスキンのルールによって決まります。このルールはaf|panelTabbed.Tabをコールされます。


19.3.3 デフォルトのプロパティ・パネルのオーバーライド方法

コンポーザの「コンポーネント・プロパティ」ダイアログは、デフォルトで次のパネルを表示します: 「表示オプション」、「子コンポーネント」、「イベント」、「スタイル」、「コンテンツ・スタイル」および「パラメータ」。pe_ext.xmlファイルでカスタム・パネルを宣言および登録するときにデフォルトのパネルの名前を使用して特定のパネルをオーバーライドできます。デフォルトのパネルの詳細は、第B.3項「コンポーザのデフォルト・アドオンとプロパティ・パネル」を参照してください。

例19-10に、「表示オプション」パネルをcustom-panel-task-flowというタスク・フローを使用して定義したパネルでオーバーライドするコードを示します。

例19-10 デフォルトのパネルをオーバーライドするサンプル・コード

<addon-config>
  <panels>
    <panel name="oracle.adf.pageeditor.pane.generic-property-inspector" title="Sample Panel"
           icon="http://myforums.oracle.com/jive3/images/question-pts-available-16x16.gif"
           taskflow-id="/WEB-INF/custom-panel-task-flow.xml#custom-panel-task-flow" />
  </panels>
  <property-panels>
    <property-panel name="samplepanel">
      <panel name="oracle.adf.pageeditor.pane.generic-property-inspector" rendered="true"/>
    </property-panel>
  </property-panels>
</addon-config>

19.3.4 デフォルトのプロパティ・パネルの除外方法

即時利用可能な、すべてのデフォルトのプロパティ・パネルは、構成したカスタム・プロパティ・パネルとともに表示されます。「ページ・プロパティ」ダイアログまたは「コンポーネント・プロパティ」ダイアログでデフォルトのプロパティ・パネルを非表示にするために、そのパネル専用の行を追加し、rendered属性をfalseに設定できます。

例19-11に、Command Buttonコンポーネントの「コンテンツ・スタイル」プロパティ・タブがfalseに設定されたrendered属性を示します。デフォルトのプロパティ・パネルの詳細は、第B.3項「コンポーザのデフォルト・アドオンとプロパティ・パネル」を参照してください。

例19-11 プロパティ・パネルのrendered属性

<pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
  <addon-config>
    <property-panels>
      <property-panel name="cmdbtn">
        <component>oracle.rich.CommandButton</component>
        <panel name="prop.panel.cmdbtn" />
        <panel name="oracle.adf.pageeditor.pane.content-style-editor" rendered="false" />
      </property-panel>
    </property-panels>
  </addon-config>
  . . . 
</pe-extension>

19.3.5 プロパティ・パネルの選択的レンダリング方法

アプリケーションに登録されたカスタム・プロパティ・パネルは、指定したコンポーネントの「編集」アイコンをユーザーがクリックすると、「コンポーネント・プロパティ」ダイアログにレンダリングされます。アプリケーションを構成して、ログイン・ユーザーのロール、表示中のページなどの異なる条件に基づいてプロパティ・パネルを選択的にレンダリングできます。プロパティ・パネルを選択的に表示するために、次の例に示すように、property-panelrendered属性のEL値を使用できます。

<property-panel name="global-but-just" rendered="#{bean.showProperty}">

19.3.6 カスタム・プロパティ・パネルでのプロパティおよびパラメータの表示方法

コンポーネントのカスタム・プロパティ・パネルを構築する場合、コンポーザ・タグ・ライブラリから使用可能なShow Propertyコンポーネントを使用して、カスタム・パネルにコンポーネントの属性を表示できます。カスタム・パネル・タスク・フローを定義するページ・フラグメントで、表示する各属性に対して1つのShow Propertyコンポーネントを追加する必要があります。Show Propertyは、(カスタム・パネルを作成した)コンポーネントまたはタスク・フローのプロパティ値を読み取る宣言型コンポーネントで、カスタム・パネルにそのプロパティの入力フィールドを表示します。ユーザーは、入力フィールドを使用してパネルのプロパティ値を編集できます。

カスタム・パネルの詳細は、第19.3.1.1項「カスタム・プロパティ・パネルの作成」を参照してください。

Show Propertyコンポーネントを追加するには:

  1. カスタム・パネル・タスク・フロー用に作成したページ・フラグメントを開きます。

  2. コンポーネント・パレットで、「コンポーザ」を選択します。

  3. カスタム・パネルに表示するコンポーネント属性それぞれのShow Propertyコンポーネントをドラッグ・アンド・ドロップします。

  4. 属性がカスタム・パネルに正しく表示されるようにするには、第B.1.7項「Show Property」を参照して、各Show Propertyコンポーネントに属性を設定します。


注意:

コンポーザの外側のページでもShow Propertyコンポーネントを使用できます。


Show Detail Frameコンポーネント内に含まれている天気ウィジェットの例を考えてみます。カスタム・プロパティ・パネルが作成され、ユーザーは、天気ウィジェットのText、Auto RefreshおよびRefresh Intervalの各属性を編集できます。これには、ユーザーがこれらの属性に値を指定するための3つのフィールドがあります。ユーザーが天気ウィジェットの3つの属性を設定できるようにするために、パネルで表示する各属性に1つのShow Propertyコンポーネントが追加されます。実行時にユーザーが天気ウィジェットを編集すると、「コンポーネント・プロパティ」ダイアログは、図19-7に示すように3つの属性を含むカスタム・パネルを表示します。

図19-7 Show Detail Frameコンポーネント・プロパティを表示するカスタム・パネル

図19-7の説明が続きます
「図19-7 Show Detail Frameコンポーネント・プロパティを表示するカスタム・パネル」の説明

天気ウィジェットは、次の例に示すようにPollコンポーネントとともにページで使用されます。

<cust:showDetailFrame text="Weather" id="sdf1" contentStyle="height:220.0px;"
                      partialTriggers="p1">
  <af:region value="#{bindings.weathertaskflowdefinition1.regionModel}"
             id="r1"/>
  <af:poll id="p1" interval="60000"/>
</cust:showDetailFrame>

Pollコンポーネントは、リフレッシュされたコンテンツを天気ウィジェットに一定間隔で送信するために使用されます。デフォルトの間隔は60000ミリ秒です。

カスタム・パネルには、3つのpanelLabelandMessageコンポーネントが含まれ、TextAuto RefreshおよびRefresh Intervalの各属性の入力フィールドが用意されています。このパネルのフィールドは次のように実装されます。

  • showPropertyコンポーネントは、次の例に示すように各panelLabelandMessageコンポーネントに追加されます。

    <!-- Input field for setting the Text attribute, which displays on the component header -->
    <af:panelLabelAndMessage label="Text" id="plam2">
      <pedc:showProperty label="Text" id="sp1" simple="true"
                         value="#{sdfCustomPanel.text}"/>
    </af:panelLabelAndMessage>
    
    <!-- Checkbox to enable auto refresh, which controls whether the widget must be refreshed -->
    <af:panelLabelAndMessage label="Auto Refresh" id="plam3">
      <pedc:showProperty label="Auto Refresh" id="sp2" simple="true"
                         type="boolean" autoSubmit="true"
                         value="#{sdfCustomPanel.autoRefresh}"/>
    </af:panelLabelAndMessage>
    
    <!-- LOV to display values for Refresh Interval when auto refresh is enabled -->
    <af:panelLabelAndMessage label="Refresh Interval" id="plam4">
      <pedc:showProperty label="Refresh Interval" id="sp3" simple="true"
                         type="list" disabled="#{!sdfCustomPanel.autoRefresh}"
                         value="#{sdfCustomPanel.refreshInterval}"
                         selectItems="#{sdfCustomPanel.selectItems}" 
                         binding="#{sdfCustomPanelRequestBean.refreshIntervalShowProp}"/>
    </af:panelLabelAndMessage>
    

    ここで、sdfCustomPanelは、マネージドBeanであるSDFCustomPanelBean.javaを参照します。

  • カスタム・パネルのタスク・フロー定義には、Beanへの参照が含まれています。

    <managed-bean id="mb1">
      <managed-bean-name id="mb1_name">sdfCustomPanel</managed-bean-name>
      <managed-bean-class id="mb1_class">portal.weather.panel.SDFCustomPanelBean</managed-bean-class>
      <managed-bean-scope id="mb1scope">session</managed-bean-scope>
    </managed-bean>
    
  • SDFCustomPanelBean.java Beanには、パネルに表示される様々な属性の値を処理するロジックが用意されています。Beanでは、SelectionContext APIは、次のように各属性の値を読み書きするために使用されます。

    • 選択したコンポーネント、つまりプロパティが表示されるコンポーネントを保持します。この例では、Show Detail Frameコンポーネントが天気ウィジェットとしてその内部に含まれます。

    • 選択したコンポーネントの属性値を読み取ります。

    • ユーザーが指定した属性値を取得し、その値をコンポーネント属性に設定します。

    たとえば、Refresh Interval属性は、Auto Refreshが選択された場合のみ有効で、マネージドBeanで定義された値を含むドロップダウン・メニューを表示します。ページのPollコンポーネントは、Show Propertyコンポーネントにワイヤリングされ、ウィジェットのリフレッシュがShow Propertyコンポーネントの値によって行われるようになります。Refresh Intervalプロパティの値を処理するコードは次のとおりです。

    . . . 
    /** Set the refresh interval attribute value on the component
    public void setRefreshInterval(String _refreshInterval)
    {
      this._refreshInterval = _refreshInterval;
    }
    **/
    
    public String getRefreshInterval()
    {
      if (_autoRefresh == true && _refreshInterval != null)
        return _refreshInterval;
    
      // Get hold of the component whose properties you want to edit
      SelectionContext selCtx =
        Context.getCurrentInstance().getSelectionContext();
      UIComponent selComp = selCtx.getSelectedComponent().getUIComponent();
      if (selComp instanceof ShowDetailFrame)
      {
        // Get the refresh interval value specified for the Poll component 
        RichPoll pollComp = (RichPoll) selComp.findComponent("p1");
        if (_autoRefresh == false)
          _refreshInterval = "Refresh interval not applicable";
        else if (pollComp.getInterval() < 0)
          _refreshInterval = "60000";
        else
          _refreshInterval = Integer.toString(pollComp.getInterval());
      }
    
      return _refreshInterval;
    }
    . . . 
    public List<SelectItem> getSelectItems()
    {
      return _selectItems;
    }
    . . . 
    private static List<SelectItem> _selectItems;
    static
    {
      _selectItems = new ArrayList<SelectItem>();
      SelectItem si = new SelectItem("60000", "1 Minutes");
      _selectItems.add(si);
      si = new SelectItem("120000", "2 Minutes");
      _selectItems.add(si);
      si = new SelectItem("180000", "3 Minutes");
      _selectItems.add(si);
    }
    
  • ユーザーがRefresh Intervalプロパティの値を選択し、「コンポーネント・プロパティ」ダイアログで「適用」をクリックすると、保存リスナーがコールされ、保存イベント・ハンドラによって値がBeanに戻されて保存されます。保存イベント・ハンドラの実装の関連コードは次のとおりです。

    public void save()
    {
      . . . 
      if (_autoRefresh)
      {
        aa = new AttributeComponentChange("interval", Integer.parseInt(_refreshInterval));
        changeManager.addComponentChange(context, pollComp, aa);
        aa.changeComponent(pollComp);
      }
      else
      {
        aa = new AttributeComponentChange("interval", new Integer(-1));
        changeManager.addComponentChange(context, pollComp, aa);
        aa.changeComponent(pollComp);
      }
    }
    

19.4 式ビルダーの拡張

「コンポーネント・プロパティ」ダイアログの「パラメータ」タブおよび「表示オプション」タブのすべてのプロパティは、式言語(EL)式を取ることができます。このようなパラメータで使用できる「式ビルダー」オプションは、図19-8に示すように単純に式ビルダーである「編集」ダイアログを開きます。式ビルダーは、取得可能だが取得できない場合には未知である値が必要な場合(たとえば、値を現在のユーザーまたは現在のアプリケーション・スキンの名前にする場合)に特に便利です。

図19-8 式言語エディタ

図19-8の説明が続きます
「図19-8 式言語エディタ」の説明

式ビルダーをカスタマイズして、コンポーザ拡張ファイルpe_ext.xmlに必要なエントリを作成することによってオプションを増やすことができます。ELを無効化するか、または既存のELを上書きから保護するためにコンポーザを構成することもできます。

この項では、式ビルダーを拡張してカスタム機能を追加する方法を説明します。次のサブセクションが含まれます:

19.4.1 式ビルダーの拡張方法

カスタム・オプションを式の値のドロップダウン・リストに追加することによって、式ビルダーを拡張できます。カスタム・オプションを定義し、pe_ext.xmlファイルに含める必要があります。追加する新しい各オプションに対して、<selector>要素を定義し、これをpe_ext.xmlファイルに含める必要があります。

コンポーザ拡張ファイルでカスタム・オプションを構成するには:

  1. 式ダイアログにカスタム・オプションを移入するロジックを備えたJava Bean(たとえば、UserInformation.java)を作成します。例19-12に、新しい文字列(User Name)を式ダイアログのカスタム値として表示するために使用するサンプルのJava Beanのコードを示します。

    例19-12 式ダイアログにカスタム値を追加するサンプル・コード

    package view;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import oracle.adf.view.page.editor.elbuilder.ELParameter;
    import oracle.adf.view.page.editor.elbuilder.ELParameterValue;
    
    public class UserInformation implements ELParameter {
      public String getName() {
        return mName;
      }
    
      public List<ELParameterValue> getValues() {
        if (mValues == null)
          {
            mValues = new ArrayList<ELParameterValue>();
            for(String[] args : mValueList)
              {
                mValues.add(new ELParameterValue(args[0], args[1]));
              }
          }
           return mValues;
      }
      private static String[][] mValueList =    {new String[]{"User Name", "#{securityContext.userName}"}};
      
      private String mName = "User Name";
      private List<ELParameterValue> mValues;  } 
    
  2. <elbuilder-config>要素をpe_ext.xmlファイルに追加してBeanを登録します。

    拡張ファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

  3. <selector>要素を<elbuilder-config>セクション内に追加し、次の例に示すように作成したBeanの詳細を提供します。

    <elbuilder-config>
      <!-- define selector -->
      <selector id="UserInformation">
        view.UserInformation
      </selector>
        
      <!-- include selector -->
      <selectors>
        <selector id="UserInformation" rendered="true"/>
      </selectors>
    </elbuilder-config>
    

    複数の<selector>エントリを異なるカスタム・オプションに含めることができます。

    カスタム・オプションは、デフォルトではすべての属性に対して表示されます。<selector>rendered属性を使用して、特定の条件に基づいてオプションを条件付きで表示できます。

  4. pe_ext.xmlファイルを保存します。

19.4.2 式言語を保護する方法

アプリケーションまたは特定の.jspxページで、ELを無効化するか、または既存のELを上書きから保護するためにコンポーザを構成できます。これは、第19.11項「「デザイン」ビューでの直接選択の有効化」で説明しているように、エンド・ユーザーに要素を公開する際に特に役立ちます。

アプリケーションの設定を定義するには、<pe:page-editor-config>タグ内のadf-config.xmlの次の要素を変更します。

  • <pe:allow-el>は、コンポーネント・プロパティに対してELの入力が可能かどうかを定義します。デフォルトはtrueです。ELがすでにプロパティに対して定義されている場合、これを変更することはできません。

  • <pe:protect-el>は、フォーム要素のELが読取り専用であるかどうかを定義します。デフォルトはfalseです。ELがすでに定義されていて、コンポーネントが別のレベルで編集されている場合は、ELを変更することはできません。

特定の.jspxページの動作を定義するには、<pe:pageCustomizable>タグ内の次の要素を使用します。

  • allowEL (boolean)は、ELがアプリケーション・ページで実行できるかどうかを定義します。デフォルトはtrueです。ELがすでにプロパティに対して定義されている場合、これを変更することはできません。

  • protectEL (boolean)は、フォーム要素のELが読取り専用であるかどうかを定義します。デフォルトはfalseです。ELがすでに定義されていて、コンポーネントが別のレベルで編集されている場合は、ELを変更することはできません。

.jspxページで定義される設定は、adf-config.xmlで定義される設定より優先されます。

19.4.3 実行時の処理

実行時の式ビルダーのセレクタは、カスタム値をデフォルト値とともに表示します。

ELが無効な場合、式ビルダーにはアクセスできず、ELはプロパティ・フィールドで許可されません。

ベース・ドキュメントまたは現在の編集レイヤーより上位のMDSレイヤーが属性値としてELを設定した場合、およびprotectELtrueである場合、ELは「パラメータ」タブでも「表示オプション」タブでも変更できません。(LOVから取得されたELが許可されます。)

19.5 タスク・フローのパラメータのカスタムLOVまたはピッカーの構成

通常、コンポーザでタスク・フローのパラメータを編集中、ユーザーは「コンポーネント・プロパティ」ダイアログにあるテキスト・ボックスに値を入力します。しかし、ユーザーが特定のフィールドに指定する値について混乱することが多いです。これを推測のままにしておくのではなく、各パラメータが取ることができる値がわかっている開発者は、可能な場合には有効なすべてのオプションをリストすることによってユーザーが容易に操作できるようにすることができます。コンポーザを構成して、値のリスト(LOV)またはピッカーを任意のパラメータに対して表示できます。

次のオプションを使用して事前定義された一連のパラメータ値を表示できます。

この項では、様々なタイプのLOVをタスク・フローのパラメータ用に構成する方法を説明します。次のサブセクションが含まれます:

この項の手順の説明に使用する例

この項の手順の一部は、図19-9に示すように、選択した都市の天気の情報を表示する単純な天気タスク・フロー(weather-task-flow-definition)の例を使用します。

図19-9 天気タスク・フロー

図19-9の説明が続きます
「図19-9 天気タスク・フロー」の説明

このタスク・フローには、選択した都市の天気の詳細を選択した温度単位(華氏または摂氏)で表示するようにそれぞれをユーザーが変更できる2つのパラメータ(zipCodetempUnits)が用意されています。この天気タスク・フローの例は、次のタイプのLOVを構成する方法を説明するために使用します。

天気タスク・フローには、例19-13に示すようにコードを備えたタスク・フロー定義ファイル(weather-task-flow-definition.xml)が含まれています。

例19-13 weather-task-flow-definition.xmlファイル

<?xml version="1.0" encoding="US-ASCII" ?>
<adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">
  <task-flow-definition id="weather-task-flow-definition">
    <default-activity id="defaultactivity1">weather</default-activity>
    <input-parameter-definition id="inputparam1">
      <name id="inputparam1name">zipcode</name>
      <value>#{pageFlowScope.zipcode}</value>
      <class>java.lang.String</class>
      <required/>
    </input-parameter-definition>
    <input-parameter-definition id="inputparam2">
      <name id="ip2name">tempUnits</name>
      <value>#{pageFlowScope.tempUnits}</value>
      <class>java.lang.String</class>
    </input-parameter-definition>
    <view id="weather">
      <page>/weather.jsff</page>
    </view>
    <use-page-fragments/>
  </task-flow-definition>
</adfc-config>

太字で表示したパラメータは、実行時にユーザーが指定した値がセッションBean (pageFlowScope)に格納され、ここからその値を別のコンポーネントが読み取ることができるような方法で定義されます。

実行時にタスク・フローを編集すると、「パラメータ」タブは、パラメータ値を入力するための2つの入力テキスト・フィールドを表示します。次の項では、これらのタスク・フローのパラメータのLOVを有効にして、ユーザーが事前定義されたオプションのリストから選択できるようにする方法を説明します。

19.5.1 LOVの構成方法

この項では、様々なタイプのLOVをタスク・フローのパラメータ用に構成する方法を説明します。次のサブセクションが含まれます:

19.5.1.1 静的LOVの構成

静的LOVを使用して、パラメータに対して事前定義された値のリストを表示します。コンポーザ拡張ファイル(pe_ext.xml)でネストされた<enumeration>要素を備えた<lov-config>セクションを定義することによって、静的LOVを構成できます。この項では、天気タスク・フローの例を使用して、tempUnitsパラメータの静的LOVを構成する方法を説明します。

静的LOVを構成するには:

  1. コンポーザ拡張ファイルのpe_ext.xmlが存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME\Portal\adfmsrc\META-INFディレクトリ)の下のMETA-INFディレクトリに作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」「XML文書」の順に選択します。

    3. 「OK」をクリックします。

    ファイルの名前をpe_ext.xmlにします。

  2. 次のコード例に示すように、<lov-config>セクションを追加し、ネストされた<enumeration>要素を備えたタスク・フロー定義を含みます。

    <lov-config>
      <!-- Entry for the task flow in which you are configuring the LOV -->
      <task-flow-definition taskflow-id="/WEB-INF/weather-task-flow-definition.xml#weather-task-flow-definition">
    
        <!-- Specifying the parameter for which you want to define a static LOV -->
        <input-parameter-definition>
          <name>tempUnits</name>
          <!-- List of values to be displayed for the parameter -->
          <enumeration inline="true">
            <item>
              <name>Celcius</name>
              <value>c</value>
              <description>Temperature in Celcius</description>
            </item>
            <item>
              <name>Fahrenheit</name>
              <value>f</value>
              <description>Temperature in Fahrenheit</description>
            </item>
          </enumeration>
        </input-parameter-definition>
    
      </task-flow-definition>
    </lov-config>
    

    <lov-config>セクション内に任意の数の静的LOVを構成できます。


    注意:

    パラメータ名として翻訳可能な文字列を指定できるようにするために、名前にEL値を使用できます(たとえば、#{resourceBundle.temp_units})。


  3. ファイルを保存します。

19.5.1.2 動的LOVの構成

動的LOVを使用して、実行時にEL値を評価して動的に生成されるリストを表示します。この項では、天気タスク・フローの例を使用して、zipCodeパラメータの動的LOVを構成する方法を説明します。例を簡潔にしておくために、マネージドBeanは、実行時にZipcodeフィールドに表示される静的値のみを提供します。

動的LOVを構成するには:

  1. Bean(たとえば、weatherBean)を作成し、Zipcodeパラメータの値のリストを定義します。次の例に関連するコード・スニペットを示します。

    package portal.weather;
    
      . . . 
    
      public List<SelectItem> getCitiesList() {
        return citiesList;
      }
     
      private static final String F = "&deg;F";
      private static final String C = "&deg;C";
      private static final String [][] selectItems = {{"Redwood City", "94065"}, 
                                                      {"Novi, MI", "48375"}, 
                                                      {"Los Angeles", "90001"},
                                                      {"New York", "10036"}};
        
      private static final List<SelectItem> citiesList = new ArrayList<SelectItem>();
        static {
          for (String[] city : selectItems){
            citiesList.add(new SelectItem(city[1], city[0]));
        }
      }
    
  2. 次の例に示すように、アプリケーションのfaces-config.xmlファイルにweatherBeanを登録します。

    <managed-bean>
      <managed-bean-name>weatherBean</managed-bean-name>
      <managed-bean-class>portal.weather.WeatherBean</managed-bean-class>
      <managed-bean-scope>request</managed-bean-scope>
    </managed-bean>
    
  3. コンポーザ拡張ファイルのpe_ext.xmlが存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME\Portal\adfmsrc\META-INFディレクトリ)の下のMETA-INFディレクトリに作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」「XML文書」の順に選択します。

    3. 「OK」をクリックします。

    ファイルの名前をpe_ext.xmlにします。

  4. 次の例に示すように、<lov-config>セクションを追加し、<enumeration>要素を備えたタスク・フロー定義を含め、パラメータ値のマネージドBeanを参照します。

    <lov-config>
      <task-flow-definition taskflow-id="/WEB-INF/weather-task-flow-definition.xml#weather-task-flow-definition">
        <input-parameter-definition>
          <name>zipcode</name>
          <value>90001</value>
          <enumeration items="#{weatherBean.citiesList}"/>
        <input-parameter-definition>
      </task-flow-definition>
    </lov-config>
    

    <lov-config>セクション内に任意の数の動的LOVを構成できます。

  5. ファイルを保存します。

19.5.1.3 ピッカーの構成

通常、ピッカーを使用すると、ユーザーは、使用可能なすべてのオプション(色ピッカー、日付ピッカーなど)を表示するポップアップ・ダイアログから値を選択できます。タスク・フローのパラメータのピッカーを構成することには、次の高水準のタスクが含まれます。

  • 選択したUIを使用してピッカー・タスク・フローを作成します。

  • ピッカー・タスク・フローのパラメータを定義します。これらのパラメータを使用して、メイン・タスク・フローのパラメータ(ピッカーを構成するためのパラメータ)を移入します。

  • メイン・タスク・フローのパラメータを構成して、作成したピッカーを表示します。この構成をpe_ext.xmlファイルに追加する必要があります。

この項では、例として天気タスク・フローを使用して、これらの手順を詳細に説明します。zipCodeパラメータの都市ピッカーを構成する方法を示します。ピッカー・タスク・フローでは、ユーザーは、都市名を指定し、その場所の郵便番号を取得できます。ピッカーからの郵便番号は、天気タスク・フローのZipcodeフィールドに入力されます。この項には次のサブセクションが含まれます:

19.5.1.3.1 ピッカー・タスク・フローの作成

JSFFフラグメントを使用してピッカー・タスク・フローを作成します。フラグメントを設計して、選択したフィールドまたはオプションを表示します。

ピッカー・タスク・フローを作成するには:

  1. アプリケーション・プロジェクトで、ADFタスク・フロー(たとえば、weather-picker-task-flow-definition)を作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」「ADFタスク・フロー」の順に選択します。

    3. 「OK」をクリックします。

  2. ビュー・オブジェクトをタスク・フローに追加します(たとえば、weatherPicker)。

  3. ビューをダブルクリックしてweatherPicker.jsffフラグメントを作成します。


    関連項目:

    様々なタイプのADFタスク・フローを作成する方法の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』の「ADFタスク・フローのスタート・ガイド」の章を参照してください。


  4. 選択したコンポーネントを使用してフラグメントを設計します。例19-14に、XMLファイルでユーザーが郵便番号を検索できる2つのInput Textコンポーネントと「OK」「取消」の2つのUIコントロールを含むサンプルのタスク・フローを示します。

    例19-14 ピッカーのJSFFフラグメントのサンプル・コード

    <?xml version='1.0' encoding='UTF-8'?>
    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
              xmlns:af="http://xmlns.oracle.com/adf/faces/rich"
              xmlns:f="http://java.sun.com/jsf/core">
      <af:panelStretchLayout id="psl1">
        <f:facet name="center">
          <af:panelGroupLayout id="pgl1" layout="vertical">
    
            <af:panelGroupLayout id="pgl2" layout="horizontal">
              <!-- Text field and Search button to search for a city by specifying the ZIP code -->
              <af:inputText label="Enter Zip Code" id="it1"
                            value="#{pageFlowScope.weatherPicker.searchZipcode}"/>
              <af:commandButton text="Search By Zipcode" id="cb1"
                                actionListener="#{pageFlowScope.weatherPicker.zipcodeSearch}"/>
            </af:panelGroupLayout>
    
            <af:panelGroupLayout id="pgl3" layout="horizontal">
              <!-- Text field and Search button to search for a city by specifying the city name -->
              <af:inputText label="Enter City" id="it2"                        value="#{pageFlowScope.weatherPicker.searchCity}"/>
              <af:commandButton text="Search By City" id="cb2"
                                actionListener="#{pageFlowScope.weatherPicker.citySearch}"/>
            </af:panelGroupLayout>
    
            <!-- Output components to display the result from the search -->
            <af:outputFormatted value="#{pageFlowScope.weatherPicker.city}"
                                id="of2"/>
            <af:outputFormatted value="#{pageFlowScope.weatherPicker.zipcode}"
                                id="of3"/>
    
          </af:panelGroupLayout>
        </f:facet>
        <f:facet name="bottom">
          <af:panelGroupLayout layout="horizontal" halign="end" id="pkrPgl">
    
            <!-- OK button -->
            <af:commandButton action="ok"
                              actionListener="#{pageFlowScope.weatherPicker.populateReturnValue}"
                              text="#{Bundle.OK_BUTTON_TEXT}" id="okBtn"/>
            <af:spacer width="5" id="s1"/>
    
            <!-- Cancel button -->
            <af:commandButton actionListener="#{pageFlowScope.weatherPicker.closePickerPopup}"
                              text="#{Bundle.CANCEL_BUTTON_TEXT}"
                              id="cnclBtn"/>
          </af:panelGroupLayout>
        </f:facet>
      </af:panelStretchLayout>
    </jsp:root>
    

    「OK」ボタンおよび「取消」ボタンのアクション・リスナーは、マネージドBeanのweatherPickerを参照します。このBeanには、メイン・タスク・フローのパラメータにピッカーで指定した値を移入するロジックも含まれています。

  5. ピッカー・タスク・フロー定義で参照したBeanを作成し、メイン・タスク・フローに値を返すロジックを追加します。

    次の例は、名前によって都市を検索し、郵便番号を返すロジックを含むweatherPicker Beanの関連コード・スニペットを示しています。

    package portal.weather.picker;
     
    . . . 
    
      public void populateReturnValue(ActionEvent ae) {
        Map map = (Map)RequestContext.getCurrentInstance().getPageFlowScope().get("outParam");
        if (map != null)
          map.put("outParamVal", _zipcode);
      }
     
      public void closePickerPopup(ActionEvent ae) {
        UIComponent component = ae.getComponent();
          while (!(component instanceof RichPopup))
            component = component.getParent();
            if (component != null)
              ((RichPopup)component).cancel();
      }
      . . . 
    
  6. 次の例に示すように、weatherPicker Beanをタスク・フロー定義ファイルに登録します。

    <managed-bean id="pickerbean">
      <managed-bean-name id="pickerbeanname">weatherPicker</managed-bean-name>
      <managed-bean-class id="pickerbeanclass">portal.weather.picker.WeatherPicker</managed-bean-class>
      <managed-bean-scope id="pickerbeanscope">pageFlow</managed-bean-scope>
    </managed-bean>
    
  7. 次の例に示すように、ピッカー・タスク・フローの2つの入力パラメータinParamValoutParamを定義します。

    <!-- Parameter used to store the value that must be passed to the main task flow -->
    <input-parameter-definition id="pickerip1">
      <name id="pickerip1name">outParam</name>
      <value>#{pageFlowScope.outParam}</value>
      <class>java.util.Map</class>
    </input-parameter-definition>
    
    <!-- Parameter used to store the value specified by the user in the picker -->
    <input-parameter-definition id="pickerip2">
      <name id="pickerip2name">inParamVal</name>
      <value>#{pageFlowScope.inParamVal}</value>
      <class>java.lang.String</class>
    </input-parameter-definition>
    

    これらのパラメータは、pageFlowScopeで参照され、メイン・タスク・フローのパラメータzipCodeを読み取り、移入するために使用されます。「郵便番号」フィールドの隣のピッカー・アイコンをユーザーがクリックすると、inParamValを使用して、フィールドの現在の値がセッションBeanに渡されます。ユーザーがピッカー・タスク・フローで都市名を指定して「OK」をクリックすると、Beanはその都市の郵便番号を取得し、outParamを使用してメインの天気タスク・フローに渡します。

  8. タスク・フローの戻りアクティビティおよび「OK」ボタンと「取消」ボタンに対する制御フロー・ルールを定義します。これらのアクティビティおよびルールによって、いずれかのボタンがクリックされると制御はタスク・フローに返されます。次の例に示すようにタスク・フローの戻りアクティビティおよび制御フロー・ルールを定義できます。

    <!-- The outcome to be returned to the task flow if a user clicks OK -->
    <task-flow-return id="ok">
      <outcome id="ok1">
        <name id="okayed">ok</name>
      </outcome>
    </task-flow-return>
    <!-- The outcome to be returned to the task flow if a user clicks Cancel -->
    <task-flow-return id="cancel">
      <outcome id="cancel1">
        <name id="canceled">cancel</name>
      </outcome>
    </task-flow-return>
    
    <!-- Rules to pass control flow to the ok activity if the user clicks OK and to the cancel activity if the user clicks Cancel -->
    <control-flow-rule id="flowrule1">
      <from-activity-id id="fromactivity1">weatherPicker</from-activity-id>
      <control-flow-case id="flowcase1">
        <from-outcome id="fromoutcome1">ok</from-outcome>
        <to-activity-id id="toactivity1">ok</to-activity-id>
      </control-flow-case>
      <control-flow-case id="flowcase2">
        <from-outcome id="fromoutcome2">cancel</from-outcome>
        <to-activity-id id="toactivity2">cancel</to-activity-id>
      </control-flow-case>
    </control-flow-rule>
    

    タスク・フロー定義は、次の例のようなコードを備えます。

    <?xml version="1.0" encoding="US-ASCII" ?>
    <adfc-config xmlns="http://xmlns.oracle.com/adf/controller" version="1.2">
      <task-flow-definition id="weather-picker-task-flow-definition">
        <default-activity id="pickeractivity1">weatherPicker</default-activity>
        <input-parameter-definition id="pickerip1">
          <name id="pickerip1name">outParam</name>
          <value>#{pageFlowScope.outParam}</value>
          <class>java.util.Map</class>
        </input-parameter-definition>
        <input-parameter-definition id="pickerip2">
          <name id="pickerip2name">inParamVal</name>
          <value>#{pageFlowScope.inParamVal}</value>
          <class>java.lang.String</class>
        </input-parameter-definition>
        <managed-bean id="pickerbean">
          <managed-bean-name id="pickerbeanname">weatherPicker</managed-bean-name>
          <managed-bean-class id="pickerbeanclass">portal.weather.picker.WeatherPicker</managed-bean-class>
          <managed-bean-scope id="pickerbeanscope">pageFlow</managed-bean-scope>
        </managed-bean>
        <view id="weatherPicker">
          <page>/weatherPicker.jsff</page>
        </view>
        <task-flow-return id="ok">
          <outcome id="ok1">
            <name id="okayed">ok</name>
          </outcome>
        </task-flow-return>
        <task-flow-return id="cancel">
          <outcome id="cancel1">
            <name id="canceled">cancel</name>
          </outcome>
        </task-flow-return>
        <control-flow-rule id="flowrule1">
          <from-activity-id id="fromactivity1">weatherPicker</from-activity-id>
          <control-flow-case id="flowcase1">
            <from-outcome id="fromoutcome1">ok</from-outcome>
            <to-activity-id id="toactivity1">ok</to-activity-id>
          </control-flow-case>
          <control-flow-case id="flowcase2">
            <from-outcome id="fromoutcome2">cancel</from-outcome>
            <to-activity-id id="toactivity2">cancel</to-activity-id>
          </control-flow-case>
        </control-flow-rule>
        <use-page-fragments/>
      </task-flow-definition>
    </adfc-config>
    
  9. タスク・フロー定義ファイルを保存します。

19.5.1.3.2 タスク・フローのパラメータに対するピッカーの登録

タスク・フローのパラメータのカスタム・ピッカーを表示するには、コンポーザ拡張ファイルpe_ext.xmlでそのパラメータのピッカーを構成する必要があります。

タスク・フローのパラメータに対してピッカーを構成するには:

  1. コンポーザ拡張ファイルのpe_ext.xmlが存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME\Portal\adfmsrc\META-INFディレクトリ)の下のMETA-INFディレクトリに作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」「XML文書」の順に選択します。

    3. 「OK」をクリックします。

    ファイルの名前をpe_ext.xmlにします。

  2. 次のコード例に示すように、<lov-config>セクションを追加し、ピッカー・タスク・フローを参照する<enumeration>要素を備えたタスク・フロー定義を含みます。

    <?xml version="1.0" encoding="UTF-8"?>
    <pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
      <lov-config>
        <task-flow-definition taskflow-id="/WEB-INF/weather-task-flow-definition.xml#weather-task-flow-definition">
          <!-- Parameter for which you defined the picker -->
          <input-parameter-definition>
            <name>zipCode</name>
            <value>null</value>
            <!-- enumeration items coming from the picker task flow -->
            <enumeration picker="/WEB-INF/weather-picker-task-flow-definition.xml#weather-picker-task-flow-definition"/>
          </input-parameter-definition>
        </task-flow-definition>
      </lov-config>
    </pe-extension>
    

    <lov-config>セクション内に任意の数のパラメータのピッカーを構成できます。

  3. ファイルを保存します。

実行時にメイン・タスク・フローを編集すると、「コンポーネント・プロパティ」ダイアログにはそのパラメータの隣に拡大アイコンが表示されます。アイコンをクリックすると、ユーザーが値を選択できるピッカー・タスク・フローが起動します。

19.5.1.4 グローバル・リストからのLOVの構成

アプリケーション内の別のタスク・フローのパラメータにLOVを再使用する場合、LOVをグローバル・レベルで定義し、タスク・フローのパラメータからこれを参照できます。

グローバル・リストからLOVを構成するには:

  1. コンポーザ拡張ファイルのpe_ext.xmlが存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME\Portal\adfmsrc\META-INFディレクトリ)の下のMETA-INFディレクトリに作成します。

    1. 「ファイル」メニューから「新規」を選択します。

    2. 「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」「XML文書」の順に選択します。

    3. 「OK」をクリックします。

    ファイルの名前をpe_ext.xmlにします。

  2. 次のコード例に示すように、<lov-config>セクションを追加し、(タスク・フロー定義の外側で)<enumeration>要素内の値をリストします。

    <lov-config>
    <!-- Global enumerations ->
      <enumeration id="temperature">
        <item>
          <name>Celcius</name>
          <value>c</value>
          <description>Temperature in Celcius</description>
        </item>
        <item>
          <name>Fahrenheit</name>
          <value>f</value>
          <description>Temperature in Fahrenheit</description>
        </item>
      </enumeration>
      <task-flow-definition . . . >
      . . . 
    <lov-config>
    

    <lov-config>セクション内に任意の数のグローバルLOVを構成できます。

  3. 次の例に示すように、pe_ext.xmlファイルの任意の入力パラメータ定義からこのグローバルLOVを参照します。

    <task-flow-definition taskflow-id="/WEB-INF/weather-task-flow-definition.xml#weather-task-flow-definition">
      <input-parameter-definition>
        <name>tempUnits</name>
        <value>Celsius</value>
        <enumeration ref="temperature"/>
      </input-parameter-definition>
    </task-flow-definition>
    
  4. ファイルを保存します。

19.5.2 実行時の処理

タスク・フローのパラメータに対して構成したLOVのタイプに応じて、パラメータ値を指定するための異なるオプションがユーザーに表示されます。

温度の単位フィールドには、pe_ext.xmlファイルで定義した静的LOVから値がリストされます。

「郵便番号」フィールドのピッカーを構成した場合、このフィールドの右側に拡大アイコンが表示されます。このアイコンは、ユーザーが名前または郵便番号を指定することによって都市を選択できるピッカーを起動します。

19.6 コンポーザUIイベントのイベント・ハンドラの構成

イベント・ハンドラは、コンポーザを使用して登録され、ユーザーがページでアクションを実行するとコールされるJavaクラスです。たとえば、「保存」ボタンをクリックすると、コンポーザはアプリケーションに保存イベントに応答する機会を与えるアプリケーション・コードにコール・バックします。コンポーザがデフォルトで提供するイベント・ハンドラに加えて、カスタム・プロパティ・パネルの変更を保存するなど、アプリケーション固有のイベントに対して追加のハンドラを構成できます。

この項では、コンポーザでUIイベントのイベント・ハンドラを作成および登録する方法について説明します。次のサブセクションが含まれます:

19.6.1 コンポーザUIイベントのハンドラの作成および登録の方法

コンポーザを使用してイベント・ハンドラを登録すると、これは、対応するイベントがコンポーザUIで起動されるときにコールされます。

この項では、イベント・ハンドラを作成し、コンポーザを使用してこれを登録する方法を説明します。次のサブセクションが含まれます:

19.6.1.1 イベント・ハンドラの登録をサポートするUIイベント

表19-1に、現在コンポーザがハンドラの登録をサポートしているUIイベントをリストします。

表19-1 ハンドラの登録がサポートされているイベント

イベント 原因 イベント・タイプ リスナー・インタフェース(oracle.adf.view.page.editor.event) メソッド イベント・インタフェース

保存

ユーザーがコンポーザのツールバーの「保存」または「保存してラベル付け」ボタンをクリックするか、または「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログの「適用」(保存)または「OK」(保存して閉じる)ボタンをクリックすると起動します。

save

SaveListener

processSave

SaveEvent

閉じる

ユーザーがコンポーザのツールバーで「閉じる」ボタンをクリックすると起動します。

close

CloseListener

processClose

CloseEvent

削除

ユーザーがコンポーネントを削除すると起動します。

delete

DeletionListener

processDeletion

DeletionEvent

getComponentを使用して削除されたコンポーネントを取得します。

追加

ユーザーがアイテムの「追加」ボタンをクリックして、リソース・カタログからページにコンポーネントを追加すると起動します。

add

AdditionListener

processAddition

AdditionEvent

選択

ユーザーが次の項目を選択すると起動します。

  • 「デザイン」ビューまたは「コンテンツの追加」ビューのPanel CustomizableコンポーネントまたはShow Detail Frameコンポーネントの「編集」アイコン

  • 「構造」ビューのページまたは階層に含まれるコンポーネント

select

SelectionListener

processSelection

SelectionEvent

属性変更

ユーザーが属性を変更すると起動します。

属性変更が無効な場合、リスナーはAbortProcessingExceptionを呼び出して、警告メッセージの重大度を設定します。重大度が「致命的」または「エラー」(デフォルト)に設定される場合、ユーザーは「適用」または「OK」をクリックする前に、プロパティ・インスペクタで属性を修正するように強制されます。他の重大度のすべてが通知ポップアップに表示されますが、ユーザーはさらにアクションを行うことなく保存できます。

attribute-change

AttributeChangeListener

processAttributeChange

AttributeChangeEvent

getMessageSeverity and setMessageSeverityを使用して警告重大度を取得して設定します。

setMessageSummary and setMessageDetailを使用して警告のメッセージを定義します。リスナーがエラーなしに属性変更を確認する場合でもメッセージを表示するには、setMessageSummary("")
setMessageSeverity(FacesMessage.SEVERITY_INFO);
setShowMessage(true)
を使用します。


19.6.1.2 保存イベント・ハンドラの作成: 例

コンポーザを使用してイベントを登録するには、まずJavaクラスを作成し、イベント・ハンドラに適切なリスナーを実装する必要があります。この項では、保存イベント・ハンドラを作成する手順を説明します。同様の手順を実行して、表19-1にリストされている、すべてのサポートされているイベントのイベント・ハンドラを作成できます。

保存イベント・ハンドラは、ユーザーがコンポーザのツールバーで「保存」ボタンをクリックするか、または「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログで「適用」ボタンまたは「OK」ボタンをクリックするとコールされます。保存イベント・ハンドラはoracle.adf.view.page.editor.event.SaveListenerを実装する必要があります。保存イベントのisCommitメソッドを使用して、ページに対して行われた変更とコンポーネント・プロパティに対して行われた変更を区別できます。値がtrueの場合、ユーザーがコンポーザのツールバーで「保存」ボタンをクリックし、ページに対して行われた変更を保存したことを示します。値がfalseの場合、ユーザーが「コンポーネント・プロパティ」ダイアログで「適用」ボタンまたは「OK」ボタンをクリックし、コンポーネント・プロパティに対して行われた変更を保存したことを示します。

保存イベント・ハンドラを作成するには:

  1. JDeveloperで、Portalプロジェクトを選択し、「ファイル」メニューから「新規」を選択します。

  2. 「新規ギャラリ」ダイアログで、「一般」を開き、「Java」「Javaクラス」の順に選択して、「OK」をクリックします。

  3. 「Javaクラスの作成」ダイアログで、クラスの名前(SaveHandlerなど)を指定します。

  4. 「オプション属性」セクションで、oracle.adf.view.page.editor.event.SaveListenerインタフェースを追加します。


    注意:

    oracle.adf.view.page.editorクラスパスを表示できない場合、コンポーザがプロジェクトのライブラリとクラスパスに含まれていることを確認してください。これを実行するには、アプリケーション・ナビゲータでプロジェクトを右クリックして「プロジェクト・プロパティ」を選択します。「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「コンポーザ」をリストに追加します。


  5. 「OK」をクリックします。

    Javaクラスのソースは次のようになります。

    package view;
    
    import javax.faces.event.AbortProcessingException;
    
    import oracle.adf.view.page.editor.event.SaveEvent;
    import oracle.adf.view.page.editor.event.SaveListener;
    
    public class SaveHandler implements SaveListener {
      public Class1() {
        super();
      }
      public void processSave(SaveEvent saveEvent) throws AbortProcessingException {
    // Your implementation goes here
      }
    }
    

    イベントを取り消す必要がある場合、メソッドはこの例外をスローすることがあるため、throws AbortProcessingExceptionとしてprocessSaveメソッドを宣言する必要があります。例外オブジェクト(作成時)にこのイベントを取り消すための理由を含めることができます。

    この例外をスローするとき、このイベントの残りの処理は取り消され、キューに入っているリスナーはスキップされます。

これと同様の手順を実行することによって、サポートされているすべてのイベントのイベント・ハンドラを作成できます。

19.6.1.3 コンポーザを使用したイベント・ハンドラの登録

イベント・ハンドラを作成および実装した後、コンポーザを使用してこれを登録する必要があります。登録は、対応するイベントがUIで発生したときに、ハンドラがコンポーザによってコールされて戻されるようにするために必要です。

コンポーザ拡張ファイル(/META-INF/pe_ext.xml)でイベント・ハンドラを登録します。このファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

イベント・ハンドラを登録するには:

  1. アプリケーションのpe_ext.xmlファイルに、次のエントリを追加します。

    <event-handlers>
      <event-handler event="save">view.SaveHandler</event-handler>
    </event-handlers>
    

    event属性およびevent-handlerタグ間に提供する値は、入力したイベントのタイプおよびイベント・クラスに指定した名前に対して一意です。

  2. ファイルを保存します。

19.6.2 イベント・ハンドラを作成および登録する際の処理

実行時、登録したイベント・ハンドラは、拡張ファイルの順序およびこれらがクラス・パスで見つかる順序に応じてコールされます。コンポーザのネイティブ・イベント・ハンドラは最後にコールされます。

イベント・ハンドラのprocessEventNameメソッドの起動時に、イベント・ハンドラがiAbortProcessingExceptionをスローする場合、イベントは取り消されて、コンポーザのネイティブ・イベント・ハンドラを含むイベント・ハンドラがこれ以上コールされません。ただし、イベント・ハンドラのインスタンス化時にエラーが発生する場合は、コンポーザが次のイベント・ハンドラを続行します。警告メッセージがログに記録されます。

19.6.3 その他のコンポーザのイベント・ハンドラの構成

コンポーザのページでトリガーされた各UIイベントでは、対応するイベント・ハンドラはアプリケーションで登録されたリスナーからメソッドをコールして戻します。いくつかの追加の構成を実行することにより、イベント・ハンドラが実行される順序を指定し、リスナーがプロセスを終了するように構成するか、またはイベントが処理されるようにコンポーザに通知できます。

19.6.3.1 イベント・ハンドラの順序番号の指定

イベント・ハンドラの順序を指定することによって、イベント・ハンドラ(したがってリスナー)がコールされる順序を決定できます。pe_ext.xmlファイルで登録されたイベント・ハンドラに対してsequence属性を定義することによって、リスナーへの順序番号の割当てまたはデフォルト値の変更を行えます。

リスナーに順序番号を指定するには:

  1. アプリケーションのpe_ext.xmlファイルで、順序指定するハンドラのevent-handler要素を探します。

  2. sequence属性を次のように追加します。

    <event-handlers>
      <event-handler event="save" sequence="101">view.SaveHandler</event-handler>
    </event-handlers>
    

    sequence属性の値は正の整数である必要があります。この属性を定義しないと、イベント・ハンドラは、デフォルトの順序番号100に内部的に割り当てられます。

    コンポーザ組込みのリスナーおよび順序番号のないリスナーは、デフォルトの順序番号100に割り当てられます。特定のイベント・ハンドラを他のイベント・ハンドラより前にコールする場合、100未満の値を指定する必要があります。

  3. ファイルを保存します。

19.6.3.2 イベント処理の終了

イベント・ハンドラを構成して、例外をスローすることによって現在のイベントおよびその後のすべてのイベントの処理を終了できます。このためには、リスナーをthrowsAbortProcessingExceptionとして実装するときに使用したメソッドを宣言する必要があります。また、ハンドラを構成して、イベントがEvent.setEventHandled(true)メソッドを使用して処理されたことをコンポーザに通知できます。

たとえば、deleteイベント・ハンドラを構成して、現在のイベントおよび保留中のすべての削除イベントを終了し、ユーザーがコンポーザでコンポーネントを削除しようとしたときに例外をスローできます。これを有効にするには、例19-15に示すようにDeletionListenerインタフェースを実装する必要があります。

例19-15 DeletionListenerの実装

public class DeleteHandler implements DeletionListener
{
  ...
  public void processDeletion(DeletionEvent delEvent) throws  AbortProcessingException
  {
    // Get the component that must be deleted
    UIComponent comp = delEvent.getComponent();

    if (comp != null)
    {
      try
      {
        // Assuming that a custom method, handleDelete(comp), handles deletion of
        // a component and returns true on successful deletion and false in case
        // of failure
        boolean deleteSucceeded = handleDelete(comp);

        // If deletion failed, then notify Composer that the delete event
        // has been handled. No further events are processed.
        if (!deleteSucceeded)
          delEvent.setEventHandled(true);
      }

      catch (Exception e)
      {
       // Catch Exception throw by handleDelete(comp) and handle it by throwing
       // AbortProcessingException to stop processing of delete events.
       throw new AbortProcessingException(e)
      }
    }
  }
  ...
}

19.7 リソース・カタログのドロップ・ハンドラの構成

ドロップ・ハンドラは、コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるJavaクラスです。ドロップ・ハンドラは、処理できるデータ・フレーバを宣言します。カタログの各リソースにフレーバがあります。ユーザーがリソースの隣の「追加」リンクをクリックすると、コンポーザは登録されているすべてのドロップ・ハンドラを問い合せ、このフレーバを処理できるかどうか確認します。そのフレーバを処理できるドロップ・ハンドラが1つのみの場合、制御がそのドロップ・ハンドラに渡され、リソースがすぐにページに追加されます。そのフレーバを処理できるドロップ・ハンドラが複数ある場合、コンテキスト・メニューに使用可能なドロップ・ハンドラが表示されます。リソースは、ユーザーがコンテキスト・メニューからJavaドロップ・ハンドラを選択したときにページにドロップされます。

複数のJavaドロップ・ハンドラを持つリソースの例は、カタログでドキュメント・サービスを構成した場合のDocumentsフォルダ内で使用可能なPersonal Documentsサブフォルダです。このサブフォルダは、Content Presenter、Document List ViewerまたはDocument Libraryとして追加できます。


注意:

リリース11.1.1.1で追加操作を処理するために使用されるAdditionListenerメカニズムはまだ使用可能ですが、現在コンポーザはまずドロップ・ハンドラをコールし、カタログで追加操作を処理します。既存のAdditionListenersをドロップ・ハンドラに変換することをお薦めします。


この項では、ドロップ・ハンドラを作成し、これをアプリケーションに登録する手順を説明します。次のサブセクションが含まれます:

19.7.1 ドロップ・ハンドラの作成および登録の方法

この項では、リソース・カタログからXMLコンテンツを追加するサンプルのドロップ・ハンドラを作成し、コンポーザを使用してこのドロップ・ハンドラを登録する方法を説明します。次のサブセクションが含まれます:

19.7.1.1 ドロップ・ハンドラの作成

コンポーザを使用してドロップ・ハンドラを作成するには、まず抽象ベース・クラス(DropHandler)を拡張し、getName()getAcceptableFlavors()およびhandleDrop()の各メソッドを実装する必要があります。この項では、TestというXMLコンポーネントをリソース・カタログに追加し、XMLコンテンツを追加するためのCustom XMLというドロップ・ハンドラを作成する例を説明します。

ドロップ・ハンドラを作成するには:

  1. JDeveloperで、Portalプロジェクトを選択し、「ファイル」メニューから「新規」を選択します。

  2. 「新規ギャラリ」ダイアログで、「一般」を開き、「Java」「Javaクラス」の順に選択して、「OK」をクリックします。

  3. 「Javaクラスの作成」ダイアログで、クラスの名前(TestDropHandlerなど)を指定します。

  4. 「拡張」フィールドで、入力または参照してDrophandlerクラス(oracle.adf.view.page.editor.drophandler.DropHandler)を選択します。


    注意:

    oracle.adf.view.page.editorクラスパスを表示できない場合、コンポーザがプロジェクトのライブラリとクラスパスに含まれていることを確認してください。これを実行するには、アプリケーション・ナビゲータでプロジェクトを右クリックして「プロジェクト・プロパティ」を選択します。「プロジェクト・プロパティ」ダイアログで、「ライブラリとクラスパス」を選択し、「コンポーザ」をリストに追加します。


  5. 必要なインポート文を追加して「OK」をクリックします。

    Javaクラスのソースは次のようになります。

    package test;
    
    import java.awt.datatransfer.DataFlavor;
    import java.awt.datatransfer.Transferable;
    
    import java.io.ByteArrayInputStream;
    
    import javax.faces.component.UIComponent;
    import javax.faces.context.FacesContext;
    
    import javax.xml.parsers.DocumentBuilder;
    import javax.xml.parsers.DocumentBuilderFactory;
    
    import oracle.adf.rc.component.XmlComponentFactory;
    import oracle.adf.view.page.editor.drophandler.DropEvent;
    import oracle.adf.view.page.editor.drophandler.DropHandler;
    
    import org.apache.myfaces.trinidad.change.AddChildDocumentChange;
    import org.apache.myfaces.trinidad.change.ChangeManager;
    import org.apache.myfaces.trinidad.change.DocumentChange;
    import org.apache.myfaces.trinidad.context.RequestContext;
    
    import org.w3c.dom.Document;
    import org.w3c.dom.DocumentFragment;
    
    public class TestDropHandler extends DropHandler {
        public TestDropHandler() {
            super();
        }
    
        public String getName() {
            return null;
        }
    
        public DataFlavor[] getAcceptableFlavors() {
            return new DataFlavor[0];
        }
    
        public boolean handleDrop(DropEvent dropEvent) {
            return false;
        }
    }
    
  6. getName()メソッドを次のように実装し、ドロップ・ハンドラの名前を返します。

    public class TestDrophandler extends DropHandler {
        public TestDrophandler() {
            super();
        }
    
        public String getName() {
            return "Custom XML";
        }
    . . . 
    

    この値(Custom XML)は、リソース・カタログのXMLコンポーネントの隣の「追加」リンクのコンテキスト・メニューに表示されます。

  7. getAcceptableFlavors()メソッドを次のように実装し、XMLコンポーネントでサポートされるデータ・フレーバのリストを取得します。

    public class TestDropHandler extends DropHandler
    {
      private static final DataFlavor[] ACCEPTABLE_FLAVORS =
      { XmlComponentFactory.XML_STRING_FLAVOR };
    
        . . . 
        
        public DataFlavor[] getAcceptableFlavors() {
        return ACCEPTABLE_FLAVORS;
        }
        . . .
    
  8. 次のサンプル・ファイルに示すようにhandleDrop(DropEvent)メソッドを実装し、ドロップ・ハンドラを処理し、XMLコンポーネントをページに追加します。

    public class TestDropHandler extends DropHandler
    {
      . . . 
    
      public boolean handleDrop(DropEvent de) {
        Transferable transferable = de.getTransferable();
        UIComponent container = de.getContainer();
        int index = de.getDropIndex();
     
        try {
            FacesContext context = FacesContext.getCurrentInstance();
            RequestContext rctx = RequestContext.getCurrentInstance();
     
            String fragMarkup = null;
     
            // Get the TransferData from the Transferable (expecting a String)
            Object data = getTransferData(transferable);
            if (data instanceof String) {
              fragMarkup = "<?xml version='1.0' encoding='UTF-8'?>" + (String)data;
            } else {
                return false;
            }
     
            // Get a DocumentBuilder
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            factory.setNamespaceAware(true);
            factory.setValidating(false);
            DocumentBuilder builder = factory.newDocumentBuilder();
     
            // Parse the xml string into a Document object using DocumentBuilder
            byte[] markupBytes = fragMarkup.getBytes();
            Document newDoc =
            builder.parse(new ByteArrayInputStream(markupBytes));
     
            // Transform the Document into a DocumentFragment
            DocumentFragment docFrag = newDoc.createDocumentFragment();
            docFrag.appendChild(newDoc.getDocumentElement());
     
            // Create an "add child" document change, that is, insert the fragment
            DocumentChange change = null;
            if (index < container.getChildCount()) {
            // Get the ID of the component we'll be adding just before
               String insertBeforeId = container.getChildren().get(index).getId();
               change = new AddChildDocumentChange(insertBeforeId, docFrag);
            } else {
                change = new AddChildDocumentChange(docFrag);
            }
     
            // Apply the "add child" DocumentChange using ChangeManager
            ChangeManager changeManager = rctx.getChangeManager();
            changeManager.addDocumentChange(context, container, change);
     
            // Refresh the target container using PPR
            rctx.addPartialTarget(container);
     
            // Mark the drop as completed.
            return true;
            } catch (Exception e) {
                return false;
            }
        }
    

    この例では、DropEventパラメータがhandleDropメソッドに渡されます。このパラメータには、次に説明する3つの属性があります。

    • transferableは、DataFlavorと同様に、追加するデータを含む標準Javaクラスです。

    • containerは、コンポーネントのドロップ先であるコンテナです。

    • indexは、コンテナ内のコンポーネントの位置です。たとえば、1番目、2番目などです。

  9. TestDropHandler.javaファイルを保存します。

19.7.1.2 コンポーザを使用したドロップ・ハンドラの登録

ドロップ・ハンドラを実装した後、コンポーザを使用してこれを登録する必要があります。登録は、ユーザーがカタログで「追加」リンクをクリックしたときに、ハンドラがコンポーザによってコールされるようにするために必要です。コンポーザ拡張ファイル(/META-INF/pe_ext.xml)でドロップ・ハンドラを登録します。このファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。

ドロップ・ハンドラを登録するには:

  1. pe_ext.xmlファイルで、次のエントリを追加します。

    <drop-handlers>
      <drop-handler>test.TestDropHandler</drop-handler>
    </drop-handlers>
    

    ここで、TestDropHandlerはドロップ・ハンドラの実装の名前です。

  2. ファイルを保存します。

必要数の<drop-handler>要素を追加することによって、拡張ファイルに任意の数のドロップ・ハンドラを登録できます。

19.7.1.3 XMLコンポーネントのリソース・カタログへの追加

XmlComponentFactoryクラスによって生成されたXMLコンポーネントのドロップ・ハンドラを作成したため、XMLコンポーネントをリソース・カタログに追加してからそのコンポーネントを実行時にページに追加することによって、実行時にドロップ・ハンドラがどのように動作するかをテストできます。

XMLコンポーネントをカタログに追加するには:

  1. デフォルトのカタログ定義ファイル(default-catalog.xml)を開きます。

    このファイルの場所については、第14.4項「デフォルト・リソース・カタログの選択」を参照してください。

  2. 次のコードをファイルの<contents>セクション内に追加します。

    <component id="pc" factoryClass="oracle.adf.rc.component.XmlComponentFactory">
      <attributes>
        <attribute attributeId="Title" value="Test"/>
        <attribute attributeId="Description" value="XML content you can add to application pages"/>
        <attribute attributeId="IconURI" value="/adf/pe/images/elementtext_qualifier.png"/>
        </attributes>
        <parameters>
          <parameter id="xml">
            <af:outputText value="Hello!" xmlns:af="http://xmlns.oracle.com/adf/faces/rich"/>
          </parameter>
        </parameters>
    </component>
    
  3. default-catalog.xmlファイルを保存します。

    実行時に、リソース・カタログはXMLコンポーネントを表示します。詳細は、第14.3.5項「リソース・カタログにカスタム・コンポーネントを追加する方法」を参照してください。

19.7.2 実行時の処理

ユーザーがカタログのコンポーネントの「追加」リンクをクリックすると、そのフレーバをサポートしているすべてのドロップ・ハンドラが「追加」リンクのコンテキスト・メニューのオプションとして表示されます。ただし、そのフレーバを処理できるドロップ・ハンドラが1つのみの場合、リソースはすぐにページに追加されます。

図19-13に、Custom XMLオプションおよびデフォルトのXMLオプションを備えたTest XMLコンポーネントの「追加」リンクをクリックしたときに表示されるコンテキスト・メニューを示します。

図19-13 カタログのXMLコンポーネントのドロップ・ハンドラ

図19-13の説明が続きます
「図19-13 カタログのXMLコンポーネントのドロップ・ハンドラ」の説明

19.8 プロパティ・フィルタの定義

一部のコンポーネント・プロパティは、デフォルトでフィルタ処理によって除外されるため、コンポーザの「コンポーネント・プロパティ」ダイアログに表示されません。デフォルトのフィルタは、コンポーザの拡張ファイル(/META-INF/pe_ext.xml)の<filter-config>セクションで定義されています。

グローバル・フィルタは、すべてのコンポーネントの属性をフィルタ処理します。これらは<global-attribute-filter>タグを使用して定義されます。タグ・レベルのフィルタは、指定したコンポーネントの属性のみをフィルタ処理します。これらは<taglib-filter>タグを使用して定義されます。


注意:

拡張ファイルでは、任意の数の<taglib-filter>タグを<filter-config>の下に持つことができますが、すべてのグローバル属性フィルタを定義する<global-attribute-filter>タグは1つのみ持つことができます。


「コンポーネント・プロパティ」ダイアログでさらに多くのプロパティを非表示にするために追加のフィルタを定義できます。この項では方法について説明します。次のサブセクションが含まれます:

19.8.1 プロパティ・フィルタの定義方法

コンポーザは、組込みフィルタ構成を定義します。拡張ファイル(pe_ext.xml)を使用して、追加のプロパティ・フィルタの定義およびフィルタの削除を実行できます。(1つのタグに対してでも)異なる拡張ファイルで任意の数のフィルタを定義できます。コンポーザは、すべての拡張ファイルからのフィルタ処理情報をマージします。


注意:

pe_ext.xmlファイルの作成の詳細は、第19.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。


例外ファイルでプロパティ・フィルタを定義するには、filter-config要素を使用します。次の要素は、含まれているattributeタグに対して定義されます。

  • label要素により、UIの要素に対するデフォルト・ラベルをオーバーライドできます。ELを使用してローカライズされた文字列を取得するか、またはデザイン・ビューまたはソース・ビューで異なるラベルを表示できます。

  • view要素を特定のビュー(designまたはsource)の特定のタグの属性をフィルタするために使用できます。

  • filtered要素は、グローバルにフィルタされる場合にも属性を表示するために使用できます。グローバルにフィルタされた要素をリストアするには、filtered="false"を使用します。

pe_ext.xmlファイルで、次の例に示すようにfilter-config要素を追加します。

<filter-config>
   <global-attribute-filter>
    <attribute name="readOnly" filtered="false" label="Read Only"/>
    <attribute name="required" filtered="false" label="Mandatory"/>
    <attribute name="shortDesc" filtered="false" label="#{Bundle.PNL_TB_SHORTDESC}"/>
  </global-attribute-filter>
 
  <taglib-filter namespace="http://xmlns.oracle.com/adf/faces/rich">
    <tag name="goLink">
      <attribute name="accessKey" view="design"/>
      <attribute name="targetFrame" filtered="false" view="source"/>
      <attribute name="destination" filtered="false" label="#{pageEditorPanelBean.layoutView ?  'Where do you want to surf?' : 'Destination'}"/>
    </tag>
    <tag name="inputText">
      <attribute name="all" view="design"/>
      <attribute name="label" label="Field Name" filtered="false" />
      <attribute name="readOnly" filtered="false" />
      <attribute name="required" filtered="false" />
      <attribute name="rendered" filtered="false" />
      <attribute name="wrap" filtered="false" />
    </tag>
  </taglib-filter>
</filter-config>

ファイルを保存します。

19.8.2 実行時の処理

実行時、コンポーザのプロパティを編集すると、フィルタ処理によって除外されたプロパティは「コンポーネント・プロパティ」ダイアログにレンダリングされません。

19.8.3 プロパティ・フィルタの削除方法

前にフィルタ処理されたプロパティが「コンポーネント・プロパティ」ダイアログにレンダリングされるように、グローバル・フィルタおよびタグレベル・フィルタを削除できます。これは、コンポーザの組込みフィルタやアプリケーションの別の場所で定義された別の拡張ファイルによってフィルタ処理されて除外されたプロパティを表示する際に便利です。


注意:

プロパティ・フィルタを削除した後、フィルタは、別の拡張ファイルでそのプロパティに対して定義されても「コンポーネント・プロパティ」ダイアログにレンダリングされます。


プロパティ・フィルタを削除するには:

  1. META-INFディレクトリにあるコンポーザ拡張ファイル(pe_ext.xml)を編集します。

    このファイルのエントリを編集してプロパティ・フィルタを削除できます。

  2. フィルタの削除元の属性を検索し、次の例に示すように、<attribute>タグでfilteredfalseに設定します。

    <pe-extension xmlns="http://xmlns.oracle.com/adf/pageeditor/extension">
    . . . 
    <filter-config>
      <global-attribute-filter> 
        <attribute name="accessKey" filtered="false" />
        <attribute name="attributeChangeListener" />
        . . . 
      </global-attribute-filter>
      <taglib-filter namespace="http://xmlns.oracle.com/adf/faces/rich">
        <tag name="activeCommandToolbarButton">
          . . . 
          <attribute name="windowWidth" filtered="false"/>
        </tag>
      </taglib-filter>
    </filter-config>
    </pe-extension>
    
  3. ファイルを保存します。

19.9 カスタマイズ・マネージャ・タスク・フローのパラメータ・サポートの有効化

タスク・フローで受け渡すパラメータを有効にする場合、管理者は、特定のパラメータを設定することによってカスタマイズ・マネージャをカスタマイズできます。デフォルトでは、管理者は、コンポーザのカスタマイズ・マネージャ・タスク・フローにパラメータを渡すことはできません。表19-2では、カスタマイズ・マネージャ・タスク・フローでサポートされているパラメータについて説明しています。

表19-2 カスタマイズ・マネージャ・タスク・フローのパラメータ

パラメータ名 説明

defaultPage

ページのURI

管理するデフォルト・ページを指定するために使用します。この値がnullの場合、現在のページが使用されます。

dynamicNodeMap

Map<String,List<CustomizationManagerNode>>

ページ、XMLドキュメントまたは指定されたページあるいはフラグメントのタスク・フローのリストを次の形式を使用して返すために使用されます。

Page1.jspx -> List of {CustomizationManagerTaskFlowNode or CustomizationManagerPageNode or CustomizationManagerXMLNode}

CustomizationManagerTaskFlowNodeを使用して、そのページ内の動的タスク・フローを渡します。

そのページのページ・テンプレートを渡すためにはCustomizationManagerPageNodeを使用します。

このページが所有するXMLドキュメントを渡すためにはCustomizationManagerXMLNodeを使用します。

showBase

true/false

デフォルト: false

ベース・ドキュメントの列を表示または非表示にするために使用します。

showCurrentLayers

true/false

デフォルト: true

現在使用しているレイヤーの詳細を表示する列を表示または非表示にするために使用します。

showAllLayers

true/false

デフォルト: true

現在のレイヤー以外のレイヤーの詳細を表示する列を表示または非表示にするために使用します。

showLayersforCurrent

Map<String,List<String>>

「現在のコンテキスト」列で使用可能である必要があるレイヤーのリストを指定するために使用します。

このパラメータは、レイヤー名およびレイヤー値のリストならびに「現在のコンテキスト」列に表示する必要があるパターンを取ります。詳細は、例19-16を参照してください。

showLayersforAll

Map<String,List<String>>

「すべてのレイヤー」列で使用可能である必要があるレイヤーのリストを指定するために使用します。

このパラメータは、レイヤー名およびレイヤー値のリストならびに「すべてのレイヤー」列に表示する必要があるパターンを取ります。詳細は、例19-16を参照してください。

labelPrefixes

List<String>

「プロモート」ダイアログに表示する必要がある、空白で区切られたラベルの接頭辞のリストを指定するために使用します。指定された接頭辞を使用して作成されたラベルのみが「プロモート」ダイアログに表示されます。

デフォルトでは、すべてのラベルが表示されます。

maxDepth

String

カスタマイズ・マネージャでのタスク・フローの階層の深さを制限するために使用します。

デフォルト値は10です。したがって、循環依存性を持つタスク・フローがある場合、このパラメータは、深さを10のネストされたタスク・フローに制限することによって、スタック・オーバーフローを防ぎます。

最大ネストの10タスク・フローを表示できます。カスタマイズ・マネージャは、10より大きい値を指定しても、深さ10しか表示しません。

showDownload

true/false

デフォルト: true

「ダウンロード」リンクを表示または非表示にするために使用します。

showUpload

true/false

デフォルト: true

「アップロード」リンクを表示または非表示にするために使用します。

showDelete

true/false

デフォルト: true

「削除」リンクを表示または非表示にするために使用します。

showPromote

true/false

デフォルト: true

「プロモート」リンクを表示または非表示にするために使用します。



注意:

MapおよびListの実装は、クラスタベースの環境で正しく動作するようにカスタマイズ・マネージャに対して連続化可能である必要があります。通常、ArrayListおよびHashMap連続化可能です。


この項では、カスタマイズ・マネージャ・タスク・フローでパラメータの編集を可能にする手順を説明します。次のサブセクションが含まれます:

19.9.1 カスタマイズ・マネージャ・タスク・フローのパラメータを設定する方法

カスタマイズ・マネージャ・タスク・フローにパラメータを渡すには、アプリケーションのadf-config.xmlファイルのカスタマイズ・マネージャのアドオン・パネル構成の一部としてparameters属性を定義する必要があります。

タスク・フローでパラメータ編集を有効にするには:

  1. アプリケーションのadf-config.xmlファイルを開きます。これは、「アプリケーション・リソース」パネルの「ディスクリプタ」の下のADF META-INFフォルダにあります。

  2. ファイルで次のネームスペースをadf-config要素内に追加します。

    xmlns:pe="http://xmlns.oracle.com/adf/pageeditor/config"
    
  3. ネームスペースを付けて<pe:page-editor-config>エントリを追加し、<pe:addon-panels>を含めます。

    <pe:addon-panels>内で、例19-16に示すように、デフォルトのカスタマイズ・マネージャ・パネルの<pe:addon-panel>エントリを追加し、parameters属性をappUtilBean.customizationManagerParamsに設定することによって定義します。

    例19-16 adf-config.xmlで参照されるカスタマイズ・マネージャのアドオン

    <pe:page-editor-config xmlns="http://xmlns.oracle.com/adf/pageeditor/config">
      <pe:addon-panels>
        <pe:addon-panel name="oracle.adf.pageeditor.addonpanels.customization-manager" parameters="#{AppUtilBean.customizationManagerParams}"/>
        . . .
      </pe:addon-panels>
    </pe:page-editor-config>
    

    ここで、AppUtilBeanは、AppUtilBeanクラスのサンプル実装で、これを次の例に示します。

    public Map<String, Object> getCustomizationManagerParams()
    {
      Map<String, Object> paramMap = new HashMap<String, Object>();
      Map<String, List<String>> showLayersForCurrent = new HashMap<String, List<String>>();
      showLayersForCurrent.put("user", Arrays.asList("admin%", "weblogic"));
      paramMap.put("showLayersForCurrent", showLayersForCurrent);
     
      Map<String, List<String>> showLayersForAll = new HashMap<String, List<String>>();
      showLayersForAll.put("enterprise", Arrays.asList("Frys"));
      paramMap.put("showLayersForAll", showLayersForAll);
     
      return paramMap;
    }
    
  4. adf-config.xmlファイルを保存します。

19.9.2 パラメータのサポートを有効にした場合の処理

カスタマイズ・マネージャは、新しいパラメータ設定の基づいてユーザーにオプションを表示します。

19.10 コンポーザのツールバーのカスタマイズ

要素を追加、削除または再配置し、既存の要素をオーバーライドすることによってデフォルトのコンポーザのツールバーをカスタマイズできます。ツールバーの拡張性を有効にするために、コンポーザのツールバーの要素がセクションにグループ化されています。これらのセクションを使用してツールバーをカスタマイズできます。それぞれのセクションには固有の名前が付いており、1つ以上の要素が中に含まれています。


注意:

「保存」ボタンがツールバーに表示されるのは、アプリケーションがサンドボックスを使用するように構成されている場合のみです。詳細は、第21.2項「コンポーザのサンドボックスの使用」を参照してください。

「ヘルプ」アイコンがツールバーに表示されるのは、アプリケーションでヘルプ・プロバイダを構成した場合またはコンポーザ・パネルまたはダイアログからヘルプをフックアップした場合のみです。

コンポーザのツールバーは、ADF Faces Toolboxタグを使用して作成されます。ツールバーの各行はToolbarタグです。したがって、セパレータ・バーなどのUIコンポーネントはToolbarコンポーネントから継承されます。


表19-3ではツールバーの領域を説明します。

表19-3 ツールバーの領域

セクションまたは領域 説明

message

ページ名付きのメッセージを含む領域。

statusindicator

ステータス・インジケータを含む領域。

menu

ユーザーが「デザイン」ビューと「構造」ビューを切り替えることができる「表示」メニューを含む領域。

addonpanels

コンポーザのアドオンを含む領域。アドオンは、この領域内ですべて順次表示されます。詳細は、第19.2項「コンポーザのアドオンの作成」を参照してください。

help

「ヘルプ」アイコンを含む領域。

button

「保存」ボタンおよび「閉じる」ボタンを含む領域。

stretch

2つのセクション間の広い空間。

newline

セクション間の改行。改行の後のすべてのセクションは、ツールバーで新しい行になります。


ツールバー・セクションを使用して、次の方法でコンポーザのツールバーをカスタマイズできます。

この項では、コンポーザのツールバーをカスタマイズする手順を説明します。次の項が含まれます:

19.10.1 ツールバー要素を再配置または非表示にする方法

Page CustomizableコンポーネントのtoolbarLayout属性を使用して、表示するツールバーのセクションおよびその表示順を制御します。

アプリケーションのすべての編集可能ページのツールバーをカスタマイズするために、テンプレートを作成し、Page Customizableコンポーネントをテンプレートに追加し、toolbarLayout属性をPage Customizableコンポーネントに対して指定できます。その後、このテンプレートに基づいてアプリケーションのすべてのページをカスタマイズできます。

toolbarLayoutの値を指定しないと、この属性は、コンポーザのツールバーのセクションのデフォルト・レイアウトであるmessage addonpanels stretch button helpに内部的に設定されます。

アプリケーション・ページのツールバーをカスタマイズするには:

  1. JDeveloperのカスタマイズ可能なJSPXページを開き、「構造」ウィンドウでPage Customizableコンポーネントを選択します。

  2. プロパティ・インスペクタで、Appearanceの下のtoolbarLayout属性に空白区切り値を指定します。

    表19-3のセクション名は、この属性の有効値です。


    注意:

    ツールバーで1行ごとに1つのstretch値のみを追加できます。複数のstretch値を追加すると、最初の1つのみが表示され、その他はすべて無視されます。


    「ソース」ビューで、toolbarLayout属性は次の例に示すように表示されます。

    <pe:pageCustomizable id="pageCustomizable1"
                         toolbarLayout="button stretch statusindicator menu"
      <cust:panelCustomizable id="panelCustomizable1" layout="scroll"/>
      <f:facet name="editor">
        <pe:pageEditorPanel id="pep1"/>
      </f:facet>
    </pe:pageCustomizable>
    
  3. JSPXファイルを保存します。

19.10.2 実行時の処理

実行時ツールバーには、指定したセクションが指定した順序で表示されます(図19-14)。

図19-14 カスタマイズしたコンポーザのツールバー

図19-14の説明が続きます
「図19-14 カスタマイズしたコンポーザのツールバー」の説明

19.10.3 新しいセクションをツールバーに追加する方法

toolbarLayout属性でファセットを作成し、ファセット名を指定することによって、カスタム・セクションを追加できます。新しいファセットにツールバーに表示する要素を移入します。次の例は、セクションの作成方法、具体的には、ユーザーが不具合をレポートできるポップアップを開く「バグをレポート」アイコンを追加する方法を説明します。

カスタム・セクションを追加するには:

  1. ツールバーをカスタマイズするJPSXページを開きます。

  2. ファセットPage Customizable内に追加し、これにbugreportという名前を付けます。

  3. Command Toolbar Buttonコンポーネントをファセット内に追加し、text属性をReport a Bugに設定します。

  4. アイコンにイメージを追加するには、icon属性を使用してイメージへのパスを指定します。

  5. Show Popup Behaviorコンポーネントを追加し、Command Toolbar Buttonをクリックしたときにポップアップを起動します。

    「ソース」ビューで、Page Customizableは次のように表示されます。

    <pe:pageCustomizable id="pageCustomizable1"
                 toolbarLayout="message stretch bugrep newline menu stretch button"
      <f:facet name="bugrep">
        <af:commandToolbarButton id="cmd1" text="Report a bug"
                                 icon="/images/bug.png" 
                                 clientComponent="true">
          <af:showPopupBehavior popupId="p1" triggerType="action"/>
        </af:commandToolbarButton>
      </f:facet>
    . . . 
      <af:popup id="p1">
        <af:dialog id="dlg1" title="File a Bug"
                   affirmativeTextAndAccessKey="File">
          <af:panelFormLayout labelWidth="30%" id="pfl1">
            <af:inputText id="it0" maximumLength="80"
                          label="Product/Component" required="true"/>
            <af:inputText id="it1" maximumLength="80" label="Subject"
                          required="true"/>
            <af:inputText id="it2" rows="3" label="Problem" required="true"/>
            <af:inputText id="it3" rows="3" label="Steps" required="true"/>
          </af:panelFormLayout>
        </af:dialog>
      </af:popup>
      . . . 
    </pe:pageCustomizable>
    
  6. ページを保存します。

    実行時に、コンポーザ・ツールバーに「バグをレポート」アイコンが表示されます。このアイコンをクリックすると、バグ提出ダイアログが表示され、ユーザーはこれを使用して不具合を報告できます。

19.10.4 ツールバーのセクションをオーバーライドしてカスタム・コンテンツを表示する方法

デフォルトのツールバーのセクションと同じ名前のファセットを追加し、これにカスタム・コンテンツを移入することによって、デフォルトのツールバーのセクションにカスタム・コンテンツを表示できます。ファセットのコンテンツは、デフォルトのセクションのコンテンツをオーバーライドします。たとえば、ユーザーへのカスタム・メッセージをEditing Page: Page_Nameメッセージの場所に表示するために、messageというカスタム・ファセットを作成し、ユーザーに表示するテキストを含むOutput Textコンポーネントを含めることができます。Output Textコンポーネントは、デフォルトのメッセージの場所に表示されます。次の例は、カスタム・ツールバー・メッセージを含むPage Customizableコンポーネントを示しています。

<pe:pageCustomizable id="pageCustomizable1"
                     toolbarLayout="message newline button stretch statusindicator menu"
  <cust:panelCustomizable id="panelCustomizable1" layout="scroll"/>
  <f:facet name="message">
    <af:outputText value="Welcome!"/>
  </f:facet>
  <f:facet name="editor">
    <pe:pageEditorPanel id="pep1"/>
  </f:facet>
</pe:pageCustomizable>

19.11 「デザイン」ビューまたは「コンテンツの追加」ビューでの直接選択の有効化

直接選択により、ユーザーはコンポーザの「構造」ビューから「デザイン」ビューまたは「コンテンツの追加」ビューまで特定のカスタマイズ機能を拡張し、実行時にページ内から要素を変更できます。これにより、基礎となるアプリケーションにダメージを及ぼさないような安全な環境を作りながら、ビジネス・ユーザーの手でより多く制御することができます。

すべての直接選択機能は、「構造」ビューで使用できますが、ビジネス・ユーザーには「構造」ビューを安全かつ効率的に使用する知識や経験がありません。これらのユーザーは簡単にページを壊して、アプリケーション・ロジックを回避することができます。

直接選択を使用して、少数の選択したコンポーネントを選択可能および編集可能にすることができます。たとえば、フォーム内のフィールドの順序の変更、フォーム・フィールドのラベルの変更、表内の列名の変更またはフォームの特定のフィールドの非表示など。

直接選択機能の詳細は、第19.11.2項「実行時の処理」を参照してください。

19.11.1 直接選択を有効化および構成する方法

この項では、アプリケーションで直接選択を有効化および構成する方法について説明します。

  1. まず、「選択」ビューを有効にする必要があります。adf-config.xml<pe:page-editor-config>タグの内側に、<pe:enable-design-views>タグを追加して使用可能なビューを定義します。使用可能な定数値は次のとおりです。

    • all: すべてのビューを使用可能にして、ビュー間を切り替えるタブを含むツールバーを表示します。

    • design: 「デザイン」ビューを唯一の使用可能なビューにします。

    • add-content: 従来の「コンテンツの追加」ビューを唯一の使用可能なビューにします。

    • select: 「選択」ビューを唯一の使用可能なビューにします。

    • source: 「構造」ビューを唯一の使用可能なビューにします。

    • preview: 「プレビュー」を唯一の使用可能なビューにします。

    たとえば、「選択」ビューと「コンテンツの追加」ビューのみを使用する場合は、次のタグを追加できます。

    <pe:enable-design-views> select add content</pe:enable-design-views>
    

    下の例に示すように、ELを使用して適切なビューを決定することもできます。

    <pe:enable-design-views>#{testBean.designViews}</pe:enable-design-views>
    

    注意:

    この設定は、アプリケーションのデフォルトを定義します。designViews=""属性を使用してpageCustomizableタグでこの設定をオーバーライドできます。


  2. pe-ext.xmlで、特定のコンポーネントの直接選択を有効化または無効化するために<selection-config>タグを追加し、関連付けられた操作を定義します。コンポーネントを選択可能にするためには、このタグ内で操作を定義する必要があります。(操作が定義されておらず、選択がコンポーネントに対して有効になっていない場合、コンポーネントを選択すると空のフレームが表示されます。)

    <selection-config>タグ内で、<global-filter>を使用して、また<selection-taglib-filter>を使用してネームスペースおよびタグによって、直接選択をグローバルに構成できます。<selection>タグには2つの必須属性があります。

    • view: 直接選択を有効にするビューを定義します。

    • enabled: 直接選択が指定されたビューで有効化されるかどうかを設定します。

    利用可能な操作は、各特定コンポーネントの下の<operation>タグ内で定義されています。次の要素は、操作の定義に使用されます。

    • name: 実行される操作(標準またはカスタム)を定義します。操作名はプロパティ・パネルIDと同じです。標準操作のリストは、第B.3.2「デフォルトのプロパティ・パネルの項」を参照してください。カスタム操作の場合、名前はカスタム・パネルIDと同じです。カスタム操作の詳細は、第19.3項「カスタム・プロパティ・パネルの作成」を参照してください。

    • label(オプション): ポップアップ・ウィンドウにタブ・ラベルを設定します。デフォルト・ラベルは操作名です。

    • filtered: ポップアップ・ウィンドウの操作を含むようにfalseに設定します。


    注意:

    最初に、少数のコンポーネントを選択し、次に機能がテストされ習得されるようにさらにコンポーネントを追加することをお薦めします。これは次の例に示すように、<global-filter>タグの選択をグローバルに無効にしてから、<selection-taglib-filter>を使用して個々のコンポーネントの選択を有効にすることによって、簡単に実行できます。


    <selection-config>
      <global-filter>
        <selection view="design" enabled="false"/>
      </global-filter>
     
      <selection-taglib-filter 
    namespace="http://xmlns.oracle.com/adf/faces/customizable"> <tag name="showDetailFrame"> <selection view="design" enabled="true"/> <operation name="oracle.adf.pageeditor.pane.sdfprop" label="SDF Change Property" filtered="false"/> </tag> </selection-taglib-filter> <selection-taglib-filter namespace="http://xmlns.oracle.com/adf/faces/rich"> <tag name="goLink"> <selection view="design" enabled="true"/> <operation name="oracle.adf.pageeditor.pane.generic-property-inspector" label="Change Property" filtered="false"/> <operation name="oracle.adf.pageeditor.pane.inline-style-editor" label="Inline Style" filtered="false"/> </tag> <tag name="commandButton"> <selection view="design" enabled="true"/> <operation name="oracle.adf.pageeditor.pane.generic-property-inspector" label="Change Property" filtered="false"/> </tag> </selection-taglib-filter> </selection-config>

    さらにユーザー経験を簡単にするため、直接選択によりユーザーは、よリ少数のセットが表示されるようにタグの特定の属性をフィルタできます。詳細は、第19.8.1項「プロパティ・フィルタの定義方法」を参照してください。

  3. .jspxページ内の特定のコンポーネントの直接選択を有効化または無効化するには、次の例に示すように、コンポーネント・タグ内に<f:attribute name="pe-select" value="true|false">タグを追加します。このタグの設定は、pe_ext.xmlファイルのコンポーネントの<selection-config>の設定をオーバーライドします。(前述のように、直接選択を有効にするには、pe_ext.xmlファイルのコンポーネントに対する操作を定義する必要があります。定義しない場合、これを選択すると空のダイアログが開きます。)

    <af:panelGroupLayout id="pgl2" layout="vertical">
    <f:attribute name="pe-select" value="false"/>
      <af:inputText id="it6" label="Unselectable" value="Enter here..."/>
      <af:goLink id="gl1" destination="http://www.oracle.com" text="Oracle"/>
      <af:inputText id="it7" label="Selectable(override)" value="Enter here...">
        <f:attribute name="pe-select" value="true"/>
      </af:inputText>
    </af:panelGroupLayout>
    
  4. フォーム・フィールドで式言語の使用を拒否して既存のELが上書きされないようにするには、第19.4.2項「式言語を保護する方法」を参照してください。

特定の要素の詳細は、付録B「コンポーザ・コンポーネントのプロパティおよびファイル」を参照してください。

19.11.2 実行時の処理

直接選択が有効になっている場合、実行時のページの外部に対する表示は、エンド・ユーザーに対する表示と同じです(図19-15)。

図19-15 「選択」ビュー

図19-15の説明が続きます
「図19-15 「選択」ビュー」の説明

コンポーネントのプロパティを編集するには、ユーザーは有効な要素を選択し、「コンポーネントの編集」または「親コンポーネントの編集」(適用可能な場合)をクリックできます(図19-16)。

図19-16 要素の直接選択の有効化

図19-16の説明が続きます
「図19-16 要素の直接選択の有効化」の説明

「コンポーネント・プロパティ」ダイアログにより、ユーザーはコンポーネントに対して定義されたプロパティを編集し、コンポーネントに対して構成された他の操作にアクセスできます。ユーザーが「親コンポーネントの編集」を選択した場合、「子の管理」タブがダイアログに含まれています。ELが上書きが許可されないか、上書きから保護されない場合、図19-17で示すように、「式ビルダー」および「オーバーライド」オプションが使用できません。このイメージには編集から保護されるフィールドの例も含まれています(「コンポーネントの表示」)。

図19-17 「コンポーネント・プロパティ」ダイアログ

図19-17の説明が続きます
「図19-17 「コンポーネント・プロパティ」ダイアログ」の説明

複数の操作がダイアログのタブに表示されます。タブの順序はパネル登録で定義されています。操作が囲んでいるコンポーネントに対して登録されていない場合、その操作のタブは表示されません。パネル登録の詳細は、第19.3項「カスタム・プロパティ・パネルの作成」を参照してください。

19.12 コンポーザの拡張性機能の問題のトラブルシューティング

この項では、コンポーザの拡張性機能を使用中に発生する可能性のある問題のトラブルシューティングに役立つ情報を提供します。

ロギングの構成の詳細は、第18章「コンポーザを使用したページの実行時編集の有効化」を参照してください。

問題

アドオンを作成したが、コンポーザのツールバーに表示されません。

解決方法

次の点を確認してください。

アドオンの詳細は、第19.2項「コンポーザのアドオンの作成」を参照してください。

問題

カスタム・プロパティ・パネルを登録しました。ただし、プロパティを表示するコンポーネントを選択する際に、このパネルが「コンポーネント・プロパティ」ダイアログに表示されません。

解決方法

次の点を確認してください。

カスタム・プロパティ・パネルの詳細は、第19.3項「カスタム・プロパティ・パネルの作成」を参照してください。

問題

「コンポーネント・プロパティ」ダイアログでコンポーネントの一部のプロパティが表示されません。

解決方法

コンポーネント・プロパティがフィルタ処理されていないことおよび制限されていないことを確認します。詳細は、第19.8.1項「プロパティ・フィルタの定義方法」および第22.4項「属性レベルのセキュリティの適用」を参照してください。