Oracle® Fusion Middleware Oracle WebCenter Portal開発者ガイド 11g リリース1 (11.1.1.7.0) B72084-02 |
|
前 |
次 |
タスク・フローは、Oracle ADFの再利用可能な構成要素です。タスク・フローは、Oracle WebCenter Portalで標準提供されるほか、独自のタスク・フローを作成してFrameworkアプリケーション・ページに追加することもできます。カスタマイズ可能なページ(コンポーザ対応のページ)にタスク・フローを追加した場合、実行時にそれらのタスク・フローをパーソナライズ、カスタマイズおよび編集できます。タスク・フローを設計する際は、Oracle WebCenter Portalの出版物で説明されているルールに従う必要があります。それを怠った場合、タスク・フローをポータル・ページで使用する際に、過剰な余白、過剰なスクロール・バー、または大きいサイズのデータ・セットを表示するときの遅い応答、不安定な応答および予期できない応答などの問題が発生する可能性があります。
これらの問題の発生を防ぎ、ルック・アンド・フィール、レイアウト設計および対話に関する一貫したユーザー・エクスペリエンスを提供するために、このドキュメントで説明する手順に従い、次を実現します。
高パフォーマンスなコスト効率の良いタスク・フローの作成
タスク・フロー・パラメータおよびカスタマイズとパーソナライズのオプションを実装することによってアプリケーションでタスク・フローを有効利用
この付録の内容は、次のとおりです。
有効なジオメトリ管理を実施すると、ページでのタスク・フローのサイズ設定と配置を効率良く実行できます。タスク・フローが適切に設計されていない場合、応答時間が遅いページまたはコンポーネント間に不要なスクロール・バーや空白が大量に表示されるページが生成されます。たとえば、データをストレッチするコンテナ(Show Detail Frame
コンポーネントなど)をタスク・フローで使用していて、そのコンテナの内部に非常に少量のデータしか存在しない場合、タスク・フローではデータの下に大量の空白が表示されます。設計が不適切な場合、大量のデータが表に表示されるタスク・フローで、スクロールが遅くなったり、予期しない動作を示したりする可能性もあります。これらの問題を避けるために、大量のデータ・セットを表示する際は必ず、従来のページ区切りモデルを使用するフロー・タスク・フローを設計してください。
Frameworkアプリケーションの新しいタスク・フローを設計する際は、この項のガイドラインに従ってください。また、Frameworkアプリケーションの既存のタスク・フローを編集する際も、必ずこの項のガイドラインに従ってください。
タスク·フローで不要な空白を回避するためには、タスク·フロー·コンテンツがフローし、タスク·フロー·コンテナによってストレッチされていないことを確認する必要があります。ストレッチ・タスク・フローは、コンテナの高さにストレッチされたもので、フロー・タスク・フローは、ストレッチ・コンテナやタスク・フロー自身の固定された高さではなく、そのコンテンツによって決定されます。データ量の少ないフロー・タスク·フローは、図D-1に示されているように、データ量の多いフロー・タスク・フローよりも短くなります。
フロー・タスク・フローを設計するには、次のことを保証する必要があります。
タスク・フローの子コンポーネントの高さが固定されていない。
タスク・フロー・リージョンを囲むShow Detail Frame
コンポーネントの高さが(そのcontentStyle
属性を使用して)固定されていない。
次の2つの例は、タスク・フロー内でフロー・コンポーネントを使用する方法を示します。
タスク・フロー内にOracle ADF FacesのTable
コンポーネントを追加し、Table
のautoHeightRows
属性を特定の値に設定します。この属性を定義することによって、表の高さは、固定またはコンテナに合せてストレッチされる(ストレッチ動作)のではなく、コンテンツに従って調整されます(フロー動作)。autoHeightRows
属性を設定することによって、表のデータは次のように表示されます。
autoHeightRows
に値H
を設定した場合、表は最大H
行まで表示されます。
データ・ソースから返されるレコード数がH
未満の場合、表の高さはその数に対応したものになります。
レコードの数がH
を超える場合、表にはH
行のみ表示され、表示されていない行を表示するためのスクロールバーが表示されます。
autoHeightRows
属性が使用されない場合、表は、表示するデータ量に関係なく、デフォルトの固定高さで表示されます。
autoHeightRows
属性を固定値に設定するかわりに、指定した論理に基づいて属性が設定されるようにEL値を指定することもできます。タスク・フローのカスタマイズとパーソナライズを可能にし、この属性の値を指定するオプションをユーザーに提供することができます。パーソナライズ・オプションを使用して指定された値は、カスタマイズ・オプションを使用して指定された値をオーバーライドします。
例D-1に、recent-pages-task-flow-definition
という名前のタスク・フロー内のサンプルADF Faces table
コンポーネントの属性を示します。autoHeightRows
属性は、recentPagesBean
という名前のJava Beanを参照するEL式に設定されています。このBeanには、この属性をエンド・ユーザーによって(パーソナライズまたはカスタマイズとして)指定された値に設定する論理が含まれています。
例D-1 サンプルADF Faces TableのautoHeightRows属性
<af:table value="#{pageFlowScope.recentPagesBean.pages}"
var="row" rowBandingInterval="0" id="t1"
rowSelection="none" columnBandingInterval="0"
width="100%" inlineStyle="border:none;width:100%;"
columnStretching="last" horizontalGridVisible="true"
verticalGridVisible="false"
autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
contentDelivery="immediate"
fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}">
.
.
.
</af:table>
autoHeightRows
の値を指定するパーソナライズおよびカスタマイズのオプションを表示するサンプル・タスク・フローの詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
contentDelivery
属性をimmediate
に設定するなどの要件も含めたautoHeightRows
属性の詳細は、Oracle Fusion Middleware Oracle ADF Facesタグ・リファレンスの<af:table
のタグの説明を参照してください。
タスク・フローにPanel Group Layout
コンポーネントを追加し、そのlayout
属性をscroll
に設定します。次に、Panel Group Layout
内にIterator
を追加します。コンテンツは、Iterator
内に追加します。Iterator
のコンテンツは、Panel Group Layout
内に表示されます。
Panel Group Layout
の高さは、Iterator
のコンテンツの量に応じて決まるので、Panel Group Layout
のinlineStyle
属性でmin-height
とmax-height
を使用してコンポーネントの最小高さと最大高さを指定します。
タスク・フローで大量のデータ・セットをスクロールする際に応答が遅くなったり不安定になったりするのを避けるために、データ・ソースから一度にフェッチするレコード数を制限する必要があります。たとえば、タスク・フローでADF faces Table
コンポーネントを使用している場合、表に表示されるレコード数を制限します。Table
のfetchSize
属性を使用して、1回の問合せでデータ・ソースからフェッチするレコード数を指定します。フェッチ・サイズとしてN
を指定した場合、データ・ソースからN
件のレコードのみがクライアントに送信されます。
fetchSize
属性とautoHeightRows
属性の組合せにより、表に表示される行数が制御されます。これらの属性には次の関係があります。
fetchSize
とautoHeightRows
が等しい場合、表にはすべてのレコードが表示されます。
fetchSize
がautoHeightRows
より小さい場合、表にはfetchSize
の値までしか表示されません。
fetchSize
がautoHeightRows
より大きい場合、autoHeightRows
の値と同じ数のレコードのみ表示するか、またはページ区切りコントロールを使用して残りのレコードを表示するかを決定できます。たとえば、タスク・フローの一番下に「詳細」リンクを追加するか、「前へ」リンクまたは「次へ」リンクを使用してページ区切りを使用することができます。詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
図D-2に、autoHeightRows
とfetchSize
の値が等しく5の場合と10の場合の2つのタスク・フローの違いを示します。タスク・フローは表示レコード数まで表示されます。
fetchSize
属性を固定値に設定するかわりに、指定した論理に基づいて属性が設定されるようにEL値を指定することもできます。タスク・フローのカスタマイズとパーソナライズを可能にし、この属性の値を指定するオプションをユーザーに提供することができます。パーソナライズ・オプションを使用して指定された値は、カスタマイズ・オプションを使用して指定された値をオーバーライドします。
次の例に、recent-pages-task-flow-definition
という名前のタスク・フロー内のサンプルADF Faces Table
コンポーネントの属性を示します。fetchSize
属性は、recentPagesBean
という名前のJava Beanを参照するEL式に設定されています。このBeanには、この属性をエンド・ユーザーによって指定されたカスタマイズ値に設定する論理が含まれています。
<af:table value="#{pageFlowScope.recentPagesBean.pages}"
var="row" rowBandingInterval="0" id="t1"
rowSelection="none" columnBandingInterval="0"
width="100%" inlineStyle="border:none;width:100%;"
columnStretching="last" horizontalGridVisible="true"
verticalGridVisible="false"
autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}"
contentDelivery="immediate"
fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}">
.
.
.
</af:table>
fetchSize
の値を指定するカスタマイズのオプションを表示するサンプル・タスク・フローの詳細は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
fetchSize
属性の詳細は、Oracle Fusion Middleware Oracle ADF Facesタグ・リファレンスの<af:table
のタグの説明を参照してください。
第D.1.1項「ガイドライン1: フロー・タスク・フローの作成」で説明する1番目のガイドラインに従うことによって、タスク・フローがコンテンツの高さに制限されることを保証できます。
タスク・フローが、レコードが0件のときに完全に閉じたり、レコードが1-2件しかなくて短くなりすぎたりしないように、コンテンツの最小高さを指定します。
たとえば、タスク・フローの表のautoHeightRows
の値が指定されている場合、表のinlineStyle
属性を使用してmin-height
値を指定できます。
図D-3に、2行しかなくても適切な高さで表示されるタスク・フローを示します。
タスク・フローで10件のレコードを表示していて、データ・ソースに100件のレコードが存在する場合、タスク・フロー内のデータの特徴に応じて次のいずれかを実行するようにタスク・フローを設計できます。
10件のレコードのみ表示
たとえば、人気のあるディスカッション・トピック・タスク・フローでは、人気のあるトピックの上位10件が表示されれば十分であり、それ以外はたとえ11番目に人気のあるトピックでもユーザーに見せる必要はないと判断する場合は、このオプションを使用できます。
もっと多くのレコードを表示する機能を持つビューを開く「詳細」リンクをタスク・フローの最下行に表示
たとえば、「スペース」ページのピープル・コネクション・タスク・フローには、最下行に「詳細」リンクが表示されます。
「前へ」リンクと「次へ」リンクのページ区切りコントロールの表示
たとえば、監視されたディスカッション・トピック・タスク・フローでは、ユーザーは通常監視しているすべてのトピックを参照するので、ページ区切りコントロールを表示できます。ページ区切りは、タスク・フローのデータが本質的に重要度でランク付けされるものでも様々な方法でソートできるものでもなく、データ・セットの任意のレコードにアクセスできることが重要視される場合に、一般的な選択肢です。ページ区切りコントロールは、コンテンツの性質に応じてコンテンツの上部または下部に配置できます。
図D-4は、fetchSize
が5の表を持つ「監視トピック」タスク・フローおよび「人気のトピック」タスク・フローを示しています。両方ともデータ・ソースに5件以上のレコードがあります。「監視トピック」タスク·フローは、下部にページ区切りのある5件のレコードを表示しますが、「人気のトピック」タスク·フローは、他のレコードを表示するUIオプションがない5件のみのレコードを表示します。
ページ区切りの詳細
ページ区切りコントロールを作成する場合、次のようにすることをお薦めします。
ページ区切りメッセージは1 to N of M [prev][next]
という形式で追加します。
ページ間をナビゲートする際に「前へ」リンクと「次へ」リンクが移動しないように、ページ区切り要素の位置を右揃えにします。
「前へ」オプションまたは「次へ」オプションは、必要ない場合は必ずグレー表示されるようにします。
ページ区切りコントロールの使用例は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
次のパラメータを使用して、ページ区切りコントロールをカスタマイズできます。
「前へ」リンクと「次へ」リンクの位置
「前へ」リンクと「次へ」リンクのラベル(NewerとOlderなど)
「前へ」リンクと「次へ」リンクで使用するアイコン
「全ページ中の何ページから何ページまで」を表すために使用する単語または記号(1-5 of 100
など)
ランダム・アクセスを許可するオプション(Prev 1 2 3 ... Next Last
など)
タスク・フローを作成する際、パラメータを作成して、タスク・フローをカスタマイズおよびパーソナライズできるオプションをユーザーに提供できます。特権ユーザーがコンポーザですべてのユーザーのタスク・フローをカスタマイズし(カスタマイズ)、タスク・フローのプロパティとパラメータを編集できるようにすることが可能です。すべてのユーザーがページを表示し、ページの表示をカスタマイズ(パーソナライズ)できるようにすることが可能です。この項では、タスク・フロー・パラメータおよびカスタマイズとパーソナライズのオプションを実装するためのガイドラインについて説明します。
表D-1に、ユーザーが使用できる様々なタスク・フロー編集オプションの概要を示します。
表D-1 タスク・フローの外観と動作を定義するために使用するオプション
オプション | 説明 | 使用する状況 | 表示できるユーザー |
---|---|---|---|
パラメータ |
タスク・フローのプログラミングまたはそのコンテキストの設定に使用する観念的な少量のスカラー値。各パラメータにはわかりやすい表示名と説明(指定できる値と例が含まれる必要があります)を指定する必要があります。 |
タスク・フローの複数のインスタンスを追加できるように、市区町村コードまたはPINコードなどのコンテキストに使用します。各インスタンスは、異なる情報を表示するか、またはページからプログラムまたはURLを通じて受け取った値に応じて情報を表示するようにプログラミングされます。 Spacesでは、スペース名などのコンテキストのパラメータを使用できます。 優先順位: 3 この値はタスク・フローの組込み値よりも優先されます。 |
パワー・ユーザー(または編集権限またはカスタマイズ権限を持つユーザー)は、ページの編集中に、コンポーザの「コンポーネント・プロパティ」ダイアログでパラメータを表示できます。 Spacesでは、モデレータは、タスク・フロー・パラメータを表示および編集できます。 WebCenter Portalサービス・タスク・フローがOracle Portalでポートレットとして公開されている場合、ページ設計者はポートレットを設定する際にこれらのパラメータを表示できます。 |
カスタマイズ/プリファレンス |
これら2つは同義です。カスタマイズは、通常、ビジネス·ユーザーがタスク·フローに加えた変更とみなされます。これらの変更は、ページのすべてのビューアに利用可能であり、タスク·フローで定義されたオプションの値の指定に使用されます。たとえば、ユーザーはドキュメントの作成者名や改定日を表示するかどうかを決めることができます。 プリファレンスは、タスクのコンテンツの定義と呼ばれます。たとえば、「ドキュメント・ビューア」タスク・フローの問合せ定義やOmniPortletの問合せがあります。 |
これらを使用するのは、ユーザーがタスク・フローの動作を定義できるようにするためのユーザー・インタフェースをタスク・フローに用意する必要がある場合です。すなわち、値リストまたはイメージやラジオ・ボタンなどの特定のUIコンポーネントを使用するとユーザーが作業しやすい場合や、複数ステップのウィザード・スタイルのインタフェースでタスク・フローを設定する場合です。 パラメータは単なるスカラー値であり、説明以外に何もないので、パラメータを使用する場合はそのような作業しやすくするためのサポートは得られません。 優先順位: 2 同一パラメータ値(スペース名など)が存在する場合、その値よりもカスタマイズが優先されます。 |
コンポーザでページを編集するビジネス・ユーザー(または編集権限またはカスタマイズ権限を持つユーザー)は、カスタマイズまたはプリファレンスのオプションを表示できます。 通常は、カスタマイズまたはプリファレンスのオプションは、編集モードでタスク・フローの周りに表示されるクロムで使用できます。ただし、編集権限またはカスタマイズ権限を持つユーザーは、ページ表示モードでもクロムにこれらのオプションが表示されます。 WebCenter Portalタスク・フローがOracle Portalでポートレットとして公開されている場合、ページ設計者はポートレットを設定する際にこれらを「デフォルトの編集」のオプションとして表示できます。 |
パーソナライズ |
カスタマイズとプリファレンスのオプションのサブセット。カスタマイズ・オプションではないパーソナライズ・オプションを使用することはできません。 |
これらを使用して、ページを表示するすべてのユーザーがタスク・フローの視覚的要素やタスク・フローに表示するデータ量を調節することを許可します。たとえば、表示するアイテム数を設定できます。 優先順位: 1 同一カスタマイズ値(アイテム数など)が存在する場合、その値よりもパーソナライズが優先されます。 |
表示権限を持つすべてのユーザーがこれらのオプションを表示できます。 パーソナライズ・オプションは、タスク・フローの周りのクロムで使用できます。WebCenter Portalタスク・フローがOracle Portalでポートレットとして公開されている場合、エンド・ユーザーはパーソナライズ・オプションを使用して、同じ視覚的要素を調整できます。 |
暗黙的パーソナライズ |
セッション間でエンド・ユーザーに対して保持されるオプション。暗黙的パーソナライズ・オプションは、タスク・フローの周りのクロムには表示されませんが、タスク・フローの本体に対して直接実行できるアクションです。たとえば、ソートや列のサイズ変更は、暗黙的パーソナライズ・オプションです。 |
これらのオプションは、頻繁に変更するオプションにのみ、慎重に使用してください。列のサイズ変更やソートなどのオプションは、Oracle ADFから無償で使用できます。 |
ページに対する表示権限を持つすべてのエンド・ユーザーがパーソナライズを実行できます。 |
アプリケーションのパフォーマンスを高めるには、タスク・フローでパラメータおよびカスタマイズとパーソナライズのオプションを実装する際に、この項のガイドラインに従ってください。
(JDeveloperでの)デザインタイム中は、タスク・フロー定義XMLファイルでパラメータを定義することによって、パラメータを作成できます。実行時は、編集権限またはカスタマイズ権限を持つユーザーが、コンポーザの「コンポーネント・プロパティ」ダイアログでタスク・フロー・パラメータを編集できます。適切なユーザー・エクスペリエンスを提供するには、パラメータを作成する際に次のガイドラインに準拠する必要があります。
わかりやすい表示名を指定します。
パラメータごとに説明、例および指定できる値を提供します。
次の例に、タスク・フロー定義ファイルでlayoutStyle
という名前のパラメータを定義するコードを示します。
<input-parameter-definition> <name>layoutStyle</name> <description> Used to control whether the documents must display as a list, with icons, or with document details. Allowed values are list, icon, and detail.</description> <display-name>Layout Style</display-name> </input-parameter-definition>
編集権限またはカスタマイズ権限を持つユーザーは、タスク・フローの周りのクロムでカスタマイズ・オプションにアクセスできます。
タスク・フローにカスタマイズを実装する際、次のガイドラインに準拠する必要があります。
カスタマイズ・オプションはタスク・フローのパラメータのサブセットである必要があります。
タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューを別のダイアログで開きます。たとえば、ダイアログでadvancedEditPopupView
という名前のビューを起動する制御フロー・ルールは次のようになります。
<control-flow-case> <from-outcome>dialog:advancedEditPopup</from-outcome> <to-activity-id>advancedEditPopupView</to-activity-id> </control-flow-case>
新しいタスク・フローでは、このガイドラインに従う必要があります。
タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューのインラインに移行します。たとえば、同じ画面内でadvancedEditView
という名前のビューを起動する制御フロー・ルールは次のようになります。
<control-flow-case> <from-outcome>advancedEdit</from-outcome> <to-activity-id>advancedEditView</to-activity-id> </control-flow-case>
この方法でもタスク・フローを実装できますが、結果を公開してダイアログでビューを開くことをお薦めします。
アプリケーションによって設定されているMDSレベルにカスタマイズが保存されることを確認します。タスク・フロー・パラメータはタスク・フロー定義自体に格納されますが、カスタマイズはそれとは異なり、メタデータ記憶域(MDS)に保存されます。タスク・フローのカスタマイズを保存するMDSレイヤーを明示的に指定しない場合、カスタマイズ・メタデータとそれを使用するアプリケーション・メタデータが異なるレイヤーに格納される可能性があります。
カスタマイズがアプリケーション・メタデータと同じレイヤーに保存されることを保証するには、タスク・フローのプリファレンス・ファイルにアプリケーションのMDSセッションのクローンを作成し、カスタマイズを構成する際はそれを参照するようにする必要があります。この実装例は、第D.3項「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
ページを表示するすべてのユーザーは、ページ表示モードでタスク・フローの周りのクロムでパーソナライズ・オプションにアクセスできます。
タスク・フローにパーソナライズを実装する際、次のガイドラインに準拠する必要があります。
パーソナライズ・オプションが、タスク・フローに定義されているカスタマイズ・オプションのサブセットであることを保証します。
タスク・フローの重要な一面がドキュメント、ユーザー、リクエストなどのオブジェクトを表示することである場合、ユーザーが表示するオブジェクトの最大数を設定するためのパーソナライズ・オプションを追加する必要があります。
タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューを別のダイアログで開きます。たとえば、ダイアログでsimpleEditPopupView
という名前のビューを起動する制御フロー・ルールは次のようになります。
<control-flow-case> <from-outcome>dialog:simpleEditPopup</from-outcome> <to-activity-id>simpleEditPopupView</to-activity-id> </control-flow-case>
新しいタスク・フローでは、このガイドラインに従う必要があります。
タスク・フロー内にビュー・フラグメントを実装し、結果を公開してこのビューのインラインに移行します。たとえば、同じ画面内でsimpleEditView
という名前のビューを起動する制御フロー・ルールは次のようになります。
<control-flow-case> <from-outcome>simpleEdit</from-outcome> <to-activity-id>simpleEditView</to-activity-id> </control-flow-case>
この方法でもタスク・フローを実装できますが、このビューをダイアログとして開くように移行することをお薦めします。
アプリケーションによって設定されているMDSレベルにパーソナライズが保存されることを確認します。タスク・フロー・パラメータはタスク・フロー定義自体に格納されますが、パーソナライズはそれとは異なり、MDSに保存されます。パーソナライズを保存するMDSレイヤーを明示的に指定しない場合、パーソナライズ・メタデータとアプリケーション・メタデータが異なるレイヤーに格納される可能性があります。
パーソナライズがアプリケーション・メタデータと同じレイヤーに保存されることを保証するには、タスク・フローのプリファレンス・ファイルにアプリケーションのMDSセッションのクローンを作成し、パーソナライズを構成する際はそれを参照するようにする必要があります。この実装例は、「ガイドラインに従って作成したタスク・フローを使用するFrameworkアプリケーションの例」を参照してください。
ユーザーはタスク・フロー自体を使用する際、表の列のサイズ変更、ソートなどを通じて、暗黙的パーソナライズを実行します。この場合、パーソナライズ・オプションはダイアログからは起動されないので、ユーザーが実際はページをパーソナライズしていることに気付かない場合もあります。
暗黙的パーソナライズを実装する際、次のガイドラインに準拠してください。
タスク・フローを暗黙的パーソナライズ属性でオーバーロードさせないでください。重要で頻繁に使用するいくつかの属性を選択して暗黙的として公開します。使用頻度の少ない属性や複雑な属性は、明示的パーソナライズで処理できます。
ダイアログが起動されるような暗黙的パーソナライズは実装しないでください。暗黙的パーソナライズは、タスク・フロー自体の本体で実行される必要があります。
このドキュメントのガイドとして、Oracle WebCenter Portal: Frameworkを使用するサンプル・アプリケーションが開発されています。RecentPages
という名前のこのサンプル・アプリケーションは、このドキュメントのガイドラインに準拠してほぼ完璧なタスク・フローを作成できることを示す例として使用します。RecentPages
アプリケーションに含まれるカスタマイズ可能なページWelcome.jspx
には、必要なすべてのガイドラインに従って作成されたrecent-pages-taskflow-definition
という名前のタスク・フローが含まれています。
この項では、タスク・フローの実装方法の概要のみ説明します。タスク・フローとコンポーザの使用に関する詳細は、次の各ガイドを参照してください。
タスク・フローの作成の詳細は、『Oracle Fusion Middleware Oracle Application Development Framework Fusion開発者ガイド』を参照してください。
コンポーザでのタスク・フローの編集、カスタマイズおよびパーソナライズの詳細は、『Oracle Fusion Middleware Oracle WebCenter Portal: Spacesユーザーズ・ガイド』を参照してください。
RecentPages
サンプル・アプリケーションは、次に示すOTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。
RecentPages
アプリケーションには、次のプロジェクトが含まれます。
モデル・プロジェクト
ポータル・プロジェクトRecentPagesTaskFlow
と、そこに含まれるrecent-pages-task-flow-definition
タスク・フロー
別のポータル・プロジェクトWebPages
と、そこに含まれ、前述のタスク・フローを使用するJSPXページ
このプロジェクトには、ガイドラインに従って作成されたタスク・フローが含まれます。このプロジェクトの重要なファイルは、次のとおりです。
recent-pages-task-flow-definition.xml
ファイル
mainView.jsff
フラグメント
simpleEditPopupView.jspx
ページ
advancedEditPopupView.jspx
ページ
recentPagesBean
Java Bean
Preference
Java Bean
これは、mainView
、simpleEditPopupView
およびadvancedEditPopupView
の3つのビューを含むOracle ADFタスク・フロー定義です。このタスク・フローは、mainView
にアプリケーションで最近作成されたページのリストが表示され、simpleEditPopupView
にすべてのユーザー向けにパーソナライズ・オプションが表示され、advancedEditPopupView
に編集権限またはカスタマイズ権限を持つユーザー向けにカスタマイズ・オプションが表示されるように設計されています。
次の表では、recent-pages-task-flow-definition.xml
のコードを分割して、スニペットごとに説明します。
mainView
からsimpleEditPopupView
とadvancedEditPopupView
に渡される結果はそれぞれ、dialog:simpleEditPopupview
とdialog:advancedEditPopupView
と呼ばれます。これは、これらのビューがインラインではなく別のダイアログに表示されることを保証するためです。さらに、このタスク・フローは、mainView
で、「リフレッシュ」で最新の結果を表示したり、「前へ」および「次へ」で該当する結果を表示したりできます。simpleEditPopupView
ビューとadvancedEditPopupView
ビューでは、「保存」で結果を保存したり、「取消」で結果の表示を取り消したりできます。
次の表では、recent-pages-task-flow-definition.xml
ファイルのコードの重要なセクションについて説明します。
表D-2 タスク・フロー定義ファイルのコードの様々なセクション
コード | 説明 |
---|---|
<default-activity>mainView</default-activity> |
タスク・フローのデフォルト・ビューとして |
<managed-bean> <managed-bean-name>recentPagesBean</managed-bean-name> <managed-bean-class>view.RecentPangesBean</managed-bean-class> <managed-bean-scope>pageFlow</managed-bean-scope> </managed-bean> |
タスク・フロー定義に関連付けられている |
<view id="mainView"> <page>/mainView.jsff</page> </view> <view id="simpleEditPopupView"> <page>/simpleEditPopupView.jspx</page> </view> <view id="advancedEditPopupView"> <page>/advancedEditPopupView.jspx</page> </view> |
タスク・フローの各ビューをページまたはページ・フラグメントにマップします。たとえば、 |
<control-flow-rule> <from-activity-id>mainView</from-activity-id> <control-flow-case> <from-outcome>refresh</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>dialog:simpleEditPoup</from-outcome> <to-activity-id>simpleEditPopupView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>next</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>previous</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>dialog:advancedEditPopup</from-outcome> <to-activity-id>advancedEditPopupView</to-activity-id> </control-flow-case> </control-flow-rule> |
|
<control-flow-rule> <from-activity-id>simpleEditPopupView</from-activity-id> <control-flow-case> <from-outcome>save</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>cancel</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> </control-flow-rule> |
|
<control-flow-rule> <from-activity-id>advancedEditPopupView</from-activity-id> <control-flow-case> <from-outcome>save</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> <control-flow-case> <from-outcome>cancel</from-outcome> <to-activity-id>mainView</to-activity-id> </control-flow-case> </control-flow-rule> |
|
図D-5に、アプリケーションで最近作成されたページのリストを表示します。実行時は、このリストは次のように表示されます。
このビュー・フラグメントの設計機能は、次のとおりです。
autoHeightRows
属性が表に定義され、表に表示されるアイテムの数を制御します。タスク・フローは表示されるアイテムの高さで制限されます。
fetchSize
属性が定義され、データ・ソースからフェッチして表に表示するアイテムの数を制御します。
Items 1-4 of 25
という形式でメッセージを表示するページ区切りコントロールが、「前へ」アイコンと「次へ」アイコンとともに追加されています。
表D-3では、mainView.jsff
フラグメントのコードの重要なセクションについて説明します。
表D-3 mainViewフラグメント・コード
コード | 説明 |
---|---|
<af:panelGroupLayout id="pgl1" layout="vertical"> <af:outputText value="Shows recent pages in the application" id="ot1"/> |
単一の最上位レベル・コンポーネント: |
<af:table value="#{pageFlowScope.recentPagesBean.pages}" var="row" rowBandingInterval="0" id="t1" rowSelection="none" columnBandingInterval="0" width="100%" inlineStyle="border:none;width:100%;" columnStretching="last" horizontalGridVisible="true" verticalGridVisible="false" autoHeightRows="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}" contentDelivery="immediate" fetchSize="#{pageFlowScope.recentPagesBean.number_of_items_to_query}"> |
次の表の属性があります。
|
<af:column sortable="false" headerText="#{null}" align="start" id="c1"> <af:panelGroupLayout id="pgl11" styleClass="nowrap" inlineStyle="padding-top:2px; font-weight:bold;"> <af:outputText value="#{row.title}" id="ot4"/> <af:goLink destination="/faces#{row.contentMRef}" text=">>" targetFrame="_blank" id="gl1"/> </af:panelGroupLayout> <af:panelGroupLayout id="pgl10" styleClass="AFFieldTextDisabled nowrap" inlineStyle="padding-top:2px"> <af:outputText value="Created on " id="ot7"/> <af:outputText value="#{row.createDate}" id="ot8"/> <af:outputText value=" by #{row.createdBy}" id="ot9"/> </af:panelGroupLayout> </af:column> |
表に、アプリケーションのページのリストを各ページの作成日および作成者とともに表示する1つの列があります。 表の列をソートする暗黙的パーソナライズ機能は無効になっています。 |
<af:panelGroupLayout id="pgl2" halign="end" layout="vertical" inlineStyle="margin:1px" rendered="#{pageFlowScope.recentPagesBean.showPageControl}"> <af:panelGroupLayout id="pgl3"> <af:outputText value="#{pageFlowScope.recentPagesBean.footerText}" id="ot2"/> <af:commandLink id="cl1" actionListener="#{pageFlowScope.recentPagesBean.previous}" disabled="#{not pageFlowScope.recentPagesBean.showPrevious}" action="previous"> <af:image source="#{pageFlowScope.recentPagesBean.showPrevious ? '/adf/webcenter/shuttleleft_ena.png' : '/adf/webcenter/shuttleleft_dis.png'}" id="i1" shortDesc="previous"/> </af:commandLink> <af:commandLink id="cl2" actionListener="#{pageFlowScope.recentPagesBean.next}" disabled="#{not pageFlowScope.recentPagesBean.showNext}" action="next"> <af:image source="#{pageFlowScope.recentPagesBean.showNext ? '/adf/webcenter/shuttleright_ena.png' : '/adf/webcenter/shuttleright_dis.png'}" id="i2" shortDesc="next"/> </af:commandLink> </af:panelGroupLayout> </af:panelGroupLayout> |
表に表示されているレコード以外のレコードを表示するページ区切りコントロール。
|
図D-6に、タスク・フローで表示するアイテムの数を選択するオプションを表示します。ページを表示するすべてのユーザーが、このオプションを使用してタスク・フローをパーソナライズできます。ユーザーが指定した値は、このページの、そのユーザーが表示しているビューにのみ適用されます。
次の表では、simpleEditPopupView.jspx
ページのコードの重要なセクションについて説明します。
表D-4 パーソナライズ・ページのコード
コード | 説明 |
---|---|
<af:panelStretchLayout id="psl1"> <f:facet name="center"> <af:group id="group1"> <af:panelFormLayout id="pfl1"> <af:inputText label="Number of Items to show at a time" id="it1" value="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}" columns="3"/> </af:panelFormLayout> <af:panelGroupLayout id="pgl2" layout="horizontal" halign="right" inlineStyle="width:500px;"> <af:commandButton text="Save" id="cb1" action="#{pageFlowScope.recentPagesBean.saveSettings}"/> <af:commandButton text="Cancel" id="cb2" action="cancel" actionListener="#{pageFlowScope.recentPagesBean.cancel}"/> </af:panelGroupLayout> </af:group> </f:facet> </af:panelStretchLayout> |
単一の最上位レベル・コンポーネント
|
このページでは、編集権限またはカスタマイズ権限を持つユーザーに対して、カスタマイズ・オプションが表示されます。実行時は、このページが別のダイアログで開かれて、表示するアイテムの数を選択するオプション、問い合せるアイテムの数を選択するオプション、およびページ区切りコントロールの表示または非表示を選択するチェック・ボックスが表示されます。
次の表では、advancedPopupView.jspx
ページのコードの重要なセクションについて説明します。
表D-5 カスタマイズ・ページのコード
コード | 説明 |
---|---|
<af:panelStretchLayout id="psl1"> <f:facet name="center"> <af:group id="group1"> <af:panelFormLayout id="pfl1"> <af:inputText label="Number of Items to show at a time" id="it1" value="#{pageFlowScope.recentPagesBean.number_of_items_to_show_at_a_time}" columns="3"/> <af:inputText label="Number of Items to Query" id="it2" value="#{pageFlowScope.recentPagesBean.number_of_items_to_query}" columns="3"/> <af:selectBooleanCheckbox label="Show Page Control" id="sbc1" value="#{pageFlowScope.recentPagesBean.showPageControl}"/> </af:panelFormLayout> <af:panelGroupLayout id="pgl2" layout="horizontal" halign="right" inlineStyle="width:500px;"> <af:commandButton text="Save" id="cb1" action="#{pageFlowScope.recentPagesBean.saveSettings}"/> <af:commandButton text="Cancel" id="cb2" action="cancel" actionListener="#{pageFlowScope.recentPagesBean.cancel}"/> </af:panelGroupLayout> </af:group> </f:facet> </af:panelStretchLayout> |
単一の最上位レベル・コンポーネント
|
このJava Beanには、次の論理が含まれます。
ユーザー入力に基づいて表に特定の数のアイテムを表示します。
simpleEditPopupView
ページとadvancedEditPopupView
ページからトリガーされるSaveイベントとCancelイベントを処理します。
ページ区切りが実装されている場合に「前へ」アイコンと「次へ」アイコンをレンダリングします。
ページの合計数を取得してからページ区切りメッセージを表示します。
カスタマイズとパーソナライズを保存する必要がある場所が定義されているPreference
Beanを参照します。
このBeanのコードは、RecentPages
アプリケーションにあります。これは、OTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。
次の表では、recentPagesBean.java
ファイルのコードの重要なセクションについて説明します。
表D-6 recentPagesBean Java Beanのコード
コード | 説明 |
---|---|
private String _getPreferenceFileName() { String taskflowId = ControllerContextFwk.getInstanceFwk().getCurrentViewPortFwk().getClientId(); if (taskflowId == null) { taskflowId = ControllerContextFwk.getInstanceFwk().getCurrentViewPortFwk().getParentViewPort().getClientId(); } String preferenceFileName = PREFERENCE_BASE + taskflowId.replace(".", "_") + ".xml"; return preferenceFileName; } private static PageServiceBean getPageServiceBean() { String beanName = "pageServiceBean"; Object bean = null; FacesContext ftx = FacesContext.getCurrentInstance(); bean = ftx.getExternalContext().getRequestMap().get(beanName); if (bean == null) { ELContext elContext = ftx.getELContext(); ExpressionFactory exFactory = ftx.getApplication().getExpressionFactory(); ValueExpression expr = exFactory.createValueExpression(elContext, "#{" + beanName + "}",PageServiceBean.class); bean = expr.getValue(elContext); } return (PageServiceBean) bean; } |
タスク・フローを特定し、現在実行中のタスク・フローのインスタンスレベルのプリファレンスを取得する論理。 |
public String saveSettings() throws Exception { if (number_of_items_to_query != null && !number_of_items_to_query.isEmpty()) { Preference.setNumberOfItemsToQuery(_getPreferenceFileName(), Integer.parseInt(number_of_items_to_query)); } if (this.number_of_items_to_show_at_a_time != null && !this.number_of_items_to_show_at_a_time.isEmpty()) { Preference.setNumberOfItemsToShow(_getPreferenceFileName(), Integer.parseInt(number_of_items_to_show_at_a_time)); } if (_showPageControl != null) { Preference.setShowPageControl(_getPreferenceFileName(),_showPageControl); } AdfFacesContext.getCurrentInstance().returnFromDialog(null, null); return "save"; } |
パーソナライズまたはカスタマイズを実行するダイアログの「保存」ボタンの動作を定義する論理。設定は、タスク・フロー・プリファレンス・ファイルに保存されます。 |
public void setNumber_of_items_to_show_at_a_time(String number_of_items_to_show_at_a_time) { this.number_of_items_to_show_at_a_time = number_of_items_to_show_at_a_time; } public String getNumber_of_items_to_show_at_a_time() { String query = Integer.toString(Preference.getNumberOfItemsToShow(_getPreferenceFileName())); return query; } |
パーソナライズまたはカスタマイズを実行するダイアログの |
public void setNumber_of_items_to_query(String number_of_items_to_query) { this.number_of_items_to_query = number_of_items_to_query; } public String getNumber_of_items_to_query() { String query = Integer.toString(Preference.getNumberOfItemsToQuery(_getPreferenceFileName())); return query; } |
カスタマイズを実行するダイアログの |
public boolean getShowPageControl() { boolean showPageControl = Preference.getShowPageControl(_getPreferenceFileName()); return showPageControl; } public void setShowPageControl(boolean showPageControl) { _showPageControl = showPageControl; } |
カスタマイズを実行するダイアログの |
public List<PageDef> getPages() { PageServiceBean psb = getPageServiceBean(); List<PageDef> pages = psb.getPages(); int start = getStart(); int end = getEnd(); if (start < 0 || start > pages.size()) { start = 0; } if (end < 0 || end > pages.size()) { end = pages.size(); } List<PageDef> tempPages = pages.subList(start, end); return tempPages; } public int getEnd() { String items_to_query = this.getNumber_of_items_to_query(); int offset = Integer.parseInt(items_to_query); int end = getStart() + offset; if (end > this.getTableSize()) { end = getTableSize(); } return end; } |
表の現在のビューに表示するページのリストを取得する論理。 |
public int getTableSize() { int tableSize = -1; try { PageServiceBean psb = getPageServiceBean(); List<PageDef> pages = psb.getPages(); tableSize = pages.size(); } catch (Exception e) { System.out.println(e.toString()); } return tableSize; } |
表のサイズを取得したレコード数に設定する論理。 |
public int getStart() { String items_to_query = this.getNumber_of_items_to_query(); int offset = Integer.parseInt(items_to_query); return (getPageNumber() - 1) * offset; } public int getPageNumber() { Object page_num = RequestContext.getCurrentInstance().getPageFlowScope().get("page_num"); int local_page_num = 1; if (page_num == null || (Integer) page_num <= 0) { local_page_num = 1; } else { local_page_num = (Integer) page_num; } return local_page_num; } |
|
public void cancel(ActionEvent actionEvent) { AdfFacesContext.getCurrentInstance().returnFromDialog(null, null); } |
パーソナライズまたはカスタマイズを実行するダイアログの「取消」ボタンの動作を定義する論理。 |
public void previous(ActionEvent actionEvent) { int page_num = getPageNumber(); page_num--; if (page_num <= 0) { page_num = 1; } RequestContext.getCurrentInstance().getPageFlowScope().put("page_num", page_num); } |
タスク・フローのページ区切りコントロールの「前へ」アクションの動作を定義する論理。 |
public void next(ActionEvent actionEvent) { int page_num = getPageNumber(); page_num++; String items_to_query = this.getNumber_of_items_to_query(); int offset = Integer.parseInt(items_to_query); int total_page_num = getTotalPageNumber(); if (page_num > total_page_num) { page_num = this.getTableSize() / offset; } RequestContext.getCurrentInstance().getPageFlowScope().put("page_num", page_num); } |
タスク・フローのページ区切りコントロールの「次へ」アクションの動作を定義する論理。 |
public boolean isShowPrevious() { int page_num = getPageNumber(); if (page_num <= 1) { return false; } else { return true; } } |
「前へ」アイコンをレンダリングする論理 |
public boolean isShowNext() { int page_num = getPageNumber(); if (page_num >= getTotalPageNumber()) { return false; } else { return true; } } |
「次へ」アイコンをレンダリングする論理。 |
public int getTotalPageNumber() { String items_to_query = this.getNumber_of_items_to_query(); int offset = Integer.parseInt(items_to_query); int total_page_num = this.getTableSize() / offset; if (getTableSize() % offset > 0) { total_page_num++; } return total_page_num; } |
ページの合計数を返す論理。 |
public String getFooterText() { return "Items " + (this.getStart() + 1) + "-" + this.getEnd() + " of " + " " + this.getTableSize() + " "; } |
ページ区切りテキストを |
このJava Beanは、タスク・フロー・プリファレンス・ファイルの属性を取得および設定するAPIを提供するラッパーです。このタスク・フロー・インスタンスのパーソナライズとカスタマイズを、アプリケーションと同じMDSレイヤーに保存する論理が含まれます。このサンプル・アプリケーションでは、サイトレベルのカスタマイズはmds/mdssys/cust/site/site
ディレクトリに格納されます。したがって、Preference
Beanのコードにより、アプリケーションのMDSセッションのクローンが作成され、タスク・フローのパーソナライズとカスタマイズが同じディレクトリに格納されることが保証されます。
このBeanのコードは、RecentPages
アプリケーションにあります。これは、OTNのOracle WebCenter Portal 11gのデモとサンプルのページからダウンロードできます。
次の表では、Preference.java
ファイルのコードの重要なセクションについて説明します。
表D-7 プリファレンスJava Beanのコード
コード | 説明 |
---|---|
private static MDSSession _getClonedMDSSession() { MDSInstance instance = (MDSInstance) ADFContext.getCurrent().getMDSInstanceAsObject(); MDSSession mdsSession = (MDSSession) ADFContext.getCurrent().getMDSSessionAsObject(); mdsSession = instance.createSession(mdsSession.getSessionOptions(), mdsSession.getUserStateHandler()); return mdsSession; } |
アプリケーションのMDSセッションのクローンを作成する論理。 |
private static MetadataObject _readPreference(MDSSession mdsSession, String preferenceFileName) { MetadataObject mo = null; try { mo = mdsSession.getMutableMO(MOReference.create(preferenceFileName)); } catch (MetadataNotFoundException mnfe) { _LOG.warning("Creating a new preference file " + preferenceFileName); } catch (ReferenceException re) { _LOG.warning("Creating a new preference file " + preferenceFileName); } catch (Exception e) { throw new RuntimeException(e); } // preference file is not available create a new one if (mo == null) { try { DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance(); builderFactory.setNamespaceAware(true); builderFactory.setValidating(false); DocumentBuilder builder = builderFactory.newDocumentBuilder(); Document document = builder.parse(new ByteArrayInputStream(CONTENTS.getBytes())); mo = mdsSession.createMetadataObject(preferenceFileName, document); mdsSession.flushChanges(); mo = mdsSession.getMutableMO(MOReference.create(preferenceFileName)); } catch (Exception e) { throw new RuntimeException(e); } } return mo; } |
MDSセッションでプリファレンス・ファイルを読み取るか、または必要に応じてプリファレンス・ファイルを作成する論理。 |
public static void setNumberOfItemsToShow(String preferenceFileName, int numberOfItemsToShow) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); mo.getDocument().getDocumentElement().setAttribute("numberOfItemsToShow", Integer.toString(numberOfItemsToShow)); _flushChanges(session); } public static int getNumberOfItemsToShow(String preferenceFileName) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); String show = mo.getDocument().getDocumentElement().getAttribute("numberOfItemsToShow"); return Integer.parseInt(show); } |
一度に表に表示するアイテムの数を取得および設定する論理。 |
public static void setNumberOfItemsToQuery(String preferenceFileName, int _numberOfItemsToQuery) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); mo.getDocument().getDocumentElement().setAttribute("numberOfItemsToQuery", Integer.toString(_numberOfItemsToQuery)); _flushChanges(session); } public static int getNumberOfItemsToQuery(String preferenceFileName) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); String query = mo.getDocument().getDocumentElement().getAttribute("numberOfItemsToQuery"); return Integer.parseInt(query); } |
データ・ソースに問い合せるアイテムの数を取得および設定する論理。 |
public static void setShowPageControl(String preferenceFileName, boolean showPageControl) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); mo.getDocument().getDocumentElement().setAttribute("showPageControl", Boolean.toString(showPageControl)); _flushChanges(session); } public static boolean getShowPageControl(String preferenceFileName) { MDSSession session = _getClonedMDSSession(); MetadataObject mo = _readPreference(session, preferenceFileName); String pageControl = mo.getDocument().getDocumentElement().getAttribute("showPageControl"); return Boolean.parseBoolean(pageControl); } |
タスク・フローにページ・コントロールを表示するかどうかを取得および設定する論理。 |
private static void _flushChanges(MDSSession session) { try { session.flushChanges(); } catch (Exception e) { throw new RuntimeException(e); } } |
MDSセッションへのタスク·フローに加えた変更を保存するための論理。サンド・ボックスがMDSセッションで設定されている場合は、変更がサンド・ボックスに保存されます。そうでなければ、それらは永続的にMDSに書き込まれます。 |
private static final String CONTENTS = "<preference numberOfItemsToShow='5' numberOfItemsToQuery='10' showPageControl='true' xmlns='http://xmlns.oracle.com/apps/preference'/>"; } |
Number of Items to show at a timeフィールド、 |
これらのファイルがすべて含まれるRecentPages
プロジェクトはOracle ADFにデプロイされ、タスク・フローはWebPages
プロジェクトのカスタマイズ可能なWelcome.jspx
ページで使用されます。
このプロジェクトには、recent-pages-task-flow-definition
タスク・フローを使用するWelcome.jspx
ページが含まれます。
Welcome.jspx
は、Panel Stretch Layout
コンポーネントを含むカスタマイズ可能なページです。Panel Stretch Layout
の上部ファセットには、Change Mode Link
とページ作成タスク・フローが含まれます。中央ファセットには、Page Customizable
と子であるPanel Customizable
が含まれ、後者にはShow Detail Frame
コンポーネントとrecent-pages-task-flow-definition
タスク・フローが含まれます。
Show Detail Frame
のstretchContent
属性とshowResizer
属性はそれぞれfalse
とnever
に設定され、このコンポーネントによってその子のタスク・フローがストレッチされないことが保証されます。
また、refresh
属性は、タスク・フロー・バインディングでifNeeded
に設定されます。これにより、実行時にこのページに対して実行されたカスタマイズは、ユーザーがリフレッシュを実行したときに反映されることが保証されます。
Welcome.jspx
ページに含まれるコードは次のとおりです。
<?xml version='1.0' encoding='US-ASCII'?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:af="http://xmlns.oracle.com/adf/faces/rich" xmlns:pe="http://xmlns.oracle.com/adf/pageeditor" xmlns:cust="http://xmlns.oracle.com/adf/faces/customizable"> <jsp:directive.page contentType="text/html;charset=US-ASCII"/> <f:view> <af:document id="d1"> <af:form id="f1"> <af:panelStretchLayout id="psl1"> <f:facet name="top"> <af:panelGroupLayout layout="horizontal" xmlns:af="http://xmlns.oracle.com/adf/faces/rich" id="pgl2"> <pe:changeModeLink id="cml1"/> <af:spacer width="10" height="10" id="s2"/> <af:region value="#{bindings.pagecreatepage1.regionModel}" id="r1"/> <af:panelGroupLayout id="pgl1"/> </af:panelGroupLayout> </f:facet> <f:facet name="center"> <pe:pageCustomizable id="pageCustomizable1"> <cust:panelCustomizable id="panelCustomizable1" layout="scroll"> <cust:showDetailFrame text="Recent Pages" id="sdf1" stretchContent= "never" showResizer="never"> <af:region value="#{bindings.recentpagestaskflowdefinition1.regionModel}" id="r2"/> </cust:showDetailFrame> </cust:panelCustomizable> <f:facet name="editor"> <pe:pageEditorPanel id="pep1"/> </f:facet> </pe:pageCustomizable> </f:facet> <f:facet name="start"/> <f:facet name="end"/> </af:panelStretchLayout> </af:form> </af:document> </f:view> </jsp:root>
実行時のこのページは、図D-7に示すように表示されます。
Show Detail Frame
コンポーネント内にタスク・フローを追加して、タスク・フローの結果を親であるShow Detail Frame
コンポーネントのクロムにアクションとして表示できます。これは、親であるShow Detail Frame
でカスタム・アクションを定義することで実現できます。カスタム・アクションを定義するには、インスタンス・レベルでCustom Action
コンポーネントをShow Detail Frame
の子コンポーネントとして追加するか、またはグローバル・レベルでCustom Action
要素をアプリケーションのadf-config.xml
ファイルに定義します。グローバル・カスタム・アクションは、アプリケーションのすべてのShow Detail Frame
インスタンスで有効化されますが、表示されるのはShow Detail Frame
インスタンスにタスク・フローが子として含まれる場合のみです。
このアプリケーションでは、タスク・フローの結果に対応するカスタム・アクションであるdialog:simpleEditPopupView
とdialog:advancedEditPopupView
は、adf-config.xml
ファイルで次のようにグローバルに定義されています。
<customizableComponentsSecurity xmlns="http://xmlns.oracle.com/adf/faces/customizable/config"> <enableSecurity value="true"/> <customActions> <customAction action="refresh" text="Refresh" shortDesc="Refresh" location="menu" rendered="true" icon="/adf/pe/images/refresh_ena.png"/> <customAction action="dialog:simpleEditPoup" text="Simple Edit" shortDesc="Simple Edit" location="menu" rendered="#{!changeModeBean.inEditMode}" icon="/adf/pe/images/editproperties_ena.png"/> <customAction action="dialog:advancedEditPopup" text="Advanced Edit" shortDesc="Advanced Edit" location="menu" rendered="#{changeModeBean.inEditMode}" icon="/adf/pe/images/editproperties_ena.png"/> </customActions> </customizableComponentsSecurity>
タスク・フローが含まれるFrameworkアプリケーション・ページでは、タスク・フローの設計がアプリケーションのパフォーマンスに大きな影響を与える可能性があります。また、応答が遅く、一貫性のないUIは、アプリケーション・ユーザーに好ましくないエクスペリエンスをもたらす可能性があります。パフォーマンスを高め、Frameworkアプリケーション・ユーザーに適切なユーザー・エクスペリエンスが提供されることを保証するために、このドキュメントで説明するガイドラインに従って、アプリケーションで使用するタスク・フローを実装してください。