Oracle® Fusion Middleware Oracle WebCenter Portal開発者ガイド 11g リリース1 (11.1.1.7.0) B72084-02 |
|
前 |
次 |
この章では、コンポーザの宣言的でプログラム可能な拡張性メカニズムを使用して、ビジネス・ニーズに合うように実行時機能をカスタマイズする方法について説明します。次の項が含まれます:
コンポーザは、カスタマイズ可能なアプリケーション・ページを構築するフレームワークを提供します。デフォルトの機能に加えて、コンポーザのフレームワークを拡張し、エンド・ユーザーが使用できる実行時機能を拡張できます。アプリケーションのadf-config.xml
ファイルおよびコンポーザの拡張ファイルpe_ext.xml
で拡張機能を構成する必要があります。これらのファイルの詳細は、第20.1.8項「構成ファイル」を参照してください。
この項では、コンポーザの実行時機能を宣言的に拡張するために使用できるオプションについて説明します。次のサブセクションが含まれます:
コンポーザのツールバーのデフォルト・ビュー(図20-1)には次のボタンが含まれます。
表示: ユーザーが「設計」ビューと「ソース」ビューを切り替えることができます。
ページ・プロパティ: 「ページ・プロパティ」ダイアログを開き、ユーザーがホスト・ページのメタデータを編集できるようにします。
ページのリセット: 現在の編集セッションでページに行った変更を元に戻します。
閉じる: 「デザイン」ビューを終了し、標準UIにユーザーを戻します。
「ページ・プロパティ」および「ページのリセット」ボタンはアドオンの例です。これらのボタンをクリックして、ページ・プロパティの編集およびページ・カスタマイズのリセットを行うためのパネルを表示します。通常、アドオンは、ページ編集モードのコンポーザのツールバーのボタンとしてレンダリングされるカスタム・タスク・フローです。「ページ・プロパティ」アドオンと「ページのリセット」アドオンとともに表示されるアドオンを作成できます。たとえば、コンポーザのツールバーに「リビジョン」ボタンが表示されるように、ページ・リビジョン履歴を表示するアドオンを作成できます。このボタンをクリックするとページの「リビジョン履歴」が表示されます。「ページ・プロパティ」アドオンと「ページのリセット」アドオンを、作成するカスタム・アドオンと置き換えることもできます。
カスタムのアドオンを構成するプロセスには、タスク・フローの作成、これらのJARファイルへのパッケージ化およびこれらのコンポーザ拡張ファイルでの定義が含まれます。詳細は、第20.2項「コンポーザのアドオンの作成」を参照してください。
「コンポーネント・プロパティ」ダイアログには、様々なタブに属性のカテゴリが表示されます。各タブは、プロパティ・パネルと呼ばれます。コンポーザのデフォルトの「コンポーネント・プロパティ」ダイアログは、Oracle JDeveloperのプロパティ・インスペクタに似ています。コンポーネントのカスタム・プロパティ・パネルを作成して登録し、これらにコンポーネント・プロパティを移入し、「コンポーネント・プロパティ」ダイアログのデフォルトのタブとともにこれらをタブとして表示できます。
カスタム・プロパティ・パネルを構成するプロセスには、タスク・フローとしてのこれらの作成、これらのJARファイルへのパッケージ化およびこれらのコンポーザ拡張ファイルでの定義が含まれます。詳細は、第20.3項「カスタム・プロパティ・パネルの作成」を参照してください。
コンポーザには、実行時にページを編集するための直感的なユーザー・インタフェースが用意されています。これには、「保存」ボタン、「閉じる」ボタン、「削除」ボタンなどのUIコンポーネントが含まれます。ユーザーがコンポーザでボタンやアイコンをクリックすると、イベント・ハンドラで確実に特定のアクションが実行されます。イベント・ハンドラは、コンポーザのイベントが起動されると、コンポーザによってコールされて戻されるコードです。コンポーザの各UIイベントはイベント・ハンドラと関連付けられています。イベントの起動時に異なる処理または複数の処理を実行して、コンポーザの本来の機能を拡張する必要がある場合があります。たとえば、ユーザーが「保存」をクリックしたとき、デフォルトでコンポーネントに用意されている保存動作に加えて、キャッシュした情報のクリーニングやリソースへの接続などの追加のタスクを実行するようにアプリケーションを構成する必要がある場合があります。イベント・ハンドラを使用してこれを実現できます。詳細は、第20.6項「コンポーザUIイベントのイベント・ハンドラの構成」を参照してください。
リソース・カタログは、ユーザーがページに追加できるリソースを提供します。リソース名の隣の「追加」リンクで、ユーザーはリソースをページに追加できます。コンポーザは、ドロップ・ハンドラを提供し、カタログで追加操作を処理します。デフォルトでは、ドロップ・ハンドラはカタログの各リソースに対して構成されています。リソースへのドロップ処理の完全な制御を提供する場合、そのリソースに追加のドロップ・ハンドラを作成できます。そうすると、「追加」リンクは、リソースをページに追加するための様々なオプションを備えたコンテキスト・メニューを表示します。1つ以上のドロップ・ハンドラを作成し、カタログでリソースの様々なフレーバを処理できます。
次のタイプのドロップ・ハンドラを追加できます。
コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるJavaクラス。この場合、リソースは選択したデータ・フレーバに基づくページに追加されます。
コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるタスク・フロー。この場合、リソースのどの情報をページに表示する必要があるかをユーザーが決定できるタスク・フローが起動されます。
詳細は、第20.7項「リソース・カタログのドロップ・ハンドラの構成」を参照してください。
「コンポーネント・プロパティ」ダイアログは、選択したコンポーネントのプロパティを表示します。デフォルトでは、コンポーザは特定のコンポーネント・プロパティをフィルタ処理し、プロパティのサブセットをユーザーに表示します。フィルタを宣言的に定義して、ユーザーに表示する必要がないプロパティをさらに非表示にしたり、非表示のプロパティを表示したりできます。詳細は、第20.8項「プロパティ・フィルタの定義」を参照してください。
カスタマイズ・マネージャは、ページやタスク・フローなどのオブジェクトに関するアプリケーションのカスタマイズをユーザーがダウンロード、アップロード、リセットおよび削除できるタスク・フローです。コンポーザ内またはコンポーザ外のある管理ページ上でカスタマイズ・マネージャを構成できます。カスタマイズ・マネージャの構成および使用の詳細は、第20.9項「カスタマイズ・マネージャ・タスク・フローのパラメータ・サポートの有効化」を参照してください。
デフォルトのコンポーザのツールバーは、要素を2行に表示します。図20-2に示すように、最初の行にはページ名とステータス・インジケータが表示され、2番目の行には「表示」メニュー、「ページ・プロパティ」ボタン、「ページのリセット」ボタンおよび「閉じる」ボタンが表示されます。
要素を追加、削除または再配置してツールバーをカスタマイズできます。既存の要素をカスタム要素で上書きすることも可能です。たとえば、編集しているページの名前をユーザーに表示しない場合、ページ名を表示するメッセージを削除できます。
コンポーザのツールバーのカスタマイズの詳細は、第20.10項「コンポーザのツールバーのカスタマイズ」を参照してください。
この章で説明する拡張性構成を開始する前に、理解する必要がある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」を参照してください。
コンポーザには、実行時編集のために次のデフォルトのアドオンが用意されています。
ページ・プロパティ
このダイアログは、ユーザーがコンポーザのツールバーの「ページ・プロパティ」ボタンをクリックすると開きます。「ページ・プロパティ」ダイアログは、現在のページのプロパティを表示し、ユーザーはプロパティ値を変更できます。
ページのリセット
「ページのリセット」ダイアログは、ユーザーがコンポーザのツールバーの「ページのリセット」ボタンをクリックすると開きます。「ページのリセット」ダイアログでは、ユーザーはページに対して作成されたアプリケーションのカスタマイズを削除し、これを以前に保存したバージョンまたは元のデフォルトの状態にリセットできます。詳細は、第17.4.11項「ページのリセット」を参照してください。
これらに加えて、コンポーザで新規アドオンを登録できます。たとえば、コンポーザのツールバーに「リビジョン」ボタンが表示されるように、ページ・リビジョン履歴を表示するアドオンを作成できます。このボタンをクリックするとページの「リビジョン履歴」が表示されます。
この項の内容は、次のとおりです。
コンポーザのツールバーにあるボタンから起動できるカスタム・タスク・フローを作成および登録できます。登録されたすべてのアドオンに、ツールバーに表示される関連ボタンがあります。
この項では、アドオンを作成し、これをコンポーザを使用して登録する手順を順を追って説明します。ここには、アプリケーションに関する情報を表示するアドオンの作成方法を示す例が含まれています。例のアドオンは、ユーザーがクリックしてアプリケーションの情報を含むタスク・フローを起動できるコンポーザのツールバーの「情報」ボタン(図20-3)をレンダリングします。
この項には次のサブセクションが含まれます:
コンポーザのアドオンは、JSPXページまたはページ・フラグメントを使用して作成するタスク・フローです。
アドオンを作成するには:
アプリケーション・プロジェクトで、custompanelview.jsff
というJSFFファイルを作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」を選択してから「JSFページ」またはJSFフラグメントを選択します。
「OK」をクリックします。
例20-1で表示される内容に類似したコードを追加することによって、フラグメントをデザインします。
例20-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>
注意: 実行時、アドオン・パネルは、このフラグメントのコンテンツに合うように自動的にサイズ設定されます。 |
custom-panel-task-flow
というタスク・フロー定義を作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」、「ADFタスク・フロー」の順に選択します。
「OK」をクリックします。
タスク・フロー定義に作成したcustompanelview.jsff
フラグメントをドロップします。
関連項目: タスク・フロー作成の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFタスク・フローの概説に関する項を参照してください。 |
タスク・フロー定義ファイルを保存します。
(オプション)1つのアプリケーションでタスク・フローを作成し、これを別のアプリケーションで使用する場合、まずADFライブラリでこのタスク・フローをパッケージ化し、使用するアプリケーションに結果として得られるJARを追加する必要があります。
ADFライブラリでタスク・フローをパッケージ化するには:
タスク・フローのデプロイメント・プロファイルを作成します。
「ポータル」プロジェクトを右クリックし、「新規」を選択します。
「新規ギャラリ」で、「一般」を開き、「デプロイメント・プロファイル」、「ADFライブラリのJARファイル」の順に選択して「OK」をクリックします。
「デプロイメント・プロファイルの作成 -- ADFライブラリJARファイル」ダイアログで、デプロイメント・プロファイルの名前を入力して「OK」をクリックします。
「ADFライブラリJARデプロイメント・プロファイルのプロパティ」ダイアログで「OK」をクリックします。
「プロジェクト・プロパティ」ダイアログで、「OK」をクリックします。
アプリケーション・ナビゲータで、プロジェクト・フォルダを右クリックし、「デプロイ」、「デプロイメント・プロファイル名」、「宛先」、「ADFライブラリJARファイルへ」の順に選択します。こうすることによって、JARファイルを含むdeployフォルダが<
Application_Root
>\Portal\deploy\
にあるプロジェクト・フォルダに作成されます。
アドオンを使用する任意のアプリケーションにこのJARファイルを追加できます。
タスク・フローを作成した後、これをコンポーザを使用して登録し、デフォルトのオプションとともにコンポーザのツールバーに表示されるようにする必要があります。
コンポーザを使用してアドオンを登録するには:
コンポーザ拡張ファイルがまだ存在していない場合、このファイル(pe_ext.xml
)をプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME
\Portal\src\META-INF
ディレクトリ)の下のMETA-INF
ディレクトリに作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」、「XML文書」の順に選択します。
「OK」をクリックします。
ファイルの名前をpe_ext.xml
にします。
ファイルの<addon-config>
要素をネストされた<panels>
要素とともに追加します。
アドオンとして登録する各タスク・フローに1つの<panel>
要素を追加します。
拡張ファイルの<panels>
要素には、パネルを必要な数だけ宣言できます。
例20-2に、<panel>
エントリを含む拡張ファイルのコードを示します。
例20-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」を参照してください。
(オプション)次の例に示すようにevent-handlers
要素をpanel
要素内に追加して、カスタム・パネルにイベント・ハンドラを登録します。
<event-handlers> <event-handler event="close"> oracle.custom.TaskFlowEventHandler </event-handler> </event-handlers>
詳細は、第20.6項「コンポーザUIイベントのイベント・ハンドラの構成」を参照してください。
pe_ext.xml
ファイルを保存します。
アドオンを登録するには、これへの参照をアプリケーションのadf-config.xml
ファイルに追加する必要があります。addon-panels
エントリを追加して新しいアドオンを定義します。
アドオンをadf-config.xml
ファイルに登録するには:
アプリケーションのadf-config.xml
ファイルを開きます。これは、「アプリケーション・リソース」パネルの「ディスクリプタ」
の下のADF META-INF
フォルダにあります。
ファイルで次のネームスペースをadf-config
要素内に追加します。
xmlns:pe="http://xmlns.oracle.com/adf/pageeditor/config"
ネームスペースを付けて<pe:page-editor-config>
エントリを追加し、その中に<pe:addon-panels>
を含めます。
カスタム・アドインを登録するとき、デフォルトのアドオンはデフォルトでコンポーザに表示されます。デフォルトのアドオンをすべて表示するには、<pe:addon-panels>
タグのshow-default-addons
属性をtrue
に設定する必要があります。この属性のデフォルト値はfalse
です。
<pe:addon-panels>
内で、例20-3に示すように新しいパネルの<pe:addon-panel>
エントリを追加します。
name
属性には、コンポーザ拡張ファイルでパネルの登録に使用した名前が含まれている必要があります。
例20-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>
注意:
|
adf-config.xml
で作成できるコンポーザ固有構成の詳細は、第B.2.2項「adf-config.xml」を参照してください。
コンポーザを使用して登録するカスタム・アドインは、デフォルトのアドインとともにコンポーザのツールバーにレンダリングされます。
この例では、コンポーザのツールバーに「情報」ボタンがレンダリングされます(図20-4)。
このボタンをクリックすると、アプリケーションの情報タスク・フローが表示されます(図20-5)。
注意: アドオン・パネルは、タスク・フロー内のコンテンツに合せて自動的にサイズ設定されます。 |
「ページ・プロパティ」、「ページのリセット」および「カスタマイズ・マネージャ」の各ボタンをコンポーザのツールバーに表示または非表示にすることを選択できます。これらのアドオンのいずれかを非表示にするには、<pe:addon-panels>
のshow-default-addons
属性をtrue
に設定し、非表示にするデフォルトのアドオンのエントリを追加し、そのアドオンのrendered
属性をfalse
に設定する必要があります。
例20-4に、「ページ・プロパティ」アドオンを非表示にするコードを示します。
例20-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>
除外されたアドオン(「ページのリセット」)はコンポーザのツールバーに表示されません。他のデフォルトのアドオンはデフォルトの順序でツールバーに表示されます。
カスタマイズ・マネージャは、タスク・フロー、ページおよび指定したページのページ・フラグメントのアプリケーションのカスタマイズをユーザーが管理できるコンポーザのアドオンです。詳細は、第17.4.14項「アプリケーションのカスタマイズの管理」を参照してください。
カスタマイズ・マネージャのアドオンは、コンポーザのライブラリで使用できますが、デフォルトではレンダリングされません。これを有効にするには、次の例に示すように、<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>
この構成を行うと、コンポーザのツールバーは、図20-6に示すように「カスタマイズ・マネージャ」ボタンを表示します。
ビジネス要件に応じて、コンポーザで様々なユーザーが使用できるアドオンを選択的に非表示にする必要がある場合があります。アドオンを選択的に非表示にするには、例20-5に示すように、<pe:addon-panels>
のshow-default-addons
属性をtrue
に設定し、非表示にするデフォルトのアドオンのエントリを追加し、EL式を使用してそのアドオンのrendered
属性をfalse
にする必要があります。
例20-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
の場合、コンポーザは「ページのリセット」ボタンを表示します。
注意: コンポーザのツールバーで「ページのリセット」ボタンを非表示にすると、タスク・フローのコンテンツの編集中に表示される「タスク・フローのリセット」ボタンも非表示になります。
|
ユーザーがコンポーネントの「編集」アイコンをクリックすると、コンポーザは、「コンポーネント・プロパティ」ダイアログにコンポーネントのプロパティを表示します。「コンポーネント・プロパティ」ダイアログには、一連のタブが用意されています。各タブは、関係する属性のグループを表示します。属性には、コンポーネントの動作および視覚的スタイルのプロパティを制御する関連値があります。たとえば、「スタイル」タブは、幅、高さ、背景色などのコンポーネントのスタイル関係のプロパティを表示します。
同様に、ユーザーが「ページ・プロパティ」ボタンをクリックすると、「ページ・プロパティ」ダイアログが独自の一連のタブとともに開きます。これらのタブには、表示関連のページ・プロパティ、ページ・パラメータおよびセキュリティ設定が含まれています。
「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログに表示されるタブとともにレンダリングするカスタム・プロパティ・パネルを作成して登録できます。また、デフォルトのパネルの削除やカスタム・プロパティ・パネルへの置換も行えます。たとえば、Source
プロパティのピッカーを表示することによってImage
コンポーネントのよりフレンドリなプロパティ・パネルを開発できます。こうすることによって、ユーザーは使用可能なオプションからイメージを容易に選択できるようになります。
この項では、カスタム・プロパティ・パネルの作成方法を説明します。デフォルトのプロパティ・パネルを除外、上書きおよび選択的にレンダリングする方法も説明します。次のサブセクションが含まれます:
カスタム・プロパティ・パネルの作成は、アドオンの作成と似ています。つまり、カスタム・プロパティ・パネルをタスク・フローとして作成し、これをコンポーザ拡張ファイルに登録します。ただし、コンポーザのアドオンはadf-config.xml
ファイルのaddon-panels
要素を使用して構成されるのに対して、カスタム・プロパティ・パネルは拡張ファイル自体のproperty-panels
要素を使用して構成されます。
カスタム・プロパティ・パネルを構成して、常に「コンポーネント・プロパティ」ダイアログに表示できます。または、パネルを構成して、特定のコンポーネントまたはタスク・フローが編集のために選択されたときのみ表示することも可能です。
この項では、カスタム・プロパティ・パネルを作成および登録する方法を説明します。次のサブセクションが含まれます:
プロパティ・パネルには、ページまたはコンポーネントのプロパティを編集する方法が用意されています。たとえば、ユーザーは、選択したタスク・フローで「編集」アイコンをクリックし、そのパラメータ値を変更し、「コンポーネント・プロパティ」ダイアログでその視覚的属性を変更できます。
コンポーザでは、プロパティ・パネルをコンポーネントおよびタスク・フローと関連付けることができます。ユーザーがコンポーネントまたはタスク・フローの「編集」アイコンをクリックすると、コンポーザは「コンポーネント・プロパティ」ダイアログを開き、オブジェクトと関連付けたカスタム・プロパティ・パネルをデフォルトのプロパティ・パネルとともに表示します。
カスタム・プロパティ・パネルを作成し、これをコンポーザ拡張ファイルで宣言する手順は、コンポーザのアドオンを作成して宣言する手順と似ています。詳細は、第20.2.1.1項「アドオン・タスク・フローの作成」および第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
例20-6に、pe_ext.xml
ファイルでのサンプルのプロパティ・パネル宣言を示します。
例20-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
ファイルで宣言した後、例20-7に示すように、<property-panels>
要素を使用してこれを構成する必要があります。こうすることによって、パネルは、コンポーザ・コンポーネント・プロパティおよび「ページ・プロパティ」ダイアログで自動的に表示されます。
例20-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>
要素を追加できます。
拡張ファイルにカスタム・パネルを登録するとき、パネルをコンポーネントまたはタスク・フローと関連付けることができます。カスタム・プロパティ・パネルはそのコンポーネントまたはタスク・フローに対してのみレンダリングされます。この項では、特定のコンポーネントに対してプロパティ・パネルを登録する方法を説明します。
コンポーネントに対してプロパティ・パネルを登録するには:
コンポーザ拡張ファイル(pe_ext.xml
)を作成します(これがまだ存在していない場合)。
拡張ファイルの作成の詳細は、第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
pe_ext.xml
ファイルの<addon-config>
セクション内に<property-panels>
要素を追加します。
<property-
panel>
宣言を<property-panels>
要素内に追加します。
<property-panel>
エントリは複数指定できます。
<property-panel>
要素内で、<component>
要素を追加してコンポーネントの実行時クラス名(オプション)および<panel>
要素を指定し、ファイルの<addon-config>
セクションのパネルを宣言する際に使用した名前を指定します。
例20-8に、コンポーネントの完全修飾クラス名を指定することでCommand Button
コンポーネントに関連付けられたカスタム・プロパティ・パネルを示します。Oracle ADFコンポーネントとその実行時クラスの詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。
例20-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>
注意: プロパティ・パネルを登録するとき、これをコンポーネントまたはタスク・フローと関連付けない場合(次の項で説明)、登録したパネルは常に「コンポーネント・プロパティ」ダイアログおよび「ページ・プロパティ」ダイアログにレンダリングされます。 コンポーネントに複数のプロパティ・パネルを構成するには、複数の |
「子コンポーネント」、「スタイル」、「パラメータ」などのすべてのデフォルトのパネルは、定義したカスタム・パネルとともに表示されます。
コンポーザ拡張ファイルに登録することで、タスク・フローのカスタム・プロパティ・パネルを定義できます。例20-9に、タスク・フローへのカスタム・プロパティ・パネルの登録に使用されるサンプル・コードを示します。
特定のタスク・フローに対して登録されたカスタム・プロパティ・パネルは、これが関連付けられたタスク・フローが選択された場合のみ表示されます。それ以外の場合には、デフォルトのプロパティ・パネルが表示されます。
注意: タスク・フロー固有のカスタム・プロパティ・パネルは、タスク・フロー・パラメータまたはタスク・フローの動作と関係のあるその他の側面をカスタマイズする際にのみ使用します。 カスタム・プロパティ・パネルは、Oracle JSF Portlet Bridgeを使用してレンダリングされたタスク・フローに関連付けられている場合には動作しません。 |
タスク・フローに対してプロパティ・パネルを登録するには:
pe_ext.xml
ファイルの<addon-config>
要素内に<property-panels>
要素を追加します。
拡張ファイルの作成の詳細は、第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
この中にproperty-
panel
宣言を追加します。
property-panel
エントリは複数指定できます。
taskflow-id
要素およびpanel
要素をproperty-
panel
要素内に追加します。
taskflow-id
要素を追加してタスク・フロー名を指定します。panel
要素を追加して、ファイルのaddon-config
セクションでプロパティ・パネルを宣言する際に使用した名前を指定します。
例20-9に、dashboard
タスク・フローと関連付けられたカスタム・プロパティ・パネルを示します。
例20-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>
注意:
|
カスタム・プロパティ・パネルを特定のコンポーネントまたはタスク・フローと関連付けた場合、実行時このパネルは、指定したコンポーネントまたはタスク・フローから起動した「コンポーネント・プロパティ」ダイアログでタブとしてレンダリングされます。カスタム・プロパティ・パネルを特定のコンポーネントまたはタスク・フローと関連付けなかった場合、実行時このカスタム・プロパティ・パネルは、すべてのページ、コンポーネントおよびタスク・フローに対して「ページ・プロパティ」ダイアログと「コンポーネント・プロパティ」ダイアログの両方でタブとしてレンダリングされます。
注意: 「コンポーネント・プロパティ」ダイアログおよび「ページ・プロパティ」ダイアログで、カスタム・パネルは、タスク・フローを含むタブ・コンポーネントによってサイズ設定されます。タブ・コンポーネント自体のサイズは、現在適用されているスキンのルールによって決まります。このルールは |
コンポーザの「コンポーネント・プロパティ」ダイアログは、デフォルトで次のパネルを表示します: 「表示オプション」、「子コンポーネント」、「イベント」、「スタイル」、「コンテンツ・スタイル」および「パラメータ」。pe_ext.xml
ファイルでカスタム・パネルを宣言および登録するときにデフォルトのパネルの名前を使用して特定のパネルを上書きできます。デフォルトのパネルの詳細は、第B.3項「コンポーザのデフォルト・アドオンとプロパティ・パネル」を参照してください。
例20-10に、「表示オプション」パネルをcustom-panel-task-flow
というタスク・フローを使用して定義したパネルで上書きするコードを示します。
例20-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>
即時利用可能な、すべてのデフォルトのプロパティ・パネルは、構成したカスタム・プロパティ・パネルとともに表示されます。「ページ・プロパティ」ダイアログまたは「コンポーネント・プロパティ」ダイアログでデフォルトのプロパティ・パネルを非表示にするために、そのパネル専用の行を追加し、rendered
属性をfalse
に設定できます。
例20-11に、Command Button
コンポーネントの「コンテンツ・スタイル」プロパティ・タブがfalse
に設定されたrendered
属性を示します。デフォルトのプロパティ・パネルの詳細は、第B.3項「コンポーザのデフォルト・アドオンとプロパティ・パネル」を参照してください。
例20-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>
アプリケーションに登録されたカスタム・プロパティ・パネルは、指定したコンポーネントの「編集」アイコンをユーザーがクリックすると、「コンポーネント・プロパティ」ダイアログにレンダリングされます。アプリケーションを構成して、ログイン・ユーザーのロール、表示中のページなどの異なる条件に基づいてプロパティ・パネルを選択的にレンダリングできます。プロパティ・パネルを選択的に表示するために、次の例に示すように、property-panel
のrendered
属性のEL値を使用できます。
<property-panel name="global-but-just" rendered="#{bean.showProperty}">
コンポーネントのカスタム・プロパティ・パネルを構築する場合、コンポーザ・タグ・ライブラリから使用可能なShow Property
コンポーネントを使用して、カスタム・パネルにコンポーネントの属性を表示できます。カスタム・パネル・タスク・フローを定義するページ・フラグメントで、表示する各属性に対して1つのShow Property
コンポーネントを追加する必要があります。Show Property
は、(カスタム・パネルを作成した)コンポーネントまたはタスク・フローのプロパティ値を読み取る宣言型コンポーネントで、カスタム・パネルにそのプロパティの入力フィールドを表示します。ユーザーは、入力フィールドを使用してパネルのプロパティ値を編集できます。
カスタム・パネルの詳細は、第20.3.1.1項「カスタム・プロパティ・パネルの作成」を参照してください。
Show Property
コンポーネントを追加するには:
カスタム・パネル・タスク・フロー用に作成したページ・フラグメントを開きます。
コンポーネント・パレットで、「コンポーザ」を選択します。
カスタム・パネルに表示するコンポーネント属性それぞれのShow Property
コンポーネントをドラッグ・アンド・ドロップします。
属性がカスタム・パネルに正しく表示されるようにするには、第B.1.7項「Show Property」を参照して、各Show Property
コンポーネントに属性を設定します。
注意: コンポーザの外側のページでも |
例
Show Detail Frame
コンポーネント内に含まれている天気ウィジェットの例を考えてみます。カスタム・プロパティ・パネルが作成され、ユーザーは、天気ウィジェットのText、Auto RefreshおよびRefresh Intervalの各属性を編集できます。これには、ユーザーがこれらの属性に値を指定するための3つのフィールドがあります。ユーザーが天気ウィジェットの3つの属性を設定できるようにするために、パネルで表示する各属性に1つのShow Property
コンポーネントが追加されます。実行時にユーザーが天気ウィジェットを編集すると、「コンポーネント・プロパティ」ダイアログは、図20-7に示すように3つの属性を含むカスタム・パネルを表示します。
天気ウィジェットは、次の例に示すように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
コンポーネントが含まれ、Text
、Auto 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); } }
「コンポーネント・プロパティ」ダイアログの「パラメータ」タブおよび「表示オプション」タブのすべてのプロパティは、式言語(EL)式を取ることができます。このようなパラメータで使用できる「式ビルダー」オプションは、図20-8に示すように単純に式ビルダーである「編集」ダイアログを開きます。式ビルダーは、取得可能だが取得できない場合には未知である値が必要な場合(たとえば、値を現在のユーザーまたは現在のアプリケーション・スキンの名前にする場合)に特に便利です。
式ビルダーをカスタマイズして、コンポーザ拡張ファイルpe_ext.xml
に必要なエントリを作成することによってオプションを増やすことができます。ELを無効化するか、または既存のELを上書きから保護するためにコンポーザを構成することもできます。
この項では、式ビルダーを拡張してカスタム機能を追加する方法を説明します。次のサブセクションが含まれます:
カスタム・オプションを式の値のドロップダウン・リストに追加することによって、式ビルダーを拡張できます。カスタム・オプションを定義し、pe_ext.xml
ファイルに含める必要があります。追加する新しい各オプションに対して、<selector>
要素を定義し、これをpe_ext.xml
ファイルに含める必要があります。
コンポーザ拡張ファイルでカスタム・オプションを構成するには:
式ダイアログにカスタム・オプションを移入するロジックを備えたJava Bean(たとえば、UserInformation.java
)を作成します。例20-12に、新しい文字列(User Name
)を式ダイアログのカスタム値として表示するために使用するサンプルのJava Beanのコードを示します。
例20-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; }
<elbuilder-config>
要素をpe_ext.xml
ファイルに追加してBeanを登録します。
拡張ファイルの作成の詳細は、第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
<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
属性を使用して、特定の条件に基づいてオプションを条件付きで表示できます。
pe_ext.xml
ファイルを保存します。
アプリケーションまたは特定の.jspxページで、ELを無効化するか、または既存のELを上書きから保護するためにコンポーザを構成できます。これは、第20.11項「「デザイン」ビューでの直接選択の有効化」で説明される「デザイン」ビューでエンド・ユーザーに要素を公開する際に特に役立ちます。
アプリケーションの設定を定義するには、<pe:page-editor-config>
タグ内のadf-config.xmlの次の要素を変更します。
<pe:allow-el>
は、ELがアプリケーション・ページで実行できるかどうかを定義します。デフォルトはtrueです。
<pe:protect-el>
は、フォーム要素のELが読取り専用であるかどうかを定義します。デフォルトはfalseです。
特定の.jspxページの動作を定義するには、<pe:pageCustomizable>
タグ内の次の要素を使用します。
allowEL
(boolean)は、ELがアプリケーション・ページで実行できるかどうかを定義します。デフォルトはtrueです。
protectEL
(boolean)は、フォーム要素のELが読取り専用であるかどうかを定義します。デフォルトはfalseです。
.jspxページで定義される設定は、adf-config.xmlで定義される設定より優先されます。
実行時の式ビルダーのセレクタは、図20-9に示すようにカスタム値をデフォルト値とともに表示します。
ELが無効な場合、式ビルダーにはアクセスできず、ELはプロパティ・フィールドで許可されません。
ELが保護される場合、属性値としてすでに存在するELは、「パラメータ」タブおよび「表示オプション」タブのいずれかで変更することはできません。(LOVから取得されたELが許可されます。)
通常、コンポーザでタスク・フローのパラメータを編集中、図20-10に示すように、ユーザーは「コンポーネント・プロパティ」ダイアログによって提供されたテキスト・ボックスに値を入力します。しかし、ユーザーが特定のフィールドに指定する値について混乱することが多いです。これを推測のままにしておくのではなく、各パラメータが取ることができる値がわかっている開発者は、可能な場合には有効なすべてのオプションをリストすることによってユーザーが容易に操作できるようにすることができます。コンポーザを構成して、値のリスト(LOV)またはピッカーを任意のパラメータに対して表示できます。
次のオプションを使用して事前定義された一連のパラメータ値を表示できます。
静的LOV
事前定義された値のリストを表示します。
動的LOV
ページが実行されているときに計算されるEL値を評価して生成される値のリストを表示します。
グローバルLOV
アプリケーションの任意のタスク・フローで使用できる値のグローバル・リストを表示します。
ピッカー
ピッカー・フォーマット(たとえば、ドキュメント・ピッカー)ですべての値を表示します。
この項では、様々なタイプのLOVをタスク・フローのパラメータ用に構成する方法を説明します。次のサブセクションが含まれます:
この項の手順の説明に使用する例
この項の手順の一部は、図20-11に示すように、選択した都市の天気の情報を表示する単純な天気タスク・フロー(weather-task-flow-definition
)の例を使用します。
このタスク・フローには、選択した都市の天気の詳細を選択した温度単位(華氏または摂氏)で表示するようにそれぞれをユーザーが変更できる2つのパラメータ(zipCode
とtempUnits
)が用意されています。この天気タスク・フローの例は、次のタイプのLOVを構成する方法を説明するために使用します。
図20-12に示すような、tempUnits
パラメータの値Celsius
およびFahrenheit
を持つ静的LOV。
都市名または郵便番号をユーザーが指定して対応する詳細を天気タスク・フローに表示できる2つのフィールドを持つピッカー(図20-13)。
または、実行時に評価されるEL値に基づいて値を表示するzipCode
パラメータの動的LOV(図20-14)。
天気タスク・フローには、例20-13に示すようにコードを備えたタスク・フロー定義ファイル(weather-task-flow-definition.xml
)が含まれています。
例20-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を有効にして、ユーザーが事前定義されたオプションのリストから選択できるようにする方法を説明します。
この項では、様々なタイプのLOVをタスク・フローのパラメータ用に構成する方法を説明します。次のサブセクションが含まれます:
静的LOVを使用して、パラメータに対して事前定義された値のリストを表示します。コンポーザ拡張ファイル(pe_ext.xml
)でネストされた<enumeration>
要素を備えた<lov-config>
セクションを定義することによって、静的LOVを構成できます。この項では、天気タスク・フローの例を使用して、tempUnits
パラメータの静的LOVを構成する方法を説明します。
静的LOVを構成するには:
コンポーザ拡張ファイルのpe_ext.xml
が存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME
\Portal\adfmsrc\META-INF
ディレクトリ)の下のMETA-INF
ディレクトリに作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」、「XML文書」の順に選択します。
「OK」をクリックします。
ファイルの名前をpe_ext.xml
にします。
次のコード例に示すように、<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値を使用できます(たとえば、 |
ファイルを保存します。
動的LOVを使用して、実行時にEL値を評価して動的に生成されるリストを表示します。この項では、天気タスク・フローの例を使用して、zipCode
パラメータの動的LOVを構成する方法を説明します。例を簡潔にしておくために、マネージドBeanは、実行時にZipcode
フィールドに表示される静的値のみを提供します。
動的LOVを構成するには:
Bean(たとえば、weatherBean
)を作成し、Zipcode
パラメータの値のリストを定義します。次の例に関連するコード・スニペットを示します。
package portal.weather; . . . public List<SelectItem> getCitiesList() { return citiesList; } private static final String F = "°F"; private static final String C = "°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])); } }
次の例に示すように、アプリケーションの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>
コンポーザ拡張ファイルのpe_ext.xml
が存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME
\Portal\adfmsrc\META-INF
ディレクトリ)の下のMETA-INF
ディレクトリに作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」、「XML文書」の順に選択します。
「OK」をクリックします。
ファイルの名前をpe_ext.xml
にします。
次の例に示すように、<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を構成できます。
ファイルを保存します。
通常、ピッカーを使用すると、ユーザーは、使用可能なすべてのオプション(色ピッカー、日付ピッカーなど)を表示するポップアップ・ダイアログから値を選択できます。タスク・フローのパラメータのピッカーを構成することには、次の高水準のタスクが含まれます。
選択したUIを使用してピッカー・タスク・フローを作成します。
ピッカー・タスク・フローのパラメータを定義します。これらのパラメータを使用して、メイン・タスク・フローのパラメータ(ピッカーを構成するためのパラメータ)を移入します。
メイン・タスク・フローのパラメータを構成して、作成したピッカーを表示します。この構成をpe_ext.xml
ファイルに追加する必要があります。
この項では、例として天気タスク・フローを使用して、これらの手順を詳細に説明します。zipCode
パラメータの都市ピッカーを構成する方法を示します。ピッカー・タスク・フローでは、ユーザーは、都市名を指定し、その場所の郵便番号を取得できます。ピッカーからの郵便番号は、天気タスク・フローのZipcodeフィールドに入力されます。この項には次のサブセクションが含まれます:
JSFFフラグメントを使用してピッカー・タスク・フローを作成します。フラグメントを設計して、選択したフィールドまたはオプションを表示します。
ピッカー・タスク・フローを作成するには:
アプリケーション・プロジェクトで、ADFタスク・フロー(たとえば、weather-picker-task-flow-definition
)を作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「Web層」を展開し、「JSF」、「ADFタスク・フロー」の順に選択します。
「OK」をクリックします。
ビュー
・オブジェクトをタスク・フローに追加します(たとえば、weatherPicker
)。
ビューをダブルクリックしてweatherPicker.jsff
フラグメントを作成します。
関連項目: タスク・フロー作成の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』のADFタスク・フローの概説に関する項を参照してください。 |
選択したコンポーネントを使用してフラグメントを設計します。例20-14に、XMLファイルでユーザーが郵便番号を検索できる2つのInput Text
コンポーネントと「OK」
と「取消」
の2つのUIコントロールを含むサンプルのタスク・フローを示します。
例20-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には、メイン・タスク・フローのパラメータにピッカーで指定した値を移入するロジックも含まれています。
ピッカー・タスク・フロー定義で参照した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(); } . . .
次の例に示すように、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>
次の例に示すように、ピッカー・タスク・フローの2つの入力パラメータinParamVal
とoutParam
を定義します。
<!-- 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
を使用してメインの天気タスク・フローに渡します。
タスク・フローの戻りアクティビティおよび「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>
タスク・フロー定義ファイルを保存します。
タスク・フローのパラメータのカスタム・ピッカーを表示するには、コンポーザ拡張ファイルpe_ext.xml
でそのパラメータのピッカーを構成する必要があります。
タスク・フローのパラメータに対してピッカーを構成するには:
コンポーザ拡張ファイルのpe_ext.xml
が存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME
\Portal\adfmsrc\META-INF
ディレクトリ)の下のMETA-INF
ディレクトリに作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」、「XML文書」の順に選択します。
「OK」をクリックします。
ファイルの名前をpe_ext.xml
にします。
次のコード例に示すように、<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>
セクション内に任意の数のパラメータのピッカーを構成できます。
ファイルを保存します。
実行時にメイン・タスク・フローを編集すると、「コンポーネント・プロパティ」ダイアログにはそのパラメータの隣に拡大アイコンが表示されます。アイコンをクリックすると、ユーザーが値を選択できるピッカー・タスク・フローが起動します。
アプリケーション内の別のタスク・フローのパラメータにLOVを再使用する場合、LOVをグローバル・レベルで定義し、タスク・フローのパラメータからこれを参照できます。
グローバル・リストからLOVを構成するには:
コンポーザ拡張ファイルのpe_ext.xml
が存在していない場合、このファイルをプロジェクトのWebコンテキスト・ルート(たとえば、APPLICATION_HOME
\Portal\adfmsrc\META-INF
ディレクトリ)の下のMETA-INF
ディレクトリに作成します。
「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を展開し、「XML」、「XML文書」の順に選択します。
「OK」をクリックします。
ファイルの名前をpe_ext.xml
にします。
次のコード例に示すように、<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を構成できます。
次の例に示すように、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>
ファイルを保存します。
イベント・ハンドラは、コンポーザを使用して登録され、ユーザーがページでアクションを実行するとコールされるJavaクラスです。たとえば、「保存」ボタンをクリックすると、コンポーザはアプリケーションに保存イベントに応答する機会を与えるアプリケーション・コードにコール・バックします。コンポーザがデフォルトで提供するイベント・ハンドラに加えて、カスタム・プロパティ・パネルの変更を保存するなど、アプリケーション固有のイベントに対して追加のハンドラを構成できます。
この項では、コンポーザでUIイベントのイベント・ハンドラを作成および登録する方法について説明します。次のサブセクションが含まれます:
コンポーザを使用してイベント・ハンドラを登録すると、これは、対応するイベントがコンポーザUIで起動されるときにコールされます。
この項では、イベント・ハンドラを作成し、コンポーザを使用してこれを登録する方法を説明します。次のサブセクションが含まれます:
表20-1に、コンポーザが現在ハンドラの登録をサポートするUIイベントをリストします。
イベント | 原因 | イベント・タイプ | リスナー・インタフェース(oracle.adf.view.page.editor.event) | メソッド | イベント・インタフェース |
---|---|---|---|---|---|
保存 |
ユーザーがコンポーザのツールバーの「保存」または「保存してラベル付け」ボタンをクリックするか、または「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログの「適用」(保存)または「OK」(保存して閉じる)ボタンをクリックすると起動します。 |
|
|
|
|
閉じる |
ユーザーがコンポーザのツールバーで「閉じる」ボタンをクリックすると起動します。 |
|
|
|
|
削除 |
ユーザーがコンポーネントを削除すると起動します。 |
|
|
|
|
追加 |
ユーザーがアイテムの「追加」ボタンをクリックして、リソース・カタログからページにコンポーネントを追加すると起動します。 |
|
|
|
|
選択 |
ユーザーが次の項目を選択すると起動します。
|
|
|
|
|
属性変更 |
ユーザーが属性を変更すると起動します。 属性変更が無効な場合、リスナーは |
|
|
|
|
コンポーザを使用してイベントを登録するには、まずJavaクラスを作成し、イベント・ハンドラに適切なリスナーを実装する必要があります。この項では、保存イベント・ハンドラを作成する手順を説明します。表20-1でリストされるすべてのサポート対象のイベントに対するイベント・ハンドラを作成する同様の手順を実行できます。
保存イベント・ハンドラは、ユーザーがコンポーザのツールバーで「保存」ボタンをクリックするか、または「コンポーネント・プロパティ」ダイアログまたは「ページ・プロパティ」ダイアログで「適用」ボタンまたは「OK」ボタンをクリックするとコールされます。保存イベント・ハンドラはoracle.adf.view.page.editor.event.SaveListener
を実装する必要があります。保存イベントのisCommit
メソッドを使用して、ページに対して行われた変更とコンポーネント・プロパティに対して行われた変更を区別できます。値がtrue
の場合、ユーザーがコンポーザのツールバーで「保存」ボタンをクリックし、ページに対して行われた変更を保存したことを示します。値がfalse
の場合、ユーザーが「コンポーネント・プロパティ」ダイアログで「適用」ボタンまたは「OK」ボタンをクリックし、コンポーネント・プロパティに対して行われた変更を保存したことを示します。
保存イベント・ハンドラを作成するには:
JDeveloperで、Portalプロジェクトを選択し、「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を開き、「Java」、「Javaクラス」の順に選択して、「OK」をクリックします。
「Javaクラスの作成」ダイアログで、クラスの名前(SaveHandler
など)を指定します。
「オプション属性」セクションで、oracle.adf.view.page.editor.event.SaveListener
インタフェースを追加します。
注意:
|
「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
メソッドを宣言する必要があります。例外オブジェクト(作成時)にこのイベントを取り消すための理由を含めることができます。
この例外をスローするとき、このイベントの残りの処理は取り消され、キューに入っているリスナーはスキップされます。
これと同様の手順を実行することによって、サポートされているすべてのイベントのイベント・ハンドラを作成できます。
ヒント:
|
イベント・ハンドラを作成および実装した後、コンポーザを使用してこれを登録する必要があります。登録は、対応するイベントがUIで発生したときに、ハンドラがコンポーザによってコールされて戻されるようにするために必要です。
コンポーザ拡張ファイル(/META-INF/pe_ext.xml
)でイベント・ハンドラを登録します。このファイルの作成の詳細は、第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
イベント・ハンドラを登録するには:
アプリケーションのpe_ext.xml
ファイルに、次のエントリを追加します。
<event-handlers> <event-handler event="save">view.SaveHandler</event-handler> </event-handlers>
event
属性およびevent-handler
タグ間に提供する値は、入力したイベントのタイプおよびイベント・クラスに指定した名前に対して一意です。
ファイルを保存します。
実行時、登録したイベント・ハンドラは、拡張ファイルの順序およびこれらがクラス・パスで見つかる順序に応じてコールされます。コンポーザのネイティブ・イベント・ハンドラは最後にコールされます。
イベント・ハンドラのprocess
EventName
メソッドの起動時に、イベント・ハンドラがiAbortProcessingException
をスローする場合、イベントは取り消されて、コンポーザのネイティブ・イベント・ハンドラを含むイベント・ハンドラがこれ以上コールされません。ただし、イベント・ハンドラのインスタンス化時にエラーが発生する場合は、コンポーザが次のイベント・ハンドラを続行します。警告メッセージがログに記録されます。
コンポーザのページでトリガーされた各UIイベントでは、対応するイベント・ハンドラはアプリケーションで登録されたリスナーからメソッドをコールして戻します。いくつかの追加の構成を実行することにより、イベント・ハンドラが実行される順序を指定し、リスナーがプロセスを終了するように構成するか、またはイベントが処理されるようにコンポーザに通知できます。
イベント・ハンドラの順序を指定することによって、イベント・ハンドラ(したがってリスナー)がコールされる順序を決定できます。pe_ext.xml
ファイルで登録されたイベント・ハンドラに対してsequence
属性を定義することによって、リスナーへの順序番号の割当てまたはデフォルト値の変更を行えます。
リスナーに順序番号を指定するには:
アプリケーションのpe_ext.xml
ファイルで、順序指定するハンドラのevent-handler
要素を探します。
sequence
属性を次のように追加します。
<event-handlers> <event-handler event="save" sequence="101">view.SaveHandler</event-handler> </event-handlers>
sequence
属性の値は正の整数である必要があります。この属性を定義しないと、イベント・ハンドラは、デフォルトの順序番号100
に内部的に割り当てられます。
コンポーザ組込みのリスナーおよび順序番号のないリスナーは、デフォルトの順序番号100
に割り当てられます。特定のイベント・ハンドラを他のイベント・ハンドラより前にコールする場合、100
未満の値を指定する必要があります。
ファイルを保存します。
イベント・ハンドラを構成して、例外をスローすることによって現在のイベントおよびその後のすべてのイベントの処理を終了できます。このためには、リスナーをthrows AbortProcessingException
として実装するときに使用したメソッドを宣言する必要があります。また、ハンドラを構成して、イベントがEvent.setEventHandled(true)
メソッドを使用して処理されたことをコンポーザに通知できます。
たとえば、delete
イベント・ハンドラを構成して、現在のイベントおよび保留中のすべての削除イベントを終了し、ユーザーがコンポーザでコンポーネントを削除しようとしたときに例外をスローできます。これを有効にするには、例20-15に示すようにDeletionListener
インタフェースを実装する必要があります。
例20-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) } } } ... }
ドロップ・ハンドラは、コンポーザを使用して登録され、ユーザーがリソース・カタログで「追加」リンクをクリックするとコールされるJavaクラスです。ドロップ・ハンドラは、処理できるデータ・フレーバを宣言します。カタログの各リソースにフレーバがあります。ユーザーがリソースの隣の「追加」リンクをクリックすると、コンポーザは登録されているすべてのドロップ・ハンドラを問い合せ、このフレーバを処理できるかどうか確認します。そのフレーバを処理できるドロップ・ハンドラが1つのみの場合、制御がそのドロップ・ハンドラに渡され、リソースがすぐにページに追加されます。そのフレーバを処理できるドロップ・ハンドラが複数ある場合、コンテキスト・メニューに使用可能なドロップ・ハンドラが表示されます。リソースは、ユーザーがコンテキスト・メニューからJavaドロップ・ハンドラを選択したときにページにドロップされます。
複数のJavaドロップ・ハンドラを持つリソースの例は、カタログでドキュメント・サービスを構成した場合のDocumentsフォルダ内で使用可能なPersonal Documentsサブフォルダです。このサブフォルダは、Content Presenter、Document List ViewerまたはDocument Libraryとして追加できます。
注意: リリース11.1.1.1で |
この項では、ドロップ・ハンドラを作成し、これをアプリケーションに登録する手順を説明します。次のサブセクションが含まれます:
この項では、リソース・カタログからXMLコンテンツを追加するサンプルのドロップ・ハンドラを作成し、コンポーザを使用してこのドロップ・ハンドラを登録する方法を説明します。次のサブセクションが含まれます:
コンポーザを使用してドロップ・ハンドラを作成するには、まず抽象ベース・クラス(DropHandler
)を拡張し、getName()
、getAcceptableFlavors()
およびhandleDrop()
の各メソッドを実装する必要があります。この項では、Test
というXMLコンポーネントをリソース・カタログに追加し、XMLコンテンツを追加するためのCustom XML
というドロップ・ハンドラを作成する例を説明します。
ドロップ・ハンドラを作成するには:
JDeveloperで、Portalプロジェクトを選択し、「ファイル」メニューから「新規」を選択します。
「新規ギャラリ」ダイアログで、「一般」を開き、「Java」、「Javaクラス」の順に選択して、「OK」をクリックします。
「Javaクラスの作成」ダイアログで、クラスの名前(TestDropHandler
など)を指定します。
「拡張」フィールドで、入力または参照してDrophandler
クラス(oracle.adf.view.page.editor.drophandler.DropHandler
)を選択します。
注意:
|
必要なインポート文を追加して「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; } }
getName()
メソッドを次のように実装し、ドロップ・ハンドラの名前を返します。
public class TestDrophandler extends DropHandler { public TestDrophandler() { super(); } public String getName() { return "Custom XML"; } . . .
この値(Custom XML
)は、リソース・カタログのXMLコンポーネントの隣の「追加」リンクのコンテキスト・メニューに表示されます。
getAcceptableFlavors()
メソッドを次のように実装し、XMLコンポーネントでサポートされるデータ・フレーバのリストを取得します。
public class TestDropHandler extends DropHandler { private static final DataFlavor[] ACCEPTABLE_FLAVORS = { XmlComponentFactory.XML_STRING_FLAVOR }; . . . public DataFlavor[] getAcceptableFlavors() { return ACCEPTABLE_FLAVORS; } . . .
次のサンプル・ファイルに示すように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番目などです。
TestDropHandler.java
ファイルを保存します。
ドロップ・ハンドラを実装した後、コンポーザを使用してこれを登録する必要があります。登録は、ユーザーがカタログで「追加」リンクをクリックしたときに、ハンドラがコンポーザによってコールされるようにするために必要です。コンポーザ拡張ファイル(/META-INF/pe_ext.xml
)でドロップ・ハンドラを登録します。このファイルの作成の詳細は、第20.2.1.2項「コンポーザを使用したアドオンの登録」を参照してください。
ドロップ・ハンドラを登録するには:
pe_ext.xml
ファイルで、次のエントリを追加します。
<drop-handlers> <drop-handler>test.TestDropHandler</drop-handler> </drop-handlers>
ここで、TestDropHandler
はドロップ・ハンドラの実装の名前です。
ファイルを保存します。
必要数の<drop-handler>
要素を追加することによって、拡張ファイルに任意の数のドロップ・ハンドラを登録できます。
XmlComponentFactory
クラスによって生成されたXMLコンポーネントのドロップ・ハンドラを作成したため、XMLコンポーネントをリソース・カタログに追加してからそのコンポーネントを実行時にページに追加することによって、実行時にドロップ・ハンドラがどのように動作するかをテストできます。
XMLコンポーネントをカタログに追加するには:
デフォルトのカタログ定義ファイル(default-catalog.xml
)を開きます。
このファイルの場所の詳細は、第15.2.7項「アプリケーションまたはページ用のデフォルト・リソース・カタログの構成方法」を参照してください。
次のコードをファイルの<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>
default-catalog.xml
ファイルを保存します。
実行時、リソース・カタログには、図20-17に示すようにXMLコンポーネントが表示されます。詳細は、第15.2.3.4項「コンポーネントの追加」を参照してください。
ユーザーがカタログのコンポーネントの「追加」リンクをクリックすると、そのフレーバをサポートしているすべてのドロップ・ハンドラが「追加」リンクのコンテキスト・メニューのオプションとして表示されます。ただし、そのフレーバを処理できるドロップ・ハンドラが1つのみの場合、リソースはすぐにページに追加されます。
図20-18に、Custom XML
オプションおよびデフォルトのXMLオプションを備えたTest
XMLコンポーネントの「追加」リンクをクリックしたときに表示されるコンテキスト・メニューを示します。
一部のコンポーネント・プロパティは、デフォルトでフィルタ処理によって除外されるため、コンポーザの「コンポーネント・プロパティ」ダイアログに表示されません。デフォルトのフィルタは、コンポーザの拡張ファイル(/META-INF/pe_ext.xml)の<filter-config>
セクションで定義されています。
グローバル・フィルタは、すべてのコンポーネントの属性をフィルタ処理します。これらは<global-attribute-filter>
タグを使用して定義されます。タグ・レベルのフィルタは、指定したコンポーネントの属性のみをフィルタ処理します。これらは<taglib-filter>
タグを使用して定義されます。
注意: 拡張ファイルでは、任意の数の |
「コンポーネント・プロパティ」ダイアログでさらに多くのプロパティを非表示にするために追加のフィルタを定義できます。この項では方法について説明します。次のサブセクションが含まれます:
コンポーザは、組込みフィルタ構成を定義します。拡張ファイル(pe_ext.xml
)を使用して、追加のプロパティ・フィルタの定義およびフィルタの削除を実行できます。(1つのタグに対してでも)異なる拡張ファイルで任意の数のフィルタを定義できます。コンポーザは、すべての拡張ファイルからのフィルタ処理情報をマージします。
例外ファイルでプロパティ・フィルタを定義するには、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>
ファイルを保存します。
実行時、コンポーザのプロパティを編集すると、フィルタ処理によって除外されたプロパティは「コンポーネント・プロパティ」ダイアログにレンダリングされません。
前にフィルタ処理されたプロパティが「コンポーネント・プロパティ」ダイアログにレンダリングされるように、グローバル・フィルタおよびタグレベル・フィルタを削除できます。これは、コンポーザの組込みフィルタやアプリケーションの別の場所で定義された別の拡張ファイルによってフィルタ処理されて除外されたプロパティを表示する際に便利です。
注意: プロパティ・フィルタを削除した後、フィルタは、別の拡張ファイルでそのプロパティに対して定義されても「コンポーネント・プロパティ」ダイアログにレンダリングされます。 |
プロパティ・フィルタを削除するには:
META-INF
ディレクトリにあるコンポーザ拡張ファイル(pe_ext.xml
)を編集します。
このファイルのエントリを編集してプロパティ・フィルタを削除できます。
フィルタの削除元の属性を検索し、次の例に示すように、<attribute>
タグでfiltered
をfalse
に設定します。
<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>
ファイルを保存します。
タスク・フローで受け渡すパラメータを有効にする場合、管理者は、特定のパラメータを設定することによってカスタマイズ・マネージャをカスタマイズできます。デフォルトでは、管理者は、コンポーザのカスタマイズ・マネージャ・タスク・フローにパラメータを渡すことはできません。表20-2に、カスタマイズ・マネージャ・タスク・フローによってサポートされるパラメータを示します。
表20-2 カスタマイズ・マネージャ・タスク・フローのパラメータ
パラメータ名 | 値 | 説明 |
---|---|---|
defaultPage |
ページのURI |
管理するデフォルト・ページを指定するために使用します。この値がnullの場合、現在のページが使用されます。 |
dynamicNodeMap |
|
ページ、XMLドキュメントまたは指定されたページあるいはフラグメントのタスク・フローのリストを次の形式を使用して返すために使用されます。 Page1.jspx -> List of {CustomizationManagerTaskFlowNode or CustomizationManagerPageNode or CustomizationManagerXMLNode} そのページの動的タスク・フローを渡すためには そのページのページ・テンプレートを渡すためには このページが所有するXMLドキュメントを渡すためには |
showBase |
true/false デフォルト: false |
ベース・ドキュメントの列を表示または非表示にするために使用します。 |
showCurrentLayers |
true/false デフォルト: true |
現在使用しているレイヤーの詳細を表示する列を表示または非表示にするために使用します。 |
showAllLayers |
true/false デフォルト: true |
現在のレイヤー以外のレイヤーの詳細を表示する列を表示または非表示にするために使用します。 |
showLayersforCurrent |
|
「現在のコンテキスト」列で使用可能である必要があるレイヤーのリストを指定するために使用します。 このパラメータは、レイヤー名およびレイヤー値のリストならびに「現在のコンテキスト」列に表示する必要があるパターンを取ります。詳細は、例20-16を参照してください。 |
showLayersforAll |
|
「すべてのレイヤー」列で使用可能である必要があるレイヤーのリストを指定するために使用します。 このパラメータは、レイヤー名およびレイヤー値のリストならびに「すべてのレイヤー」列に表示する必要があるパターンを取ります。詳細は、例20-16を参照してください。 |
labelPrefixes |
|
「プロモート」ダイアログに表示する必要がある、空白で区切られたラベルの接頭辞のリストを指定するために使用します。指定された接頭辞を使用して作成されたラベルのみが「プロモート」ダイアログに表示されます。 デフォルトでは、すべてのラベルが表示されます。 |
maxDepth |
String |
カスタマイズ・マネージャでのタスク・フローの階層の深さを制限するために使用します。 デフォルト値は 最大ネストの10タスク・フローを表示できます。カスタマイズ・マネージャは、10より大きい値を指定しても、深さ10しか表示しません。 |
showDownload |
true/false デフォルト: true |
「ダウンロード」リンクを表示または非表示にするために使用します。 |
showUpload |
true/false デフォルト: true |
「アップロード」リンクを表示または非表示にするために使用します。 |
showDelete |
true/false デフォルト: true |
「削除」リンクを表示または非表示にするために使用します。 |
showPromote |
true/false デフォルト: true |
「プロモート」リンクを表示または非表示にするために使用します。 |
注意:
|
この項では、カスタマイズ・マネージャ・タスク・フローでパラメータの編集を可能にする手順を説明します。次のサブセクションが含まれます:
カスタマイズ・マネージャ・タスク・フローにパラメータを渡すには、アプリケーションのadf-config.xml
ファイルのカスタマイズ・マネージャのアドオン・パネル構成の一部としてparameters
属性を定義する必要があります。
タスク・フローでパラメータ編集を有効にするには:
アプリケーションのadf-config.xml
ファイルを開きます。これは、「アプリケーション・リソース」パネルの「ディスクリプタ」
の下のADF META-INF
フォルダにあります。
ファイルで次のネームスペースをadf-config
要素内に追加します。
xmlns:pe="http://xmlns.oracle.com/adf/pageeditor/config"
ネームスペースを付けて<pe:page-editor-config>
エントリを追加し、<pe:addon-panels>
を含めます。
<pe:addon-panels>
内で、例20-16に示すように、デフォルトのカスタマイズ・マネージャ・パネルの<pe:addon-panel>
エントリを追加し、parameters
属性をappUtilBean.customizationManagerParams
に設定することによって定義します。
例20-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; }
adf-config.xml
ファイルを保存します。
カスタマイズ・マネージャは、新しいパラメータ設定の基づいてユーザーにオプションを表示します。
要素を追加、削除または再配置し、既存の要素を上書きすることによってデフォルトのコンポーザのツールバーをカスタマイズできます。ツールバーの拡張性を有効にするために、コンポーザのツールバーの要素がセクションにグループ化されています。これらのセクションを使用してツールバーをカスタマイズできます。各セクションには特定の名前があり、図20-19に示すようにその中に1つ以上の要素が含まれています。
注意: 「保存」ボタンがツールバーに表示されるのは、アプリケーションがサンドボックスを使用するように構成されている場合のみです。詳細は、第22.2項「コンポーザのサンドボックスの使用」を参照してください。 「ヘルプ」アイコンがツールバーに表示されるのは、アプリケーションでヘルプ・プロバイダを構成した場合またはコンポーザ・パネルまたはダイアログからヘルプをフックアップした場合のみです。 コンポーザのツールバーは、ADF Faces |
表20-3ではツールバーの領域を説明します。
表20-3 ツールバーの領域
セクションまたは領域 | 説明 |
---|---|
|
ページ名付きのメッセージを含む領域。 |
|
ステータス・インジケータを含む領域。 |
|
ユーザーが「設計」ビューと「ソース」ビューを切り替えることができる「表示」メニューを含む領域。 |
|
コンポーザのアドオンを含む領域。アドオンは、この領域内ですべて順次表示されます。詳細は、第20.2項「コンポーザのアドオンの作成」を参照してください。 |
|
「ヘルプ」アイコンを含む領域。 |
|
「保存」ボタンおよび「閉じる」ボタンを含む領域。 |
|
2つのセクション間の広い空間。 |
|
セクション間の改行。改行の後のすべてのセクションは、ツールバーで新しい行になります。 |
ツールバー・セクションを使用して、次の方法でコンポーザのツールバーをカスタマイズできます。
組込み要素の再配置および非表示
カスタム要素を使用した新しいセクションの追加
デフォルトのセクションを変更してカスタム要素を表示
この項では、コンポーザのツールバーをカスタマイズする手順を説明します。次の項が含まれます:
Page Customizable
コンポーネントのtoolbarLayout
属性を使用して、表示するツールバーのセクションおよびその表示順を制御します。
アプリケーションのすべての編集可能ページのツールバーをカスタマイズするために、テンプレートを作成し、Page Customizable
コンポーネントをテンプレートに追加し、toolbarLayout
属性をPage Customizable
コンポーネントに対して指定できます。その後、このテンプレートに基づいてアプリケーションのすべてのページをカスタマイズできます。
toolbarLayout
の値を指定しないと、この属性は、コンポーザのツールバーのセクションのデフォルト・レイアウトであるmessage stretch statusindicator newline menu addonpanels stretch help button
に内部的に設定されます。
アプリケーション・ページのツールバーをカスタマイズするには:
JDeveloperのカスタマイズ可能なJSPXページを開き、「構造」ウィンドウでPage Customizable
コンポーネントを選択します。
プロパティ・インスペクタで、toolbarLayout
属性に空白区切り値を指定します。
表20-3のセクション名は、この属性の有効値です。
注意: ツールバーで1行ごとに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>
JSPXファイルを保存します。
実行時に、ツールバーに、指定した順序で指定したセクションが表示されます(図20-20)。
toolbarLayout
属性でファセットを作成し、ファセット名を指定することによって、カスタム・セクションを追加できます。新しいファセットにツールバーに表示する要素を移入します。次の例は、セクションの作成方法、具体的には、ユーザーが不具合をレポートできるポップアップを開く「バグをレポート」ボタンを追加する方法を説明します。
カスタム・セクションを追加するには:
ツールバーをカスタマイズするJPSXページを開きます。
ファセット
をPage Customizable
内に追加し、これにbugreport
という名前を付けます。
Command Toolbar Button
コンポーネントをファセット内に追加し、text
属性をReport a Bug
に設定します。
ボタンにイメージを追加するには、icon
属性を使用してイメージへのパスを指定します。
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>
ページを保存します。
実行時に、図20-21に示すように、コンポーザのツールバーに「バグをレポート」ボタンが表示されます。
「バグをレポート」ボタンをクリックすると、ユーザーが不具合をレポートできる「バグをファイル」ダイアログが表示されます。
デフォルトのツールバーのセクションと同じ名前のファセットを追加し、これにカスタム・コンテンツを移入することによって、デフォルトのツールバーのセクションにカスタム・コンテンツを表示できます。ファセットのコンテンツは、デフォルトのセクションのコンテンツを上書きします。たとえば、ユーザーへのカスタム・メッセージを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>
図20-22に、実行時にページに表示するコンポーザのツールバーを示します。
直接選択により、ユーザーはコンポーザの「ソース」ビューから「デザイン」ビューまで特定のカスタマイズ機能を拡張し、実行時にページ内から要素を変更できます。これにより、基礎となるアプリケーションにダメージを及ぼさないような安全な環境を作りながら、ビジネス・ユーザーの手でより多く制御することができます。
すべての直接選択機能は、「ソース」ビューで使用できますが、ビジネス・ユーザーには「ソース」ビューを安全かつ効率的に使用する知識や経験がありません。これらのユーザーは簡単にページを壊して、アプリケーション・ロジックを回避することができます。
直接選択を使用して、少数の選択したコンポーネントを選択可能および編集可能にすることができます。たとえば、フォーム内のフィールドの順序の変更、フォーム・フィールドのラベルの変更、表内の列名の変更またはフォームの特定のフィールドの非表示など。
直接選択機能の詳細は、第20.11.2項「実行時の処理」を参照してください。
この項では、アプリケーションで直接選択を有効化および構成する方法について説明します。
まず、コンポーザの「デザイン」ビューで直接選択を有効化する必要があります。<pe:page-editor-config>
タグ内のadf-config.xmlで、使用可能なビューを定義するために<pe:enable-design-views>
タグを追加します。使用可能な定数値は次のとおりです。
all
: すべてのビューを使用可能にして、ビュー間を切り替えるボタンを含むツールバーを表示します。
add-content
(デフォルト): レガシーな「デザイン」ビューを唯一の使用可能なビューにします。
select
: 「選択」ビューを唯一の使用可能なビューにします。
select add-content
: 使用可能なビューを「選択」ビューおよびレガシーな「デザイン」ビューのみに制限します(追加のビューは今後のリリースで追加されます)。ビュー間を切り替えるボタンを含むツールバーを表示します。
下の例に示すように、ELを使用して適切なビューを決定することもできます。
<pe:enable-design-views>#{testBean.designViews}</pe:enable-design-views>
注意: この設定は、アプリケーションのデフォルトを定義します。 |
デフォルトで、「デザイン」ビューを開いたり閉じたりするホット・キーはCtrl-Shift-Sです。ホット・キーを変更または無効にするには、<pe:page-editor-config>
タグ内の<pe:component-view-switch-key>
タグを追加します。例:
<pe:component-view-switch-key> <pe:enabled>true</pe:enabled> <pe:key-sequence>ctrl shift l</pe:key-sequence> </pe:component-view-switch-key>
pe-ext.xmlで、特定のコンポーネントの直接選択を有効化または無効化するために<selection-config>
タグを追加し、関連付けられた操作を定義します。コンポーネントを選択可能にするためには、このタグ内で操作を定義する必要があります。(操作が定義されておらず、選択がコンポーネントに対して有効になっていない場合、コンポーネントを選択すると空のフレームが表示されます。)
<selection-config>
タグ内で、<global-filter>
を使用して、また<selection-taglib-filter>
を使用してネームスペースおよびタグによって、直接選択をグローバルに構成できます。<selection>
タグには2つの必須属性があります。
view
: タグで構成されるビューを定義します。現在のリリースでは、唯一の許容値はdesign
です(直接選択はソース・ビューでは無効にできません)。
enabled
: 直接選択が指定されたビューで有効化されるかどうかを設定します。
利用可能な操作は、各特定コンポーネントの下の<operation>
タグ内で定義されています。次の要素は、操作の定義に使用されます。
name
: 実行される操作(標準またはカスタム)を定義します。操作名はプロパティ・パネルIDと同じです。標準操作のリストは、第B.3.2「デフォルトのプロパティ・パネルの項」を参照してください。カスタム操作の場合、名前はカスタム・パネルIDと同じです。カスタム操作の詳細は、第20.3項「カスタム・プロパティ・パネルの作成」を参照してください。
label
(オプション): ポップアップ・ウィンドウにタブ・ラベルを設定します。デフォルト・ラベルは操作名です。
filtered
: ポップアップ・ウィンドウの操作を含むようにfalse
に設定します。
注意: 最初に、少数のコンポーネントを選択し、次に機能がテストされ習得されるようにさらにコンポーネントを追加することをお薦めします。これは次の例に示すように、 |
<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>
さらにユーザー経験を簡単にするため、直接選択によりユーザーは、よリ少数のセットが表示されるようにタグの特定の属性をフィルタできます。詳細は、第20.8.1項「プロパティ・フィルタの定義方法」を参照してください。
.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>
フォーム・フィールドで式言語の使用を拒否して既存のELが上書きされないようにするには、第20.4.2項「式言語を保護する方法」を参照してください。
特定の要素の詳細は、付録B「コンポーザ・コンポーネントのプロパティおよびファイル」を参照してください。
直接選択が有効になっている場合、実行時のページの外側表示はエンド・ユーザーに対して同じです。適切な権限を持つユーザーがCtrl-Shift-Sをクリックする場合、ページに「デザイン」ビューが表示されます。
「デザイン」ビューには、コンポーザのツールバーが含まれています。複数のビューが有効化される場合、ページには、前述のイメージに示すように、ビュー間を切り替えるための「デザイン」および「選択」ボタンを持つ2番目のツールバーも含まれます。単一ビューのみが有効化される場合、これらのボタンは表示されません。
注意: 唯一の使用可能なビューとして'select'が定義されている場合、ユーザーには「デザイン」ビューからコンテンツを追加する方法はありません。唯一の使用可能なビューとして'add-content'が定義されている場合、ユーザー経験は、直接選択が有効化されていない場合と同じです。 |
コンポーネントのプロパティを編集するには、ユーザーは有効な要素を選択し、「コンポーネントの編集」または「親コンポーネントの編集」(適用可能な場合)をクリックします。
「コンポーネント・プロパティ」ポップアップ・ウィンドウにより、ユーザーはコンポーネントに対して定義されたプロパティを編集し、コンポーネントに対して構成された他の操作にアクセスできます。ユーザーが「親コンポーネントの編集」を選択した場合、「子の管理」タブがウィンドウに含まれています。ELが上書きが許可されないか、上書きから保護されない場合、下のイメージで示すように、「式ビルダー」および「オーバーライド」オプションが使用できません。このイメージには編集から保護されるフィールドの例も含まれています(「コンポーネントの表示」)。
複数の操作がポップアップ・ウィンドウのタブに表示されます。タブの順序はパネル登録で定義されています。操作が囲んでいるコンポーネントに対して登録されていない場合、その操作のタブは表示されません。パネル登録の詳細は、第20.3項「カスタム・プロパティ・パネルの作成」を参照してください。
この項では、コンポーザの拡張性機能を使用中に発生する可能性のある問題のトラブルシューティングに役立つ情報を提供します。
ロギングの構成の詳細は、第19章「コンポーザを使用したページの実行時編集の有効化」を参照してください。
問題
アドオンを作成したが、コンポーザのツールバーに表示されません。
解決方法
次の点を確認してください。
pe_ext.xml
ファイルがアプリケーションまたはJARファイルの/META-INF
フォルダにあり、クラス・パスで利用可能です。
パネルをpe_ext.xml
で登録する際に指定したタスク・フロー・バインディングIDが的確です。
<pe:addon-panel>
エントリがadf-config.xml
ファイルの<pe:page-editor-config>
セクションの下に存在します。
アドオンがJARファイルにある場合、JARファイルがADFライブラリとして作成されていることを確認してください。
アドオンの詳細は、第20.2項「コンポーザのアドオンの作成」を参照してください。
問題
カスタム・プロパティ・パネルを登録しました。ただし、そのプロパティを表示するコンポーネントを選択するときに、それが「コンポーネント・プロパティ」ダイアログに表示されません。
解決方法
次の点を確認してください。
pe_ext.xml
ファイルがアプリケーションまたはJARファイルの/META-INF
フォルダにあり、クラス・パスで利用可能です。
パネルをpe_ext.xml
で登録する際に指定したタスク・フロー・バインディングIDが的確です。
property-panel
の登録が正しく、パネルを表示するコンポーネントに対して指定されています。さらに、コンポーネントの完全修飾クラス名がcomponent
ノードを使用して正しく指定されています。
プロパティ・パネルの登録の重複によってパネル・エントリが上書きされていません。
レンダリングされた属性を使用するようにパネルが構成されている場合、値またはELがtrue
に評価されています。
アドオンがJARファイルにある場合、JARファイルがADFライブラリとして作成されていることを確認してください。
カスタム・プロパティ・パネルの詳細は、第20.3項「カスタム・プロパティ・パネルの作成」を参照してください。
問題
「コンポーネント・プロパティ」ダイアログでコンポーネントの一部のプロパティが表示されません。
解決方法
コンポーネント・プロパティがフィルタ処理されていないことおよび制限されていないことを確認します。詳細は、第20.8.1項「プロパティ・フィルタの定義方法」および第23.4項「属性レベルのセキュリティの適用」を参照してください。