プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebCenter PortalおよびOracle JDeveloperでのポータルの開発
11gリリース1 (11.1.1.9.0)
E49666-05
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

10 ナビゲーション・モデルの開発

この章では、Oracle JDeveloperを使用してWebCenter Portal Frameworkアプリケーション用のナビゲーションを作成および管理する方法を説明します。

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

10.1 ナビゲーション・モデルの概要

通常、ポータルは様々なソースからの情報を提供する多数のページで構成されます。ユーザーには、簡単にこれらすべてのページ間を移動して、必要な特定の情報に素早くアクセスできる方法が必要です。このポータルのページ間を移動するパスに、ポータル・ナビゲーションを提供します。

ポータル・ナビゲーションを使用して、外部ページ、コンテンツ・リポジトリ、ポートレット、タスク・フローなど、他のリソースへのアクセスを提供することもできます。

ナビゲーション・モデルは、ナビゲーションのコンテンツ、構造およびメタデータを定義します。ナビゲーション・モデルを作成する場合、追加するアイテムとそれらのアイテムの階層を指定します。ナビゲーション・モデルには、次のリソースを含めることができます。

  • ページ(個々のページとページの階層)

  • 外部リンク

  • コンテンツ(個々のコンテンツ・アイテムまたはコンテンツ問合せの結果)

  • 他のナビゲーション・モデル

  • ポートレット、タスク・フローおよび外部アプリケーション

詳細は、第10.3項「ナビゲーション・モデルの編集」を参照してください。

次に示す、動的に生成されるリソースを追加することもできます。

  • カスタム・リソース

  • コンポーネント

  • カスタム・フォルダ

  • カスタム・コンテンツ

詳細は、第10.3.6項「動的に生成されたリソースをナビゲーション・モデルに追加する方法」を参照してください。

シード済ナビゲーション・モデル

新しいPortal Frameworkアプリケーションを作成すると、ナビゲーション・モデルが作成されます(default-navigation-model.xml)。このシード済ナビゲーション・モデル上にアプリケーションを構築するか、または独自のものを作成できます。異なるユーザー・タイプに対する別々のナビゲーション・モデルの作成が必要になる場合もあります。


注意:

独自のナビゲーション・モデルを作成する場合、シード済ナビゲーション・モデルを拡張しないで、デフォルトのナビゲーション・モデルとして設定することをお薦めします。詳細は、第10.4項「デフォルトのナビゲーション・モデルの選択」を参照してください。

ナビゲーション・モデルを作成すると、これをポータル内のいずれかのページまたはページ・テンプレートで公開できます。詳細は、第10.11項「ポータル・ナビゲーションの視覚化」を参照してください。

実行時管理

Portal Frameworkアプリケーションは、デプロイ後もポータルの開発をユーザーが続行できるように、ナビゲーション・モデルの実行時管理をサポートしています。実行時管理により、権限のあるユーザーがブラウザ・ベースの環境でアプリケーションのナビゲーション・モデルを管理したり、新規に作成でき、JDeveloperのインストールや知識は必要ありません。詳細は、第9.5項「実行時のポータル・リソースの使用」を参照してください。

ラウンドトリップ開発

ポータルの再デプロイ時に変更内容が失われないように、実行時に作成または変更されたナビゲーション・モデルをJDeveloperに取り込むことができます。必要な場合は、これらのナビゲーション・モデルを編集してさらに改良でき、デプロイ済ポータルに再びアップロードできます。詳細は、第9.6項「ラウンドトリップ開発での作業」を参照してください。

10.2 ナビゲーション・モデルの作成

アプリケーション用に作成されたシード済ナビゲーション・モデルが要件を満たさない場合には、独自のナビゲーション・モデルを作成できます。

ナビゲーション・モデルを作成するには:

  1. アプリケーション・ナビゲータで、ナビゲーション・モデルを作成するノード(通常は、/oracle/webcenter/portalapp/navigations)を右クリックし、「新規」を選択します。

  2. 「新規ギャラリ」で、「Web層」を開き、「ポータル・フレームワーク」「ナビゲーション」の順に選択し、「OK」をクリックします。

  3. 「ナビゲーションの作成」ダイアログ(図10-1)の「ファイル名」フィールドに、ナビゲーション・モデルを表すXMLファイルの名前(mainNavigation.xmlなど)を入力します。

    図10-1 「ナビゲーションの作成」ダイアログ

    図10-1の説明が続きます
    「図10-1 「ナビゲーションの作成」ダイアログ」の説明

  4. 「ディレクトリ」フィールドに、ナビゲーション・モデル定義のXMLファイルを作成する場所の絶対ディレクトリ・パスを入力します。


    注意:

    Portal Frameworkアプリケーションにおいて、実行時管理コンソールの「アセット」ページで新規ナビゲーション・モデルを公開するには、ナビゲーション・モデルをApplication_Root/Portal/public_html/oracle/webcenter/portalappディレクトリに作成する必要があります。デフォルトでは、Portal Frameworkアプリケーションには別個のnavigationsディレクトリが含まれています。

  5. 「ポータル・リソースとして作成」を選択して、実行時に適切な権限を持つユーザーが実行時管理コンソールの「アセット」ページでナビゲーション・モデルを管理できるようにします。


    注意:

    このオプションが使用できるのは、ナビゲーション・モデルを格納したディレクトリがApplication_Root/Portal/public_html/oracle/webcenter/portalappディレクトリか、そのサブディレクトリのいずれかである場合のみです。


    ヒント:

    このオプションをこの時点で選択しなくても、ナビゲーション・モデルを後から実行時管理コンソールに追加できます。その場合は、リソース・カタログを右クリックして「ポータル・リソースの作成」を選択します。

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

    Portal Frameworkアプリケーションでナビゲーション・モデルを作成すると、そのナビゲーション・モデルに対応するナビゲーション・モデル定義ファイル(XMLファイル)が指定のディレクトリに作成されます。ナビゲーション・モデル定義ファイルが「デザイン」ビュー(図10-2)で開きます。

    図10-2 「デザイン」ビューのナビゲーション・モデル

    図10-2の説明が続きます
    「図10-2 「デザイン」ビューのナビゲーション・モデル」の説明

    ナビゲーション・モデル定義ファイルは最初は空なので、編集してナビゲーション・モデルの構造とコンテンツを設計する必要があります。詳細は、第10.3項「ナビゲーション・モデルの編集」を参照してください。


    ヒント:

    追加するリソースを最初から作成しない場合には、開始点としてdefault-navigation-model.xmlファイルのソース・コードを新規ナビゲーション・モデル定義のソース・ビューにコピーすることも可能です。

    適切なディレクトリの下にナビゲーション・モデルを作成し、「ポータル・リソースとして作成」オプションを選択した場合は、ナビゲーション・モデルの実行時管理が自動的に可能になります。詳細は、第9.5項「実行時のポータル・リソースの使用」を参照してください。

    シード済ナビゲーション・モデルを拡張するのではなく、Portal Frameworkアプリケーションで独自のナビゲーション・モデルを作成する場合は、そのナビゲーション・モデルをアプリケーションのデフォルト・ナビゲーション・モデルとして設定することをお薦めします。これにより、ページおよびページ・テンプレート内でナビゲーション・モデルをはるかに容易に使用できます。詳細は、第10.4項「デフォルトのナビゲーション・モデルの選択」を参照してください。

10.3 ナビゲーション・モデルの編集

ナビゲーション・モデルのコンテンツを定義するために、シード済ナビゲーション・モデルdefault-navigation-model.xmlを編集して、アプリケーション内でユーザーがアクセスできるようにするリソースのノードを追加できます。シード済ナビゲーション・モデルは、WebCenter Portal Frameworkアプリケーション・テンプレートを使用してアプリケーションを作成する際に自動的に作成されます。

ナビゲーション・モデルを独自に作成して、編集することもできます。詳細は、第10.2項「ナビゲーション・モデルの作成」を参照してください。

ノードをナビゲーション・モデルに追加するには、次の2つの方法があります。

ナビゲーション・モデルの「デザイン」ビューで、既存のナビゲーション・モデル・ノードの変更および削除もできます。

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

10.3.1 リソースをナビゲーション・モデルにドラッグ・アンド・ドロップする方法

ナビゲーション・モデル定義ファイルの「デザイン」ビュー内で目的の場所にリソースをドラッグ・アンド・ドロップすることにより、次のリソースをナビゲーション・モデルに追加できます。

  • ページ: アプリケーション・ナビゲータから。そのページのみを追加するか、そのページとサブページを含むページ問合せを追加するかを選択するように求められます。

  • URL接続: 「アプリケーション・リソース」ペインまたは「リソース・パレット」から

  • コンテンツ・アイテム: 「アプリケーション・リソース」ペインまたは「リソース・パレット」内のWebCenter Content接続から

  • ポートレット: 「アプリケーション・リソース」ペインまたは「リソース・パレット」から

  • タスク・フロー: 「アプリケーション・リソース」ペインまたは「リソース・パレット」から

  • 外部アプリケーション: 「アプリケーション・リソース」ペインまたは「リソース・パレット」から

  • ナビゲーション・モデル: アプリケーション・ナビゲータから。ナビゲーション・モデルが別のナビゲーション・モデル内に埋め込まれます。

10.3.2 ページをナビゲーション・モデルに追加する方法

ナビゲーション・モデルの大部分は、アプリケーション内の様々なページへのリンクで構成されます。アプリケーション内にある任意のJSPXページへのリンクを追加できます。

ナビゲーション・モデルにページを追加するには:

  1. アプリケーション・ナビゲータで、ページを追加するナビゲーション・モデルを右クリックし、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューの左側の「ナビゲーション」列で、ページを追加するナビゲーション・モデルのノードを選択します。

  3. 「新しいノードを追加します」アイコンをクリックして、「リンク」を選択します。

  4. 「ID」フィールドには自動的に生成されたIDが移入されます。このIDを保持することはできますが、より説明的なIDに変更することもできます。IDはナビゲーション・モデル内で一意である必要があります。

    このIDは、ナビゲーション・モデル内のノードへの直接アクセスを提供するために使用されます。たとえば、最上位レベル・ノードのIDがhome、その下にある子ノードのIDがsalesならば、次のURLを使用して子ノードにアクセスできます。

    http://host:port/application-context-root/servlet/home/sales
    

    注意:

    ノードがナビゲーション・モデルの最上位レベルにある場合は、IDをナビゲーションURLの予約済キーワードのいずれかにしないでください。詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


    ヒント:

    IDが一意ではないか、無効な文字を入力した場合、フィールドの境界線が赤くなります。

  5. 「タイプ」ドロップダウン・リストから、「ページ」を選択します。

  6. 「ファクトリ・クラス」フィールドには、ページに適した値が自動的に移入され、編集できません。

  7. 「URL」フィールドで、ページにアクセスするURLを入力するか、これを参照します。URLには次の形式を使用する必要があります。

    page://pathToPage/pageName
    

    例:

    page://oracle/webcenter/portalapp/pages/myPage.jspx
    

    ヒント:

    ページのパスがわからない場合は、「ファイルを参照します」をクリックしてアプリケーション内のページを探します。

  8. 指定したページ・テンプレートを使用して、アプリケーションのコンテンツ領域にページをレンダリングするには、「ページ・テンプレートでのURLのレンダリング」を選択します。

    ページから定義されたURLへのクライアント側リダイレクトを実行するには、「URLにリダイレクト」を選択します。

  9. 「表示可能」フィールドで、実行時にナビゲーション・モデルがレンダリングされるとき、ナビゲーション・モデルにページを表示するかどうかを指定します。デフォルト値はEL式#{true}で、これはすべてのユーザーに対して常にページを表示することを意味します。ページがすべてのユーザーに対して常に非表示になるようにするにはfalseまたは#{false}を入力します。あるいは、ページの表示条件を指定するEL式を入力します。フィールドが空の場合、値はデフォルトでtrueになります。


    注意:

    ナビゲーション・モデル内のノードは、セキュリティに基づいて自動的にフィルタ処理されます。ユーザーがページへのアクセス権を持たない場合には、レンダリングされたナビゲーション・モデルにそのページは表示されません。

  10. 「URL属性」セクションで、ページに目的の表示オプションを指定します。詳細は、第10.3.7項「ナビゲーション・モデルまたはナビゲーション・モデル・ノードの表示オプションを設定する方法」を参照してください。

  11. 「URLパラメータ」セクションで、必要に応じて、選択したページでサポートしているパラメータの値を入力します。

    「追加」アイコンをクリックして、「パラメータ」表に行を作成します。

    たとえば、url_renderer_widthパラメータとurl_renderer_heightパラメータを追加し、値をピクセル単位で指定することによって、ページの表示に使用されるインライン・フレームのサイズを指定できます。

  12. ナビゲーション・モデル定義ファイルを保存します。

10.3.3 フォルダをナビゲーション・モデルに追加する方法

ナビゲーション・モデル内のノードのサブセットを作成したり、類似したノードをグループにまとめたりするために、ナビゲーション・モデルを階層式に編成できます。ナビゲーション・モデルに多数のノードが存在する場合は、実行時にこの階層を縮小してスペースを節約できます。

ナビゲーション・モデル内でノードを別のノードの下に配置することにより、この階層を作成できます。親の役割を果たすノードがないノードのコレクションがある場合は、フォルダを作成できます。フォルダは基礎となるリソースを指さず、他のナビゲーション・モデル・ノードを格納する役割のみを果たします。

ナビゲーション・モデルにフォルダを追加するには:

  1. アプリケーション・ナビゲータで、フォルダを追加するナビゲーション・モデルを右クリックし、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューの左側の「ナビゲーション」列で、フォルダを追加するナビゲーション・モデルのノードを選択します。

  3. 「新しいノードを追加します」アイコンをクリックして、「フォルダ」を選択します。

  4. 「ID」フィールドには自動的に生成されたIDが移入されます。このIDを保持することはできますが、より説明的なIDに変更することもできます。IDはナビゲーション・モデル内で一意である必要があります。

    このIDは、ナビゲーション・モデル内のノードへの直接アクセスを提供するために使用されます。たとえば、最上位レベル・ノードのIDがhome、その下にある子ノードのIDがsalesならば、次のURLを使用して子ノードにアクセスできます。

    http://host:port/application-context-root/servlet/home/sales
    

    注意:

    ノードがナビゲーション・モデルの最上位レベルにある場合は、IDをナビゲーションURLの予約済キーワードのいずれかにしないでください。詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


    ヒント:

    IDが一意ではないか、IDに無効な文字を入れた場合、フィールドの境界線が赤くなります。

  5. 「表示可能」フィールドで、実行時にナビゲーション・モデルがレンダリングされるとき、フォルダを表示するかどうかを指定します。デフォルト値はEL式#{true}です。これは、フォルダが常にすべてのユーザーに表示されることを意味します。フォルダがすべてのユーザーに対して常に非表示になるようにするにはfalseまたは#{false}を入力します。あるいは、フォルダの表示条件を指定するEL式を入力します。フィールドが空の場合、値はデフォルトでtrueになります。

  6. 「フォルダ属性」セクションに、フォルダの任意の表示オプションを指定します。詳細は、第10.3.7項「ナビゲーション・モデルまたはナビゲーション・モデル・ノードの表示オプションを設定する方法」を参照してください。

  7. 「フォルダ・パラメータ」セクションで、必要に応じて、フォルダでサポートしているパラメータの値を入力します。

    「追加」アイコンをクリックして、「パラメータ」表に行を作成します。

  8. ナビゲーション・モデル定義ファイルを保存します。

10.3.4 セパレータをナビゲーション・モデルに追加する方法

セパレータは、ナビゲーション・モデルをノードのグループに視覚的に分割します。セパレータを使用して、ナビゲーション・モデルが実行時にレンダリングされるときに、ナビゲーション・モデル内のノードを視覚的に分割できるので、ノードを見つけやすくなります。

ナビゲーション・モデルにセパレータを追加するには:

  1. アプリケーション・ナビゲータで、セパレータを追加するナビゲーション・モデルを右クリックし、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューの左側の「ナビゲーション」列で、セパレータを追加するナビゲーション・モデルのノードを選択します。

  3. 「新しいノードを追加します」アイコンをクリックして、「セパレータ」を選択します。

  4. 「ID」フィールドには自動的に生成されたIDが移入されます。このIDを保持することはできますが、より説明的なIDに変更することもできます。IDはナビゲーション・モデル内で一意である必要があります。

    このIDは、ナビゲーション・モデル内のノードへの直接アクセスを提供するために使用されます。たとえば、最上位レベル・ノードのIDがhome、その下にある子ノードのIDがsalesならば、次のURLを使用して子ノードにアクセスできます。

    http://host:port/application-context-root/servlet/home/sales
    

    注意:

    ノードがナビゲーション・モデルの最上位レベルにある場合は、IDをナビゲーションURLの予約済キーワードのいずれかにしないでください。詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


    ヒント:

    IDが一意ではないか、IDに無効な文字を入れた場合、フィールドの境界線が赤くなります。

  5. 「表示可能」フィールドで、実行時にナビゲーション・モデルがレンダリングされるとき、セパレータを表示するかどうかを指定します。デフォルト値はEL式#{true}です。これは、セパレータが常にすべてのユーザーに表示されることを意味します。セパレータがすべてのユーザーに対して常に非表示になるようにするにはfalseまたは#{false}を入力します。あるいは、セパレータの表示条件を指定するEL式を入力します。フィールドが空の場合、値はデフォルトでtrueになります。

  6. ナビゲーション・モデル定義ファイルを保存します。

10.3.5 その他のリソースをナビゲーション・モデルに追加する方法

ナビゲーション・モデルに他のリソース(ドキュメント、外部Webページ、ポートレット、タスク・フローなど)を追加できます。

ナビゲーション・モデルに他のリソースを追加するには:

  1. アプリケーション・ナビゲータで、リソースを追加するナビゲーション・モデルを右クリックし、「開く」をクリックします。

  2. ナビゲーション・モデルの「デザイン」ビューの左側の「ナビゲーション」列で、リソースを追加するナビゲーション・モデルのノードを選択します。

  3. 「新しいノードを追加します」アイコンをクリックし、追加するリソースのタイプを選択します。

    • コンテンツ・アイテム: ドキュメントを追加します。

    • コンテンツ問合せ: 特定の問合せ基準を満たすドキュメントの集合を追加します。

    • リンク: ポートレット、タスク・フロー、外部アプリケーションまたはWebページを追加します。

    • ページ問合せ: ページのリストを追加します。

    • ナビゲーション参照: 別のナビゲーション・モデルを埋め込みます。

  4. 「ID」フィールドには自動的に生成されたIDが移入されます。このIDを保持することはできますが、より説明的なIDに変更することもできます。IDはナビゲーション・モデル内で一意である必要があります。

    このIDは、ナビゲーション・モデル内のノードへの直接アクセスを提供するために使用されます。たとえば、最上位レベル・ノードのIDがhome、その下にある子ノードのIDがsalesならば、次のURLを使用して子ノードにアクセスできます。

    http://host:port/application-context-root/servlet/home/sales
    

    注意:

    ノードがナビゲーション・モデルの最上位レベルにある場合は、IDをナビゲーションURLの予約済キーワードのいずれかにしないでください。詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


    ヒント:

    IDが一意ではないか、IDに無効な文字を入れた場合、フィールドの境界線が赤くなります。

  5. 「表示可能」フィールドで、実行時にナビゲーション・モデルがレンダリングされるとき、ノードを表示するかどうかを指定します。デフォルト値はEL式#{true}です。これは、ノードが常にすべてのユーザーに表示されることを意味します。ノードがすべてのユーザーに対して常に非表示になるようにするにはfalseまたは#{false}を入力します。あるいは、ノードの表示条件を指定するEL式を入力します。フィールドが空の場合、値はデフォルトでtrueになります。

  6. 残りのフィールドは、リソース・タイプに固有のものです。詳細は、表10-1を参照してください。

    表10-1 ナビゲーション・モデル・リソースのフィールド

    フィールド 適用対象 説明

    ファクトリ・クラス

    リンク

    コンテンツ・アイテム

    このフィールドには、リソース・タイプの適切なファクトリ・クラスが自動的に移入され、編集できません。

    フォルダの内容の挿入

    コンテンツ問合せ

    ページ問合せ

    問合せの結果をフォルダの下に表示せず、レンダリングされたナビゲーション・モデルに直接表示する場合に選択します。

    ページ・スタイル

    ページ問合せ

    ナビゲーション・モデルに含めるページのスタイルを選択します。

    ページ・テンプレート

    ページ問合せ

    リソースが選択されている場合、リソースの表示に使用するページ・テンプレートを選択します。

    ページ可視性

    ページ問合せ

    非表示のフラグが立てられている場合でもページを含めるかどうかを選択します。

    パス

    ページ問合せ

    ナビゲーション参照

    ページ問合せの開始点として使用するページに対応したXMLファイルのパスとファイル名を入力します。例:

    /oracle/webcenter/portalapp/pagehierarchy/pages/pages.xml
    /oracle/webcenter/portalapp/pagehierarchy/pages/productsPages.xml
    

    問合せ

    コンテンツ問合せ

    ナビゲーション・モデルに含めるコンテンツを識別するための問合せ基準を入力します。次に例を示します。

    SELECT * FROM cmis:document WHERE cmis:name LIKE 'Foo%'
    

    問合せのフォーマット方法と例の詳細は、第31章「コンテンツ管理REST API」を参照してください

    URLにリダイレクト

    リンク

    コンテンツ・アイテム

    定義されたURLへのクライアント側リダイレクトを実行する場合に選択します。

    ページ・テンプレートでのURLのレンダリング

    リンク

    コンテンツ・アイテム

    指定したページ・テンプレートを使用して、現在のページにリソースをレンダリングする場合に選択します。

    リポジトリ

    コンテンツ問合せ

    検索するコンテンツを含むコンテンツ・リポジトリを入力または参照します。

    注意: リポジトリ名を手動で(つまり、ドラッグ・アンド・ドロップまたは「リソースの選択」ダイアログを使用せずに)入力し、リポジトリの接続が「リソース・パレット」内でのみ使用可能になっている場合は、まず接続をアプリケーションに追加したことを確認してください(「アプリケーション・リソース」ペイン内で)。

    スコープ

    ページ問合せ

    このフィールドは、Portal Frameworkアプリケーションには適用できません(有効範囲は常に現在のアプリケーション)。

    タイプ

    リンク

    コンテンツ・アイテム

    ナビゲーション・モデルに追加するリンクのタイプ(「外部リンク」「外部アプリケーション」「ページ」「タスクフロー」「ポートレット」「コンテンツ」)を選択します。

    URL

    リンク

    コンテンツ・アイテム

    リソースの場所を入力します。場所がわからない場合は、「ファイルを参照します」アイコンをクリックして使用可能なリソースを参照します。

    表10-2に、様々なリソース・タイプに使用するURL形式を示します。

    注意: 「ポートレット」「外部アプリケーション」または「コンテンツ」リソースのURLを手動で(つまり、ドラッグ・アンド・ドロップまたは「リソースの選択」ダイアログを使用せずに)入力し、リポジトリの接続が「リソース・パレット」内でのみ使用可能になっている場合は、まず接続をアプリケーションに追加したことを確認してください(「アプリケーション・リソース」ペイン内で)。


    表10-2に、様々なリソース・タイプに使用するURL形式を示します。

    表10-2 様々なリソース・タイプのURLの形式

    リソース・タイプ アプリケーション内での場所 URLの形式

    外部リンク

    なし

    リンクするWebページの絶対パスまたは相対パス。

    注意: 「外部リンク」オプションを使用してmailto:リンクをナビゲーションに含める場合、ナビゲーションUIはこのタイプのリンクを明示的に処理する必要があります。詳細は、第10.11項「ポータル・ナビゲーションの視覚化」を参照してください。

    外部アプリケーション

    「アプリケーション・リソース」ペイン内の外部アプリケーション接続

    extapp://externalApplicationId
    

    ページ

    アプリケーション・ナビゲータ

    page://pathToPage/pageName
    

    例:

    page://oracle/webcenter/portalapp/pages/myPage.jspx
    

    ADFライブラリからのタスク・フロー

    リソース・パレット

    taskflow://pathToTaskFlow/taskFlowDefinitionFileName#taskFlowId
    

    注意: このようにタスク・フローに直接移動することにより、タスク・フローのパラメータを設定できます。タスク・フローをさらに詳細に制御する必要がある場合は、タスク・フローをページに追加して、ページをナビゲーション・モデルに追加します。

    アプリケーション内のタスク・フロー

    アプリケーション・ナビゲータ

    taskflow://PathToTaskFlow/taskFlowDefinitionFileName#taskFlowId
    

    注意: このようにタスク・フローに直接移動することにより、タスク・フローのパラメータを設定できます。タスク・フローをさらに詳細に制御する必要がある場合は、タスク・フローをページに追加して、ページをナビゲーション・モデルに追加します。

    ポートレット

    「アプリケーション・リソース」ペインまたは「リソース・パレット」内のポートレット・プロデューサ接続

    portlet://producerId/portletId
    

    注意: この方法でナビゲーションを直接ポートレットに指定すると、ユーザーがポートレットに移動したときにポートレットをカスタマイズできません。ユーザーがポートレットをカスタマイズできるようにするには、ポートレットをページに追加してカスタマイズ可能なポートレット・インスタンスを作成し、そのページをナビゲーション・モデルに追加します。

    コンテンツ

    「アプリケーション・リソース」ペインまたは「リソース・パレット」内のコンテンツ・リポジトリ接続

    content://contentConnectionId/documentId
    

  7. リソースの「属性」セクションで、リソースに目的の表示オプションを指定します。詳細は、第10.3.7項「ナビゲーション・モデルまたはナビゲーション・モデル・ノードの表示オプションを設定する方法」を参照してください。

  8. リソースの「パラメータ」セクションで、必要に応じて、リソースでサポートしているパラメータの値を入力します。

    「追加」アイコンをクリックして、「パラメータ」表に行を作成します。

    リンクに対しては、url_renderer_widthパラメータとurl_renderer_heightパラメータを追加し、値をピクセル単位で指定することによって、リンクのターゲットの表示に使用されるインライン・フレームのサイズを指定できます。

    コンテンツ・プレゼンタ表示テンプレートを使用してコンテンツ・アイテムまたはコンテンツ問合せの結果を表示する場合、「パラメータ」セクションで「追加」アイコンをクリックして「templateView」を選択します。

    templateViewパラメータの「値」フィールドに、次のようなコンテンツのレンダリングに使用する表示テンプレート・ビューIDを入力します。

    • 単独のコンテンツ・アイテムの場合: oracle.webcenter.content.templates.default.detail

    • コンテンツ問合せの場合: oracle.webcenter.content.templates.default.list.simple


    注意:

    コンテンツ・プレゼンタ表示テンプレートを使用してWikiページを表示すると、デフォルトでそのWikiページ内のリンクがドキュメント・ビューアで表示されます。コンテンツ・プレゼンタを使用してWikiページのリンクを表示する場合、adf-config.xmlファイルを編集する必要があります。詳細は、第30.3.5項「コンテンツ・プレゼンタでのWikiページ・リンクの表示」を参照してください。

10.3.6 動的に生成されたリソースをナビゲーション・モデルに追加する方法

ナビゲーション・モデルに既知のリソースを追加するだけでなく、実行時に動的に生成されるリソースを追加することも可能です。

  • カスタム・リソースは、サード・パーティ・リソースへのリンクです。

  • カスタム・コンポーネントは、単純なADF Facesコンポーネント、2つ以上のコンポーネントを含む複合オブジェクト、内部に任意のHTMLコンテンツを追加できるJSF Verbatimタグなどのリソースです。

  • カスタム・フォルダは、実行時に動的にコンテンツを表示するように構成されます。カスタム・フォルダはリソースを含むフォルダとして追加されません。つまり、リソースを動的に表示する、ファクトリ・クラスへのリファレンスのみが含まれます。

  • カスタム・コンテンツ・プロバイダは、実行時に1つ以上のリソースを動的に生成します(生成しない場合もあります)。これはカスタム・フォルダに非常に似ていますが、カスタム・フォルダを追加する場合は、実行時にナビゲーション・モデルがレンダリングされると、空の場合でも必ずフォルダが表示される点が異なっています。カスタム・コンテンツ・プロバイダを使用すると、フォルダ内にコンテンツが存在する場合にのみ、実行時にフォルダが表示されます。

動的に生成されたリソースをナビゲーション・モデルに追加するには:

  1. アプリケーション・ナビゲータで、リソースを追加するナビゲーション・モデルを右クリックし、「開く」をクリックします。

  2. ナビゲーション・モデルの「デザイン」ビューの左側の「ナビゲーション」列で、リソースを追加するナビゲーション・モデルのノードを選択します。

  3. 「新しいノードを追加します」アイコンをクリックし、追加するリソースのタイプを選択します。

    • リンク: カスタム・リソースを追加します。また、「タイプ」ドロップダウン・リストから「その他」を選択する必要があります。

    • コンポーネント: カスタム・コンポーネントを追加します。

    • カスタム・フォルダ: カスタム・フォルダを追加します。

    • カスタム・コンテンツ: カスタム・コンテンツ・プロバイダを追加します。

  4. 「ID」フィールドには自動的に生成されたIDが移入されます。このIDを保持することはできますが、より説明的なIDに変更することもできます。IDはナビゲーション・モデル内で一意である必要があります。

    このIDは、ナビゲーション・モデル内のノードへの直接アクセスを提供するために使用されます。たとえば、最上位レベル・ノードのIDがhome、その下にある子ノードのIDがsalesならば、次のURLを使用して子ノードにアクセスできます。

    http://host:port/application-context-root/servlet/home/sales
    

    注意:

    ノードがナビゲーション・モデルの最上位レベルにある場合は、IDをナビゲーションURLの予約済キーワードのいずれかにしないでください。詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


    ヒント:

    IDが一意ではないか、IDに無効な文字を入れた場合、フィールドの境界線が赤くなります。

  5. 「表示可能」フィールドで、実行時にナビゲーション・モデルがレンダリングされるとき、ノードを表示するかどうかを指定します。デフォルト値はEL式#{true}です。これは、ノードが常にすべてのユーザーに表示されることを意味します。ノードがすべてのユーザーに対して常に非表示になるようにするにはfalseまたは#{false}を入力します。あるいは、ノードの表示条件を指定するEL式を入力します。フィールドが空の場合、値はデフォルトでtrueになります。

  6. 残りのフィールドは、リソース・タイプに固有のものです。詳細は、表10-3を参照してください。

    表10-3 カスタム・ナビゲーション・モデル・リソースのフィールド

    フィールド 適用対象 説明

    コンポーネント・ファクトリ:*

    カスタム・コンポーネント

    oracle.adf.rc.component.XmlComponentFactoryなど、oracle.adf.rc.component.ComponentFactoryインタフェースを実装し、一連のパラメータに基づいてコンポーネントのインスタンスを作成するJavaクラスを入力または参照します。

    名前を入力すると、クラスパスから有効なファクトリ・クラスがフィールドに自動的に入力されます。

    詳細は、第C.4項「カタログへの動的リソースの追加に使用可能なファクトリ・クラス」を参照してください。

    コンテンツ・プロバイダ

    カスタム・コンテンツ

    oracle.adf.rc.spi.plugin.catalog.CustomContentProviderV2インタフェースを実装するJavaクラスを入力または参照します。

    詳細は、第C.4項「カタログへの動的リソースの追加に使用可能なファクトリ・クラス」を参照してください。

    ファクトリ・クラス

    カスタム・リソース

    カスタム・リソースのURLを解決できるURLResourceFactory実装クラスを入力するか参照します。

    初期コンテキスト・ファクトリ

    カスタム・フォルダ

    javax.naming.spi.InitialContextFactoryインタフェースを実装して一連のパラメータに基づいてフォルダを生成するJavaクラスを入力または参照します。

    詳細は、第C.4項「カタログへの動的リソースの追加に使用可能なファクトリ・クラス」を参照してください。

    フォルダの内容の挿入

    カスタム・フォルダ

    カスタム・フォルダのコンテンツをフォルダの下に表示せず、レンダリングされたナビゲーション・モデルに直接表示する場合に選択します。

    パス

    カスタム・フォルダ

    カスタム・フォルダのMDSパスを入力します。

    URLにリダイレクト

    カスタム・リソース

    ページから定義されたURLへのクライアント側リダイレクトを実行する場合に選択します。

    ページ・テンプレートでのURLのレンダリング

    カスタム・リソース

    指定したページ・テンプレートを使用して、現在のページにリソースをレンダリングする場合に選択します。

    タイプ

    カスタム・リソース

    「その他」を選択します。

    URL

    カスタム・リソース

    リソースにアクセスするURLを入力します。


  7. リソースの「属性」セクションで、リソースに目的の表示オプションを指定します。詳細は、第10.3.7項「ナビゲーション・モデルまたはナビゲーション・モデル・ノードの表示オプションを設定する方法」を参照してください。


    注意:

    通常、カスタム・コンテンツ・プロバイダでは、属性を指定する必要がありません。コンテンツ・プロバイダで生成されたリソースの属性は、コンテンツ・プロバイダで指定されます。

  8. リソースの「パラメータ」セクションで、次の操作を行います。

    • カスタム・リソースの場合は、必要に応じて、カスタム・リソースでサポートされているパラメータの値を入力します。

    • カスタム・フォルダの場合は、ファクトリ・クラスを実装する際に定義したパラメータを追加します。これらのパラメータは、アプリケーションのその他のアーティファクトにバインドできます。

    • カスタム・コンテンツ・プロバイダの場合は、カスタム・コンテンツ・プロバイダのパラメータを定義します。ここで定義するパラメータは、CustomContentProviderV2実装に渡され、この実装により解釈されます。

    「追加」アイコンをクリックして、「パラメータ」表に行を作成します。

  9. ナビゲーション・モデル定義ファイルを保存します。

10.3.7 ナビゲーション・モデルまたはナビゲーション・モデル・ノードの表示オプションを設定する方法

ナビゲーション・モデルまたはそのいずれかのノードに対する様々な表示オプションを指定して、ナビゲーション・モデルが実行時にレンダリングされる際の外観と動作を決定できます。使用できる表示オプションは、リソースのタイプの応じて異なります。

ナビゲーション・モデル・ノードの表示オプションを設定するには:

  1. アプリケーション・ナビゲータで、ナビゲーション・モデルを右クリックして、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューで、左側の「ナビゲーション」列から、表示オプションを設定する対象のノードを選択します。

    ナビゲーション・モデルの表示オプションを設定するには、ルート・ノードを選択します。

  3. リソースの「属性」パネルで、「追加」アイコンをクリックして設定する属性を選択します。表10-4に使用できる属性を示します。

    表10-4 ナビゲーション・モデルの表示オプション

    属性 説明

    役職

    ナビゲーション・モデルが実行時にレンダリングされるときにノードに表示されるタイトル。

    AccessKey

    ユーザーがマウスを使用せずにノードにアクセスする場合に入力できるキーのニーモニック(単一文字)。

    説明

    ノードの説明。

    IconURI

    ノードを視覚的に表すアイコン。これは、ナビゲーション・モデルが実行時にレンダリングされる際にタイトルの隣に表示されます。

    Subject

    ノードの検索を容易にするキーワード。

    Target

    ノードが選択された際に表示されるコンテナ・ページ上の場所。同一のブラウザ・ウィンドウ(_self)、新規ウィンドウ(_blank)、ポップアップ(_popup)のいずれかか、ナビゲーションUIでサポートされるその他の場所となります。

    注意: ポップアップはページではサポートされていません。

    ToolTip

    ユーザーがマウスをタイトル上に置いたときにノードに関する追加情報を提示するテキスト。

    Modified

    ノードの最終変更日。この属性は、サイト・マップの作成に使用されます。

    ChangeFrequency

    ノードが変更される頻度(alwayshourlydailyweeklymonthlyyearlynever)。この属性は、サイト・マップの作成に使用されます。

    Significance

    ナビゲーション・モデル内の他のノードに対するこのノードの優先度(0.0から1.0)。この属性は、サイト・マップの作成に使用されます。

    ExternalId

    ページの静的リンクからナビゲーション・モデル内のノードへ直接参照できるID。

    詳細は、第10.9項「ナビゲーションURLの予約済キーワード」を参照してください。


  4. 「値タイプ」ドロップダウン・リストから、次のいずれかを選択します。

    • リテラル文字列: 属性に対する値として文字列を指定します。

    • リソース・バンドル - リソース・バンドルを使用して、属性のローカライズ値を指定します。

  5. 「表示値」フィールドに、属性の値を入力します。リソース・バンドルを使用している場合、「参照」アイコンをクリックしてローカライズ値を検索するリソース・バンドルを選択します。

  6. ナビゲーション・モデル定義ファイルを保存します。

10.3.8 ナビゲーション・モデル内のノードを再配置する方法

ノードを追加した後、ナビゲーション・モデル内でノードを移動できます。ノードを再配置する方法は次のとおりです。

  • ノードを元の場所から別の場所にドラッグ・アンド・ドロップします。

    ノードをナビゲーション・モデル内に移動するには、ノードを選択して目的の場所にドラッグします。ノード(子)を別のノード(親)の下にインデントさせるには、子ノードを選択して親ノードの上にドラッグします。

  • 「親の変更」ポップアップ・メニュー・オプションを使用して、ノードを別の場所に移動します。

「親の変更」オプションを使用してノードを再配置するには:

  1. アプリケーション・ナビゲータで、ナビゲーション・モデルを右クリックして、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューで、左側の「ナビゲーション」列からノードを右クリックして、ポップアップ・メニューから「親の変更」を選択します。

  3. 「親の選択」ダイアログ(図10-4)で、ノードを含める親ノードを選択して「OK」をクリックします。

    図10-4 「親の変更」ダイアログ

    図10-4の説明が続きます
    「図10-4 「親の変更」ダイアログ」の説明


    注意:

    ナビゲーション・モデル内の任意のノードを、別のノードの親にできます。

  4. ナビゲーション・モデル定義ファイルを保存します。

10.3.9 ナビゲーション・モデルまたはナビゲーション・モデル・ノードを表示または非表示にする方法

ナビゲーション・モデルまたはそのノードのいずれかを実行時に表示するかどうかを指定できます。


ヒント:

確定したtrueまたはfalseの値を指定するほか、EL式を使用して表示条件を指定することによって、ナビゲーション・モデルまたはノードが表示可能かどうかを動的に決定することもできます。

ナビゲーション・モデルまたはナビゲーション・モデル・ノードを表示または非表示にするには:

  1. アプリケーション・ナビゲータで、ナビゲーション・モデルを右クリックして、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューで、左側の「ナビゲーション」列から、可視性を設定する対象のノードを選択します。

    ナビゲーション・モデルの可視性を設定するには、ルート・ノードを選択します。

  3. 「表示可能」フィールドで、ナビゲーション・モデルまたはノードをアプリケーションで使用可能にするかどうかを指定します。このフィールドは、EL値を取ります。デフォルトは#{true}です。これは、ナビゲーション・モデルまたはノードが表示可能であることを示します。falseまたは#{false}を入力すると、ナビゲーション・モデルまたはノードが非表示になります。あるいはEL式を入力して、ナビゲーション・モデルまたはノードを表示可能にする条件を指定します。フィールドが空の場合、値はデフォルトでtrueになります。

  4. ナビゲーション・モデル定義ファイルを保存します。

10.3.10 ナビゲーション・モデル・ノードを編集する方法

ナビゲーション・モデル・ノードを編集するには、ナビゲーション・モデル定義ファイルの「ナビゲーション」セクションでノードを選択します。リソースの属性とパラメータは、ページの右側に表示されます。これらの属性とパラメータの値を編集して、ナビゲーション・モデル定義ファイルを保存できます。リソースの属性とパラメータの詳細は、この章の該当する前項を参照してください。

10.3.11 ナビゲーション・モデル・ノードを削除する方法

リソースを削除するには、ナビゲーション・モデル定義ファイルの「ナビゲーション」セクションでリソースを選択し、「選択したノードを削除します」アイコンをクリックします(図10-5)。

図10-5 ナビゲーション・モデルの「デザイン」ビューの「削除」オプション

図10-5の説明が続きます
「図10-5 ナビゲーション・モデルの「デザイン」ビューの「削除」オプション」の説明

10.4 デフォルトのナビゲーション・モデルの選択

すべてのPortal Frameworkアプリケーションが、デフォルトのナビゲーション・モデルを定義します。これは、デフォルトでアプリケーションが使用する必要のあるナビゲーション・モデルを指定するのに便利です。これにより、実際の名前を指定せずに、このデフォルト・ナビゲーション・モデルを参照できます。たとえば、ナビゲーションEL式では、#{navigationContext.defaultNavigationModel}のように、デフォルトのナビゲーション・モデルが参照されることが多くあります。

最初にPortal Frameworkアプリケーションを作成すると、シード済ナビゲーション・モデル(default-navigation-model.xml)がアプリケーションのデフォルト・ナビゲーション・モデルとして設定されます。続いて、アプリケーションのメイン・ナビゲーション・パスに使用する独自のナビゲーション・モデルを作成すると、使用するたびにこのナビゲーション・モデルを明示的に参照するのではなく、それをデフォルトとして設定できます。これにより、アプリケーション内でナビゲーション・モデルを使用するプロセスがはるかに簡単になります。

Portal Frameworkアプリケーションにデフォルトのナビゲーション・モデルを設定するには、adf-config.xmlファイルのoracle.webcenter.portalapp.navigation.modelプリファレンスを編集します。

デフォルトのナビゲーション・モデルを選択するには:

  1. アプリケーション・ナビゲータの「アプリケーション・リソース」ペインで、adf-config.xmlファイルを右クリックして、「開く」を選択します。


    ヒント:

    adf-config.xmlファイルを探すには、「ディスクリプタ」ノードを開き、さらに「ADF META-INF」ノードを開きます。

  2. 「ソース」タブをクリックします。

  3. 次のidを使用して、ADFプリファレンスを見つけます。

    oracle.webcenter.portalapp.navigation.model
    
  4. value属性を、アプリケーションのデフォルトとして使用するナビゲーション・モデルのパスに設定します。次に例を示します。

    value="/oracle/webcenter/portalapp/navigations/myNavigationModel.xml"
    

    例10-1に、完全なプリファレンス要素の例を示します。

    例10-1 デフォルトのナビゲーション・モデルのADFプリファレンス

    <preference id="oracle.webcenter.portalapp.navigation.model"
                desc="Default Navigation Model"
                value="/oracle/webcenter/portalapp/navigations/myNavigationModel.xml"
                resourceType="navigation" display="true"/>
    
  5. adf-config.xmlファイルを保存します。

10.5 ナビゲーション・モデルのコンテンツのフィルタリング

フィルタを使用して、実行時にナビゲーション・モデルをレンダリングする際にナビゲーション・モデルに組み込むノードを、特定の基準に応じて決定できます。


ヒント:

ノードの「表示可能」フィールドにEL式を指定すると、ナビゲーション・モデルの個別ノードを条件に基づいて非表示にすることも可能です。詳細は、第10.3.9項「ナビゲーション・モデルまたはナビゲーション・モデル・ノードを表示または非表示にする方法」を参照してください。

ナビゲーション・モデルのコンテンツをフィルタ処理するには:

  1. アプリケーション・ナビゲータで、ナビゲーション・モデルを右クリックして、「開く」を選択します。

  2. ナビゲーション・モデルの「デザイン」ビューの左側にある「ナビゲーション」パネルで、ナビゲーション・モデルを表現するノード(ルート・ノード)を選択します。

  3. 「ナビゲーション・フィルタ」フィールドに、ナビゲーション・モデル内で選択済ノードを特定の基準に応じて除外する際に使用するJavaクラスの名前を入力します。

    このJavaクラスは、oracle.adf.rc.spi.plugin.catalog.CatalogDefinitionFilterインタフェースを実装します。

    ノードはセキュリティに基づいて自動的にフィルタ処理されます。ユーザーが特定のリソースへのアクセス権を持たない場合には、ナビゲーション・モデルが実行時にレンダリングされる際にそのリソースのノードは表示されません。

  4. 変更内容を保存します。

10.6 ナビゲーション・モデルの削除

アプリケーション内でナビゲーション・モデルが不要になった場合は、ナビゲーション・モデルを削除できます。


注意:

アプリケーションのデフォルト・ナビゲーション・モデルを削除する場合は、デフォルト・ナビゲーション・モデルを有効なナビゲーション・モデルに変更する必要があります。詳細は、第10.4項「デフォルトのナビゲーション・モデルの選択」を参照してください。

ナビゲーション・モデルを削除するには、アプリケーション・ナビゲータ内でナビゲーション・モデルを右クリックして、ポップアップ・メニューから「削除」を選択します。詳細は、第9.4項「ポータル・リソースの削除」を参照してください。

10.7 ナビゲーション・レジストリ・ファイルの編集

ナビゲーション・レジストリは、ユーザーが実行時にナビゲーション・モデルに追加できるリソースを登録するための専用リソース・カタログです。各Portal Frameworkアプリケーションには、アプリケーションの作成時に作成される1つのナビゲーション・レジストリ・ファイルnavigation-registry.xmlが含まれます。このファイルを編集して、たとえばユーザーが実行時に他のナビゲーション・モデルを埋め込むことができないように、ナビゲーション参照リソースを削除できます。

ナビゲーション・レジストリを編集するには:

  1. アプリケーション・ナビゲータで、navigation-registry.xmlファイルを右クリックします。


    ヒント:

    このファイルは、Application_Root/oracle/webcenter/portalapp/navigationsの下にあります。

  2. このファイルをその他のリソース・カタログと同じ方法で編集します。詳細は、第14.3項「リソース・カタログの編集」を参照してください。

    次のリソースをナビゲーション・レジストリに追加できます。

    • フォルダ

    • リンク

      • タスク・フロー

      • ポートレット

      • コンテンツ

      • その他

    • リソース・カタログ

    • コンポーネント

    • カスタム・フォルダ

    • カスタム・コンテンツ

    ナビゲーション・レジストリの既存のリソースを変更および削除して、レジストリのリソースを再配置することもできます。

  3. 終了したら、navigation-registry.xmlファイルを保存します。

10.8 ナビゲーション・レンダラの編集

ナビゲーション・レンダラは、ナビゲーション・モデル経由でのアクセス時に、次のようなページ以外のリソースをレンダリングするJSPXページです。

  • ポートレット

  • コンテンツ

  • 外部リンク

  • 外部アプリケーション

  • タスク・フロー

ナビゲーション・レンダラ・ページを編集して、これらのリソース・タイプのレンダリング方法を変更できます。たとえば、ナビゲーション・レンダラ・タスク・フローの前または後にイメージを追加したり、フローからストレッチ・レイアウトに変更することができます。


注意:

非常に多くの場合、既存のナビゲーション・レンダラを編集して、各自の要件に適合できるようにする必要があります。しかし、必要な場合には独自のナビゲーション・レンダラ・ページを作成できます。たとえば、ナビゲーション・レンダラでは、contentファセットが期待されます。別のファセットを使用する場合には、独自のページを作成して、テンプレートの適切な場所にナビゲーション・レンダラ・タスク・フローを配置できます。

独自のナビゲーション・レンダラ・ページを作成することにした場合は、そのナビゲーション・レンダラ・タスク・フローを格納するナビゲーション・レンダラ・リージョンを含める必要があります。

アプリケーションのナビゲーション・レンダラとしてページを設定するには、ナビゲーション・レンダラADFプリファレンス(oracle.webcenter.portalapp.navigation.renderer)を編集して適切なファイルを指すようにします。ADFプリファレンスの編集方法の詳細は、第10.4項「デフォルトのナビゲーション・モデルの選択」を参照してください。


ナビゲーション・レンダラ・ページはデフォルトでは非表示のため、編集できるようにするには、まずアプリケーションでこれを表示する必要があります。

ナビゲーション・レンダラを編集するには:

  1. アプリケーション・ナビゲータで、アプリケーション・プロジェクトを右クリックして「プロジェクト・プロパティ」を選択します。

  2. 「プロジェクト・プロパティ」ダイアログで、「プロジェクトのソース・パス」ノードを開き、「Webアプリケーション」を選択します。

  3. 「除外」タブを選択します。

  4. ナビゲーション・レンダラ・ファイル(navigation-renderer.jspx)を選択して、「削除」をクリックし、除外ファイルのリストからそのファイルを削除します。

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

    ナビゲーション・レンダラJSPXファイルは、アプリケーション・ナビゲータで次のノードの下にリストされるようになります。

    /oracle/webcenter/portalapp/pages/
    
  6. アプリケーション・ナビゲータで、navigation-renderer.jspxを右クリックして、「開く」を選択します。

  7. 「ソース」タブをクリックして、必要に応じてファイルを編集します。

  8. 終了したら、navigation-renderer.jspxファイルを保存します。

10.9 ナビゲーションURLの予約済キーワード

特定の予約済キーワードを使用して、ナビゲーション・モデル内のノードへの直接アクセスを提供できます。これらの予約済キーワードは次のとおりです。

  • wcnav_defaultSelection: ナビゲーション・モデルの最初のナビゲート可能なノードにアクセスする場合に使用します。

  • wcnav_currentSelection: ナビゲーション・モデルの現在選択されているノードにアクセスする場合に使用します。

  • wcnav_externalId: 指定の外部IDを持つ、ナビゲーション・モデル内のノードにアクセスする場合に使用します。

  • wcnav_title: 指定のタイトルを持つ、ナビゲーション・モデル内のノードにアクセスするために使用します。

これらのキーワードは、ページまたはページ・テンプレート内のaf:goLinkコンポーネント(例10-2)、またはナビゲーション・モデル内の外部リンク・ナビゲーション・アイテムのURL(例10-3)で使用できます。

例10-2 goLinkコンポーネントからナビゲーション・モデル・ノードへの直接アクセスの提供

<af:goLink id="pt_glink1" text="Navigation Item"
           destination="/faces/wcnav_defaultSelection"/>

例10-3 外部リンク・ナビゲーション・アイテムからナビゲーション・モデル・ノードへの直接アクセスの提供

<url visible="#{true}"
     factoryClass="oracle.webcenter.portalframework.sitestructure.rc.UrlResourceFactory"
     id="externalLink"
     url="/faces/wcnav_externalId/myNavigationItem">
</url>

デフォルトでは、これらのURLはデフォルト・ナビゲーション・モデル内のノードへのアクセスを提供します。デフォルト以外のナビゲーション・モデル内にあるノードに直接アクセスするには、wcnav.modelPath URLパラメータを設定してナビゲーション・モデルのパスを指定する必要があります。例を次に示します。

/faces/wcnav_externalId/myNavigationItem?wcnav .modelPath=/oracle/webcenter/siteresources/scopedMD/
s7f446cab_f622_4b68_a83e_b7eaf28b52ec/navigation/gsr0271c712_721a_4565_9f0e_755784a7093b/
myProjectNavigationModel

リンクを使用する場所によっては、URLパラメータをエンコードする必要が生じることがあります。たとえば、外部IDにスペースまたは特殊文字が含まれる場合は、/faces/wcnav_externalId/my%2Fnav%2FitemのようにURLを指定します。

10.10 ナビゲーション・モデル開発のヒント

Portal Frameworkアプリケーションのナビゲーション・モデルを作成する際には、次のことを考慮してください。

  • メインのナビゲーション・モデルは1つだけ使用するようにします。複数のナビゲーション・モデルを使用すると、フレンドリURLの制御が制限されます。

  • Portal Frameworkアプリケーションの各セクションが、わかりやすいサブルート名を持つようにします。たとえば、Footerフォルダの下にすべてのフッター・リンクを配置します。

  • Portal Frameworkアプリケーションの別の部分にユーザーを導くすべてのリンク(ヘッダーとフッターのリンクを含む)をナビゲーション・モデルに組み込みます。

  • 外部IDを使用してアプリケーションの永続リンクを公開します。これにより、ナビゲータ・モデル・ノードが移動しても、外部アプリケーションが中断なくこれらのリンクを参照できます。

  • ページがパラメータを定義している場合は、ナビゲーション・モデル・ノードでこれらのパラメータを設定して、ページのレンダリング方法を動的に制御できます。

  • ページ・リンクは可能なかぎり多く使用します。たとえば、連絡先リンクを組み込む場合は、リンクを表示するページを作成し、ナビゲーション・モデルにそのページを組み込みます。

  • ポータルで使用されているすべてのページをナビゲーション・モデルのページ・リンクとして組み込みます。

詳細は、Oracle WebCenter & ADF Architecture Teamのブログを参照してください。

10.11 ポータル・ナビゲーションの視覚化

ナビゲーションの視覚化により、ナビゲーションがアプリケーションにどのように表示されるかが決まります。たとえば、ナビゲーションを各ページの上部に一連のタブとして、あるいはページの横にツリー構造として表示できます。あるいは、ナビゲーションの視覚化として、マスター/ディテール・ナビゲーションを表示する方法も一般的です。たとえば、ページの上部にタブがあり、各タブには、ページの横にツリー構造で表示される追加のナビゲーションがあります。

通常、ページ・テンプレートにナビゲーションの視覚化を追加するため、これを1箇所で定義してポータル全体に一貫して伝播させることができます。ただし、個々のページにナビゲーションの視覚化を追加することもできます。

Oracle WebCenter Portalでは、ナビゲーションを視覚化するためにページまたはページ・テンプレートに追加できる組込みのナビゲーション・タスクが、リソース・カタログの「WebCenter Portal - サービス・カタログ」にいくつか提供されています。これらの組込みナビゲーション・タスク・フローにより、ナビゲーション・モデルをすばやくテストできますが、ナビゲーションの視覚化はかなり簡単になります。これらの組込みナビゲーション・タスク・フローの詳細は、『Oracle WebCenter Portalでのポータルの構築』のページ・テンプレートへのナビゲーションの追加に関する項を参照してください。

さらに高度な視覚化が必要になる場合も多くあります。これを行うには、ADFナビゲーション・コンポーネントとOracle WebCenter PortalナビゲーションのAPIを使用して、独自のナビゲーションUIを作成する必要があります。


注意:

ページまたはページ・テンプレートによって参照されるナビゲーション・モデルに、mailto:リンクを使用する外部リンク・ナビゲーション・アイテムが含まれる場合は、これらのアイテムを明示的に処理する必要があります。次の例では、JSTLを使用してナビゲーション・アイテムのexternalURLを調査し、これが文字列mailto:で開始しているかどうかを確認しています。その文字列で開始している場合は、ADF Faces goLinkコンポーネントを使用してリンクがレンダリングされます。
<c:choose>
  <c:when test="${fn:startsWith(node.externalURL, 'mailto:')}">
    <af:goLink id="pt_gl_mail" text="#{node.title}"
               destination="#{node.externalURL}"/>
  </c:when>
  <c:otherwise>
    ...
  </c:otherwise>
</c:choose>

Oracle WebCenter Portalには、ポータルにナビゲーションを追加するためのAPIが2セット用意されています。

  • 式言語(EL)のAPI: EL式を使用して、ナビゲーション・モデルとナビゲーション・ノードを取得します。

  • REST API: 標準のHTTPメソッドを使用して、ナビゲーション・モデルとナビゲーション・ノードを指し示し、取得されたオブジェクトの標準表現を返します。REST APIは、クライアント側のプログラミング言語(JavaScript + HTMLなど)や環境(iPhoneなど)の利用時に使用できます。


注意:

ナビゲーション・モデルを使用してアプリケーション内でナビゲーションをトリガーするタスク・フローには、wcnav_outcomeをルート・レベルに伝播するwcnav_parentActionというparent-actionアクティビティをタスク・フロー定義に次のように含める必要があります。
<parent-action id="wcnav_parentAction">
  <root-outcome>wcnav_outcome</root-outcome>
</parent-action>

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

10.11.1 ナビゲーション式言語のAPIの使用

Oracle WebCenter Portalには、式言語(EL)の一連のAPIが用意されており、これらを使用すると、ナビゲーション・モデルを取得して、そのモデルを実行時モデルとして表すことができます。実行時モデルは、ADF Facesナビゲーション・コンポーネントに直接バインドできます。

使用可能なナビゲーションEL式は、第G.7項「ナビゲーションに関連するEL」にすべてリストされています。

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


注意:

この項では、ナビゲーションEL APIの使用方法について、いくつかの例を紹介します。完全な作業例については、Portal Frameworkアプリケーションの作成時に作成されるデフォルトのページ・テンプレート(pageTemplate_globe.jspxおよびpageTemplate_swooshy.jspx)を参照してください。

10.11.1.1 ナビゲーション・コンテキストの概要

ナビゲーション・コンテキストは、システム内のすべてのナビゲーション要素にアクセスするエントリ・ポイントです。具体的には、これを使用すると、プリファレンス、状態、直接参照を介してナビゲーション・モデルにアクセスでき、実際にノードにナビゲートするカスタムUIを作成するフックが提供されます。

ナビゲーション・モデルへのアクセス

  • デフォルトのナビゲーション・モデル(プリファレンス) - これは、adf-config.xmlファイルのADFプリファレンスoracle.webcenter.portalapp.navigation.modelで指定されるモデルです。これを使用すると、アプリケーション全体で使用される一般的なモデルを定義でき、各ページやページ・テンプレートに移動して値を設定するのではなく、値を1箇所で変更できます。デフォルトのナビゲーション・モデルを取得するEL式は次のようになります。

    #{navigationContext.defaultNavigationModel}
    

    注意:

    oracle.webcenter.portalapp.navigation.modelプリファレンスを設定する方法については、第10.4項「デフォルトのナビゲーション・モデルの選択」を参照してください。

  • 現在のナビゲーション・モデル(状態) - このモデルは、現在のビューへのナビゲートに使用されるものです。設定されない場合、デフォルトのナビゲーション・モデルを返します。アプリケーションには複数のナビゲーション・モデルを含めることができます。現在のナビゲーション・モデルを取得するEL式は次のようになります。

    #{navigationContext.currentNavigationModel}
    

    この式を使用すると、ページまたはページ・テンプレート内で単一の値を使用でき(ブレッドクラムを表示する場合など)、特定のナビゲーション・モデルを選択せずに正しい値を表示できます。

  • ナビゲーション・モデルの直接アクセス(直接参照) - 特定のナビゲーション・モデルのXML定義のパスを渡して、そのモデルを選択することもできます。特定のナビゲーション・モデルを取得するEL式は次のようになります。

    #{navigationContext.navigationModel['modelPath=path']
    

    ここで、pathは、ナビゲーション・モデル定義ファイルのパスです。たとえば、次のようになります。

    #{navigationContext.navigationModel['modelPath=/oracle/webcenter/portalapp/navigations/myNavigation']}
    

    注意:

    ファイル名の拡張子.xmlを含める必要はありません。

リソース・ナビゲーション

ナビゲーション・モデルをUIコンポーネントのactionListener属性にバインドするためのコアBean操作には次のELを使用します。例:

#{navigationContext.processAction}

例10-4では、現在のナビゲーション・モデルにアクセスして<af:outputText/>でツリーをレンダリングする、ナビゲーション・コンテキストを使用した簡単なツリーUIが作成されます。

例10-4 簡単なツリー・ナビゲーションUI

<af:tree var="node"
    value="#{navigationContext.currentNavigationModel.treeModel['startNode=/,
    includeStartNode=true,
    depth=1']}"
    id="t1">
  <f:facet name="nodeStamp">
    <af:outputText value="#{node.title}" id="ot1"/>
  </f:facet>
</af:tree>

例10-5では、ナビゲーション・コンテキストのprocessActionリスナーを使用して、現在のノードをnodeというパラメータでactionListenerに属性として渡すADF commandImageLinkコンポーネントのナビゲーションを処理します。

例10-5 UIコンポーネントへのナビゲーション・モデルのバインド

<af:tree var="node"
    value="#{navigationContext.currentNavigationModel.treeModel['startNode=/,
           includeStartNode=true,
           depth=1']}"
    id="t1">
  <f:facet name="nodeStamp">
    <af:commandImageLink text="#{node.title}"
        id="sm_c1b"
        actionListener="#{navigationContext.processAction}"
        inlineStyle="#{node.selected ? 'font-weight:bold;' : ''}">
      <f:attribute name="node" value="#{node}"/>
    </af:commandImageLink>
  </f:facet>
</af:tree>

10.11.1.2 ナビゲーション実行時モデルの概要

ナビゲーション実行時モデルは、基礎となるXML定義を実行時モデルとして公開し、個々のノードへの直接アクセスを提供します。実行時モデルは、セキュリティや可視性といった要因を考慮し、UIオブジェクトにバインドできる、セッションに固有の表現を作成します。


注意:

ナビゲーションのコンテンツ、構造およびメタデータの定義のために作成するナビゲーション・モデルと、ナビゲーション・モデルの実行時の動作を決定するナビゲーション実行時モデルとの違いに注意してください。

デフォルトの実行時モデル(defaultTreeModeldefaultListModeldefaultMenuModelおよびdefaultSiteMap)を使用してモデル全体にアクセスしたり、実行時モデルの作成時に各種パラメータを使用して固有のサブツリーにアクセスできます。例:

#{navigationContext.defaultNavigationModel.menuModel['startNode=home,
    includeStartNode=false, depth=2']}

基礎となるADF FacesのMenuModel、TreeModelおよびListModelの詳細は、『Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』を参照してください。

モデルへのアクセス

次の実行時モデルは、基礎となる次のナビゲーション・モデルに基づいて作成できます。

  • UIモデル

    • ツリー・モデル

      #{navigationContext.defaultNavigationModel.defaultTreeModel}
      #{navigationContext.defaultNavigationModel.treeModel['parameters']}
      
    • メニュー・モデル

      #{navigationContext.defaultNavigationModel.defaultMenuModel}
      #{navigationContext.defaultNavigationModel.menuModel['parameters']}
      
    • リスト・モデル

      #{navigationContext.defaultNavigationModel.defaultListModel}
      #{navigationContext.defaultNavigationModel.listModel['parameters']}
      
  • 検索エンジン・モデル

    • サイトマップ

      #{navigationContext.defaultNavigationModel.defaultSiteMap}
      #{navigationContext.defaultNavigationModel.siteMap['parameters']}
      

リソース(またはノード)へのアクセス

次のEL式を使用して、ナビゲーション・モデル内の特定のノードにアクセスできます。

  • #{navigationContext.defaultNavigationModel.currentSelection}

  • #{navigationContext.defaultNavigationModel.rootNode}

  • #{navigationContext.defaultNavigationModel.node['path']}

例10-6では、現在のナビゲーション・モデルのメニュー・モデルをブレッドクラムとしてレンダリングします。

例10-6 ナビゲーション・モデルのメニュー・モデルとしてのレンダリング

<af:breadCrumbs id="bc1"
    var="node"
    value="#{navigationContext.currentNavigationModel.defaultMenuModel}">
  <f:facet name="nodeStamp">
    <af:commandNavigationItem id="cni1"
        text="#{node.title}"
        actionListener="#{navigationContext.processAction}"
        partialSubmit="true">
      <f:attribute name="node" value="#{node}"/>
    </af:commandNavigationItem>
  </f:facet>
</af:breadCrumbs>

例10-7では、デフォルトのナビゲーション・モデルに基づき、アプリケーションのサイトマップを作成します。

例10-7 サイトマップの作成

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"  version="2.1"
    xmlns:f="http://java.sun.com/jsf/core">
  <jsp:directive.page contentType="text/xml;charset=UTF-8" />
  <f:view>
    ${navigationContext.defaultNavigationModel.defaultSiteMap}
  </f:view>
</jsp:root>

サイトマップの詳細は、第10.13項「ナビゲーション・モデルを使用したサイトマップの作成」を参照してください。

10.11.1.3 ナビゲーション・リソースの概要

ナビゲーション・リソースは、ナビゲーション・モデル内の各ノードに対して個々のプロパティにアクセスできます。これらのプロパティは、次のカテゴリに分類されます。

  • 属性 - ユーザーがナビゲーション要素に対して指定する共通のプロパティ。ページのノードのレンダリングに使用され、次の属性があります。

    • Title - ナビゲーション・モデルが実行時にレンダリングされるときにノードに表示されるタイトル。

    • AccessKey - ユーザーがマウスを使用せずにノードにアクセスする場合に入力できるキーのニーモニック(単一文字)。

    • Description - ノードの説明。

    • IconURI - ノードを視覚的に表すアイコン。これは、ナビゲーション・モデルが実行時にレンダリングされる際にタイトルの隣に表示されます。

    • Subject - ノードの検索を容易にするキーワード。

    • Target - ノードの選択時にそのノードが表示されるコンテナ・ページの場所。同じブラウザ・ウィンドウ内(_self)、新しいウィンドウ(_blank)、ポップアップ(_popup)、あるいはナビゲーションUIでサポートされる場所になります。

    • ToolTip - ユーザーがマウスをタイトル上に置いたときにノードに関する追加情報を提示するテキスト。

    • Modified - ノードの最終変更日。この属性は、サイトマップの作成に使用されます。

    • ChangeFrequency - ノードの変更が見込まれる頻度(常時、1時間に一度、毎日、週に一度、月に一度、年に一度、変更なし)。この属性は、サイトマップの作成に使用されます。

    • Significance - ナビゲーション・モデル内のその他のノードと比較した、該当ノードの優先度(0.0から1.0)。この属性は、サイトマップの作成に使用されます。

    • ExternalId - ページの静的リンクからナビゲーション・モデルの任意のノードへの直接参照を有効にするID。

  • Parameters - 各ノードに固有のユーザー定義プロパティ。これらは、名前と値のペアで、任意の値が含まれます。

  • State - 問合せが可能で、ノードへのナビゲートに使用できる組込みプロパティ。例:

    • ノードのタイプ。フォルダやセパレータなど

    • ノードがナビゲートできるかどうか

    • ノードのパス

    • 親ノード、子ノードまたは兄弟ノードへのアクセス

    • ノードが、ナビゲーション・モデル内の現在選択されているノードかどうか、選択されているノードのパス上にあるかどうか

    完全なリストについては、第G.7項「ナビゲーションに関連するEL」を参照してください。

例10-8では、ADF commandImageLinkコンポーネントを様々な属性でレンダリングします。

例10-8 属性によるcommandImageLinkのレンダリング

<af:commandImageLink text="#{node.title}"
    id="cil1"
    actionListener="#{navigationContext.processAction}"
    shortDesc="#{node.attributes['ToolTip']}"
    accessKey="#{node.attributes['AccessKey']}"
    inlineStyle="#{node.selected ? 'font-weight:bold;' : ''}">
  <f:attribute name="node" value="#{node}"/>
</af:commandImageLink>

例10-9では、パラメータを介して、ノードから対応するページに渡される値にアクセスします。

例10-9 ページ・パラメータへのノード値の引渡し

homePageDef.xml

<pageDefinition xmlns="http://xmlns.oracle.com/adfm/uimodel"
    version="11.1.1.55.96" id="homePageDef"
    Package="oracle.webcenter.portalapp.pages">  
  <parameters>
    <parameter id="NavigationParameter"
        value="#{navigationContext.currentNavigationModel.currentSelection.parameters
            ['MyNavParam']}"/>
  </parameters>

例10-10では、ノードにナビゲートできるかどうかに基づき、ブレッドクラム・リンクを条件付きで表示します。これは、UIコンポーネントの基準をノードのタイプにも置いています。

例10-10 ナビゲーション・ノードの条件付き表示

<af:breadCrumbs id="bc1"
                var="node"
                value="#{navigationContext.currentNavigationModel.defaultMenuModel}">
  <f:facet name="nodeStamp">
    <af:switcher facetName="#{node.navigable}" id="swn1">
      <f:facet name="true">
        <af:commandNavigationItem id="cni1" text="#{node.title}"
                                  actionListener="#{navigationContext.processAction}"
                                  partialSubmit="true">
          <f:attribute name="node" value="#{node}"/>
        </af:commandNavigationItem>
      </f:facet>
      <f:facet name="false">
        <af:outputText value="#{node.title}" rendered="#{!node.separator}" id="ot3"/>
      </f:facet>
    </af:switcher>
  </f:facet>
</af:breadCrumbs>

10.11.1.4 ナビゲーション・モデルをリンクのリストとしてレンダリングする方法

ポータルのナビゲーションを視覚化するには、一般的な方法としてリンクのリストがあります。リンクをクリックすると、そのリンクに関連付けられたリソースにナビゲートします。

例10-11では、現在のナビゲーション・モデルのリスト・モデルを取得し、そのモデルをページに垂直にレンダリングします。コードは、各ノードをADF commandImageLinkコンポーネントに順にバインドしながら、ナビゲーション・モデルを反復します。ノードに子が含まれる場合、別のイテレータがページにその子をレンダリングします。ノードがナビゲートできない場合、そのノードはリンクとしてレンダリングされません。現在選択されているノードは太字で表示されます。

例10-11 リンクのリストとしてのナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp1" height="20px"/>             
  <af:iterator id="i1"
               value="#{navigationContext.currentNavigationModel.listModel['startNode=/,
                     includeStartNode=false']}"
               var="node">
    <af:panelGroupLayout layout="vertical">
      <af:commandImageLink id="cil2" text="#{node.title}"
                           actionListener="#{navigationContext.processAction}"
                           action="pprnav"
                           icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                           disabled="#{not node.navigable}"
                           inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">
        <f:attribute name="node" value="#{node}"/>
      </af:commandImageLink>
      <af:iterator id="i2" value="#{node.children}" var="node2">
        <af:panelList id="pl1">
          <af:commandImageLink id="cil3" text="#{node2.title}"
                               actionListener="#{navigationContext.processAction}"
                               action="pprnav"
                               icon="#{node2.attributes[pageFlowScope.tnBean.iconKey]}"
                               disabled="#{not node2.navigable}"
                               inlineStyle="#{node2.onSelectedPath ? 'font-weight:bold;' : ''}">
            <f:attribute name="node" value="#{node2}"/>
          </af:commandImageLink>
        </af:panelList>
      </af:iterator>
    </af:panelGroupLayout>
  </af:iterator>
  <af:spacer id="sp3" height="20px"/>
</af:panelGroupLayout>

10.11.1.5 ナビゲーション・モデルをツリーとしてレンダリングする方法

ポータルのナビゲーションを視覚化するには、ツリー構造による方法もあります。ナビゲーション・ツリーは、通常、ページの横にリストされるため、ナビゲーション階層全体を表示するには便利な方法です。ユーザーは、ナビゲーションの任意のノードにすぐにナビゲートできます。ツリー構造を使用する場合、リンクの簡単なリストに比べて、ユーザーがナビゲーション・モデルの様々なノードの展開と折りたたみを行えるという利点があります。

ページまたはページ・テンプレートにツリー構造を含めるには、ADF Faces treeナビゲーション・コンポーネントをナビゲーション・モデルにバインドできます。この方法を例10-12に示します。この例では、ナビゲーション階層の第2レベルがデフォルトで縮小されていますが、ユーザーはアイコンを使用してノードを開き、子を表示できます。

例10-12 ツリーとしてのナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp2" height="20px"/>              
  <af:tree id="tree1" var="node" initiallyExpanded="true"
           value="#{navigationContext.currentNavigationModel.treeModel['includeStartNode=false']}">
    <f:facet name="nodeStamp">
      <af:commandImageLink id="cil2" text="#{node.title}"
                           actionListener="#{navigationContext.processAction}"
                           action="pprnav"
                           icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                           disabled="#{not node.navigable}"
                           inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">
        <f:attribute name="node" value="#{node}"/>
      </af:commandImageLink>
    </f:facet>
  </af:tree>
  <af:spacer id="sp3" height="20px"/>
</af:panelGroupLayout>

10.11.1.6 ナビゲーション・モデルを3レベルのメニューとしてレンダリングする方法

ナビゲーションをメニューとしてレンダリングすることもできます。メニューには、最上位レベルのナビゲーションが表示されます。ユーザーが特定のノード上にマウスを置くと、そのノードが子を持つ場合、子はポップアップ・メニューで表示されます。

図10-5は、現在のナビゲーション・モデルのリスト・モデルを取得し、そのモデルをページに垂直にレンダリングしています。コードはナビゲーション・モデルを反復します。ノードに子が含まれる場合、別のイテレータがその子を反復します。子を持たないノードは、メニュー・アイテムとしてレンダリングされます。第2レベルのナビゲーション・モデルでは、いずれかのノードが子を持つ場合、また別のイテレータが実行されます。繰り返しになりますが、子を持たないノードは、メニュー・アイテムとしてレンダリングされます。第3レベルのナビゲーション・ノードでは、ノードはメニュー・アイテムとしてレンダリングされます。ナビゲートできないノードはリンクとしてレンダリングされません。現在選択されているノードは太字で表示されます。

例10-13 メニューとしてのナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp1" height="20px"/>
  <af:menuBar id="mb1">
    <af:iterator id="i1"
                 value="#{navigationContext.currentNavigationModel.listModel['startNode=/, 
                       includeStartNode=false']}"
                 var="node">
      <af:switcher id="s1"
                   facetName="#{empty node.children ? 'leafNode' : 'parentNode'}">
        <f:facet name="parentNode">
          <af:menu id="m1" text="#{node.title}"
                   inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">
            <af:iterator id="i2" value="#{node.children}"
                         var="node2">
              <af:switcher id="s2"
                           facetName="#{empty node2.children ? 'leafNode' : 'parentNode'}">
                <f:facet name="parentNode">
                  <af:menu id="m2" text="#{node2.title}"
                           inlineStyle="#{node2.onSelectedPath ? 'font-weight:bold;' : ''}">
                    <af:iterator id="i3" value="#{node2.children}"
                                 var="node3">
                      <af:commandMenuItem id="cml3"
                                          text="#{node3.title}"
                                          actionListener="#{navigationContext.processAction}"
                                          action="pprnav"
                                          icon="#{node3.attributes[pageFlowScope.tnBean.iconKey]}"
                                          disabled="#{not node3.navigable}"
                                          inlineStyle="#{node3.onSelectedPath ?
                                                      'font-weight:bold;' : ''}">
                        <f:attribute name="node" value="#{node3}"/>
                      </af:commandMenuItem>
                    </af:iterator>
                  </af:menu>
                </f:facet>
                <f:facet name="leafNode">
                  <af:commandMenuItem id="cml1"
                                      text="#{node2.title}"
                                      actionListener="#{navigationContext.processAction}"
                                      action="pprnav"
                                      icon="#{node2.attributes[pageFlowScope.tnBean.iconKey]}"
                                      disabled="#{not node2.navigable}"
                                      inlineStyle="#{node2.onSelectedPath ?
                                                  'font-weight:bold;' : ''}">
                    <f:attribute name="node" value="#{node2}"/>
                  </af:commandMenuItem>
                </f:facet>
              </af:switcher>
            </af:iterator>
          </af:menu>
        </f:facet>
        <f:facet name="leafNode">
          <af:commandMenuItem id="cml2" text="#{node.title}"
                              actionListener="#{navigationContext.processAction}"
                              action="pprnav"
                              icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                              disabled="#{not node.navigable}"
                              inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">
            <f:attribute name="node" value="#{node}"/>
          </af:commandMenuItem>
        </f:facet>
      </af:switcher>
    </af:iterator>
  </af:menuBar>
  <af:spacer id="sp3" height="20px"/>
</af:panelGroupLayout>

10.11.1.7 ナビゲーション・モデルをブレッドクラムとしてレンダリングする方法

ユーザーがポータル・ナビゲーション内で自身の位置をすばやく判断できるように、ページにブレッドクラムの証跡を提供できます。ブレッドクラムは、ポータル内の現在位置と、その位置に到達するまでのナビゲーション経由のパスを示します。ユーザーは、そのパスに従って任意のポイントにすぐに戻ることができます。ブレッドクラムは、通常、他のフォームのナビゲーションに加えてページ上で使用されます。

ページまたはページ・テンプレートにブレッドクラムを含めるには、ADF Faces breadCrumbsナビゲーション・コンポーネントをナビゲーション・モデルにバインドできます。この方法を例10-14に示します。

例10-14 ブレッドクラムとしてのナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp1" height="20px"/>
  <af:breadCrumbs id="bc1" var="node"
                  value="#{navigationContext.currentNavigationModel.menuModel[
                        'includeStartNode=false']}">
    <f:facet name="nodeStamp">
      <af:commandNavigationItem id="cil1" text="#{node.title}"
                                actionListener="#{navigationContext.processAction}"
                                action="pprnav"
                                icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                                disabled="#{not node.navigable}">
        <f:attribute name="node" value="#{node}"/>
      </af:commandNavigationItem>
    </f:facet>
  </af:breadCrumbs>
  <af:spacer id="sp2" height="20px"/>
</af:panelGroupLayout>

10.11.1.8 マスター/ディテール・ナビゲーションのレンダリング方法

ポータルでは、多くの場合、マスター/ディテール・ナビゲーションの視覚化が提供されます。たとえば、ページの上部にタブとして表示され、各タブにはページの横にツリー構造として表示される追加のナビゲーションがあります。

例10-15のマスター/ディテール・ナビゲーションでは、マスターおよびディテール・ナビゲーションに同じナビゲーション・モデルが使用されます。マスター・ナビゲーションは、最上位レベルのナビゲーション・モデルを、ページ上部のリンクのリストとしてレンダリングします。ディテール・ナビゲーションは、現在選択されている最上位レベルのノードの子をツリーとしてレンダリングします。


ヒント:

次の例でc:setタグが正しく機能するためには、jsp:rootタグに次の内容を追加して、JSTLライブラリを組み込む必要があります。
xmlns:c="http://java.sun.com/jsp/jstl/core"

例10-15 単一のナビゲーション・モデルを使用したマスター/ディテール・ナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp1" height="20px"/>
  <!-- Master -->
  <af:navigationPane id="np1" var="node" hint="bar" level="1"
                     value="#{navigationContext.navigationModel[
                           'modelPath=/oracle/webcenter/portalapp/navigations/master-detail']
                           .defaultMenuModel}">
    <f:facet name="nodeStamp">
      <af:commandNavigationItem id="cil1" text="#{node.title}"
                                actionListener="#{navigationContext.processAction}"
                                action="pprnav"
                                icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                                disabled="#{not node.navigable}"
                                inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">

        <f:attribute name="node" value="#{node}"/>
      </af:commandNavigationItem>
    </f:facet>
  </af:navigationPane>
  <af:spacer id="sp2" height="20px"/>
  <!-- Setup the parameters for detail query -->
  <c:set value="startNode=/${navigationContext.navigationModel[
               'modelPath=/oracle/webcenter/portalapp/navigations/master-detail']
               .currentSelection.prettyUrlPath[1]}, includeStartNode=false"
         var="currSel" scope="session"/>
  <!-- Detail -->
  <af:tree id="tree1" var="node2" initiallyExpanded="true"
           value="#{navigationContext.navigationModel[
                 'modelPath=/oracle/webcenter/portalapp/navigations/master-detail']
                 .treeModel[currSel]}">
    <f:facet name="nodeStamp">
      <af:commandImageLink id="cil2" text="#{node2.title}"
                           actionListener="#{navigationContext.processAction}"
                           action="pprnav"
                           icon="#{node2.attributes[pageFlowScope.tnBean.iconKey]}"
                           disabled="#{not node2.navigable}"
                           inlineStyle="#{node2.onSelectedPath ? 'font-weight:bold;' : ''}">
        <f:attribute name="node" value="#{node2}"/>
      </af:commandImageLink>
    </f:facet>
  </af:tree>
  <af:spacer id="sp3" height="20px"/>
</af:panelGroupLayout>

前述の例は、2つの異なるナビゲーション・モデル(マスター・ナビゲーション用とディテール・ナビゲーション用)を使用するように記述することもできます。例10-16にその方法を示します。

例10-16 複数のナビゲーション・モデルを使用したマスター/ディテール・ナビゲーション

<af:panelGroupLayout id="pgl1" layout="vertical">
  <af:spacer id="sp1" height="20px"/>
  <!-- Master -->
  <af:navigationPane id="np1" var="node" hint="bar" level="1"
                     value="#{navigationContext.navigationModel[
                           'modelPath=/oracle/webcenter/portalapp/navigations/master']
                           .defaultMenuModel}">
    <f:facet name="nodeStamp">
      <af:commandNavigationItem id="cil1" text="#{node.title}"
                                actionListener="#{navigationContext.processAction}"
                                action="pprnav"
                                icon="#{node.attributes[pageFlowScope.tnBean.iconKey]}"
                                disabled="#{not node.navigable}"
                                inlineStyle="#{node.onSelectedPath ? 'font-weight:bold;' : ''}">
        <f:attribute name="node" value="#{node}"/>
      </af:commandNavigationItem>
    </f:facet>
  </af:navigationPane>
  <af:spacer id="sp2" height="20px"/>
  <!-- Setup the parameters for detail query -->
  <c:set value="startNode=/${navigationContext.navigationModel[
               'modelPath=/oracle/webcenter/portalapp/navigations/master']
               .currentSelection.prettyUrlPath[1]}, includeStartNode=false"
         var="currSel" scope="session"/>
  <!-- Detail -->
  <af:tree id="tree1" var="node2" initiallyExpanded="true"
                      value="#{navigationContext.navigationModel[
                            'modelPath=/oracle/webcenter/portalapp/navigations/master']
                            .treeModel[currSel]}">
    <f:facet name="nodeStamp">
      <af:commandImageLink id="cil2" text="#{node2.title}"
                           actionListener="#{navigationContext.processAction}"
                           action="pprnav"
                           icon="#{node2.attributes[pageFlowScope.tnBean.iconKey]}"
                           disabled="#{not node2.navigable}"
                           inlineStyle="#{node2.onSelectedPath ? 'font-weight:bold;' : ''}">
        <f:attribute name="node" value="#{node2}"/>
      </af:commandImageLink>
    </f:facet>
  </af:tree>
  <af:spacer id="sp3" height="20px"/>
</af:panelGroupLayout>

10.11.2 ナビゲーションREST APIの使用

Oracle WebCenter Portalには、アプリケーションのナビゲーション・モデルにアクセスするためのREST APIが用意されています。ナビゲーションREST APIを使用して、ナビゲーション・モデルを視覚化するために使用されるインタフェースにアクセスします。RESTは、一般的にクライアント側でスクリプト化されるリッチ・インターネット・アプリケーションの作成時に使用され、サーバー側アプリケーションからのデータと対話する機能を必要とします。たとえば、Oracle WebCenter Portal iPhoneアプリケーションは、REST APIを使用してPortal Frameworkアプリケーションと対話します。

REST APIの概要は、第53章「Oracle WebCenter Portal REST APIの使用」を参照してください。

ナビゲーションREST APIにアクセスするには、次のようにURLを作成します。

http://host:port/<ApplicationContextRoot>/api/navigations/default-navigation-model 

ここで、hostとportはポータルが実行されているサーバーのホスト名とポート番号、<ApplicationContextRoot>はポータル・アプリケーションのコンテキスト・ルートです。例:

http://localhost:7101/MyPortalApplication-Portal-context-root/api/navigations/default-navigation-model

このリクエストに対するレスポンスにより、次のresourceTypeのリンク要素で識別される、ナビゲーションREST APIのエントリ・ポイントURI (href)が提供されます。

urn:oracle:webcenter:navigations

GETリクエストをこのエントリ・ポイントURIに送信すると、アプリケーション内にナビゲーション・モデルのリストが返されます。たとえば、次のようになります。

<sitestructure>
  ...
  <navigation-list>
    oracle/webcenter/siteresources/scopedMD/s8bba98ff_4cbb_40b8_beee_296c916a23ed/
    navigations/default-navigation
  </navigation-list>
  <navigation-list>
    oracle/webcenter/siteresources/scopedMD/s8bba98ff_4cbb_40b8_beee_296c916a23ed/
    navigations/admin-navigation
  </navigation-list>
  <navigation-list>
    oracle/webcenter/siteresources/scopedMD/s8bba98ff_4cbb_40b8_beee_296c916a23ed/
    navigations/myNavigation
  </navigation-list>
  ...
</sitestructure>

この情報を使用すると、表10-5にリストされるURIで、特定のナビゲーション・モデルとその中にあるノードに関する情報の取得を開始できます。表10-5に示したURIを、URLのhttp://host:port/<ApplicationContextRoot>の部分に追加して、目的のRESTエンドポイントにアクセスできます。

表10-5 ナビゲーションのREST URIモデル

REST URI 戻り値
.../api/navigations

アプリケーションのすべてのナビゲーション・モデル。

.../api/navigations/default-navigation-model

デフォルトのナビゲーション・モデルのプロパティ。

.../api/navigations/pathToModel/modelId

指定したナビゲーション・モデル(modelId)のプロパティ。

.../api/navigations/pathToModel/modelId/resources

指定したナビゲーション・モデル(modelId)のすべてのルート・リソース。

.../api/navigations/pathToModel/modelId/resources/pathToResource/resourceId

指定したナビゲーション・モデル(modelId)の指定したリソース(resourceID)。

...api/navigations/pathToModel/modelId/resources/pathToResource/resourceId/children

指定したナビゲーション・モデル(modelId)の指定したリソース(resourceId)の子をすべてリストするナビゲーション・ツリー。

.../api/navigations/pathToModel/modelId/resources/pathToResource/resourceId/children?depth=dep

指定したナビゲーション・モデル(modelId)の指定したレベル(dep)までの指定のリソース(resourceId)の子をリストするナビゲーション・ツリー。


それぞれのナビゲーション可能ノードにprettyURL要素が存在し、この要素を使用してナビゲーション・モデル階層をさらに深く掘り下げることができます。

10.11.3 ポータル・ナビゲーションの視覚化のヒント

ポータル・ナビゲーション・モデルを視覚化する際には、次のことを考慮してください。

  • ページまたはページ・テンプレートを編成するには、HTML divタグとspanタグではなく、ADF Facesレイアウト・コンポーネントを使用します。詳細は、『Oracle Application Development Framework Webユーザー・インタフェース開発者ガイド』の「Webページ上のコンテンツの編成」を参照してください。

  • Portal Frameworkアプリケーションが一般向けの場合、または検索エンジンの最適化を有効にする場合は、goLinkPrettyUrlメソッドと組み合せてaf:goLinkコンポーネントを使用して、ナビゲーションの視覚化を追加します。goButtongoImageLinkおよびgoMenuItemなどの他のバリエーションも使用できます。

    例:

    <af.goLink
      destination="#{navigationContext.defaultNavigationModel.node['pagePath']
                   .goLinkPrettyUrl"}
      text="mylink" />
    
  • スキンを使用してスタイル、装飾イメージおよび形状を管理します。

  • ページ・テンプレートを選択するには、adf-config.xml内でデフォルト・ページ・テンプレート設定を使用するか、個々のナビゲーション・リンクに対して「ページ・テンプレートでのURLのレンダリング」オプションを使用します。

  • af:commandLinkコンポーネントまたはcommandButtoncommandMenuItemなどの他のバリエーションを使用する場合、ポータル・ナビゲーションを表示するには、PPRナビゲーションではなく、次のweb.xmlパラメータを使用してADFフレームワークを強制的にリダイレクトする必要があります。

    oracle.adf.view.rich.pprNavigation.OPTIONS
    oracle.webcenter.navigationframework.REDIRECT_OPTIONS
    

    詳細は、10.12項「コンテキスト・パラメータの設定」を参照してください。

詳細は、Oracle WebCenter & ADF Architecture Teamのブログを参照してください。

10.12 コンテキスト・パラメータの設定

af.CommandLinkコンポーネントを使用してポータル・ナビゲーションを表示する場合、部分ページ・リフレッシュ(PPR)を使用するかわりにweb.xmlファイルのoracle.adf.view.rich.pprNavigation.OPTIONSコンテキスト・パラメータを設定してADFフレームワークを強制的にリダイレクトする必要があります。

アプリケーションでPPRが使用されていない場合、ユーザーがナビゲーション・モデルのノードにナビゲートするたびに、ブラウザのURLが変更されます。しかし、ブラウザで表示されているURLは現在のページを示さず、最後に表示されたページのURLが表示されます。

ブラウザで現在のページのURLを表示できるようにするには、web.xmlファイルでoracle.webcenter.navigationframework.REDIRECT_OPTIONSコンテキスト・パラメータを設定します。


注意:

oracle.webcenter.navigationframework.REDIRECT_OPTIONSコンテキスト・パラメータを設定すると、ナビゲーションごとにリクエスト/レスポンスが追加され、パフォーマンスに影響を及ぼします。

コンテキスト・パラメータを設定するには、

  1. アプリケーション・ナビゲータで、web.xmlファイルを右クリックし、「開く」を選択します。

  2. 概要エディタで、「コンテキスト初期化パラメータ」セクションを開きます。

  3. コンテキスト初期化パラメータの作成アイコンをクリックします。

  4. 「名前」フィールドにoracle.adf.view.rich.pprNavigation.OPTIONSと入力します。

  5. 「値」フィールドにoffと入力します。

    これにより、web.xmlファイルに次のように追加されます。

    <context-param>
      <param-name>oracle.adf.view.rich.pprNavigation.OPTIONS</param-name>
      <param-value>off</param-value>
    </context-param>
    
  6. 「名前」フィールドに、oracle.webcenter.navigationframework.REDIRECT_OPTIONSと入力します。

  7. 「値」フィールドに、toPrettyURLと入力します。

    これにより、web.xmlファイルに次のように追加されます。

    <context-param>
     <param-name>oracle.webcenter.navigationframework.REDIRECT_OPTIONS</param-name>
     <param-value>toPrettyURL</param-value>
    </context-param>
     
    
  8. web.xmlファイルを保存します。

10.13 ナビゲーション・モデルを使用したサイトマップの作成

検索エンジンがWebサイトをクロールすると、標準リンクのHTML(<a href="url">text</a>など)を解析します。ただし、ADFベースのWebサイトでは、リンクがJavaScriptとして生成されます。このため、これらをブラウザで実行すると、ページの変更やナビゲーションが生じます。これらのJavaScriptリンクは、検索エンジンで解釈できません。

GoogleやBingなど、一般的な一部の検索エンジンではサイトマップがサポートされます。サイトマップは、サイトのURLと、各URLに関する追加メタデータ(たとえば、URLが最終更新された場合、通常のその変更頻度、サイトの他のURLと比較した重要度など)をリストするXMLファイルであるため、検索エンジンはさらに知的にサイトをクロールできます。サイトマップを検索エンジンに送信したり、robots.txtファイルで参照することで、索引用にページのリストを検索エンジンに送ることができます。

サイトマップの詳細を参照するには、次の場所に移動してください:

http://sitemaps.org/

Portal Frameworkアプリケーションでは、サイトマップURLを指定できます。このURLを検索エンジンに登録すると、そのアプリケーションでページ・セットへの索引付けが行われます。検索エンジンのユーザー・エージェントが、GoogleのgooglebotまたはMicrosoftのbingbotなどADFでサポートされるエージェントと一致するする場合、リクエストに対してJavaScriptではなくHTMLが返されます。

例10-17に示すように、アプリケーションのサイトマップは、ナビゲーション・モデルに基づき作成できます。

例10-17 サイトマップの作成

<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="2.1"
          Xmlns:f=http://java.sun.com/jsf/core">
  <jsp:directive.page contentType="text/xml;charset=UTF-8" />
  <f:view>
    ${navigationContext.defaultNavigationModel.defaultSiteMap}
  </f:view>
</jsp:root>

10.14 動的なロケールの切替

WebCenter Navigation Modelでは、Titleなどの特定のテキスト文字列のローカライゼーションがサポートされます。リソース・バンドル・ベースの文字列の設定はナビゲーション・モデル・エディタを通じて構成されます。詳細は、第14.3.9項「リソース・カタログまたはリソースの表示オプションの設定方法」を参照してください。

文字列が定義され、サポートされているロケールでアプリケーションが構成されると、ブラウザ言語設定を切り替えるときに変更を表示できます。ただし、これは実装は簡単ですが、要件がドロップダウン・リストなどのユーザー操作で動的にロケールを切り替えることである場合、その要件をサポートするためにカスタム・コードを作成する必要があります。この項では、この要件に可能な解決策を示します。この項では、アプリケーションの別のロケールをサポートするようにface-config.xmlファイルがすでに変更されていることを想定しています。詳細は、第75章「複数言語に対応したポータルの構築」を参照してください。

解決例

この例ではADF af:selectOneChoice (SOC)コンポーネントを含み、このコンポーネントはロケールの動的切替をするユーザー操作を使用可能にする機能を持ちます。SOCは2つの重要な機能を提供するマネージドBeanに関連付けらます。1つの機能はユーザーのロケール選択を格納する機能で、もう1つの機能はvalueChangeEventリスナー・メソッドを提供することで新しいロケールの設定を使用可能にする機能です。この例では、新しいロケールは変数に格納され、valueChangeEventによってアクセスされます。

Locale preferredLocale

public void listChanged(ValueChangeEvent valueChangeEvent) {
   String locale = valueChangeEvent.getNewValue().toString();
   changeLocale(locale);
   setCurrentLocale(locale);
  setPreferredLocale(FacesContext.getCurrentInstance().getViewRoot().getLocale());
}

また、このメソッドはchangeLocaleメソッドをコールし、これは現在のビューを更新する役割を果します。

private void changeLocale(String lang) {
   Locale newLocale = new Locale(lang);
   FacesContext fctx = FacesContext.getCurrentInstance();
   fctx.getViewRoot().setLocale(newLocale);
   resetPage();
}

次に、このメソッドはresetPage()をコールしてロケール変更を終了します。

public void resetPage() {
   FacesContext context = FacesContext.getCurrentInstance();
   UIViewRoot root = context.getViewRoot();
   _returnViewId = root.getViewId();
   if (_returnViewId == null)
      return;
   ExternalContext external = context.getExternalContext();
   Application application = context.getApplication();
   ViewHandler viewHandler = application.getViewHandler();
   String actionURL = viewHandler.getActionURL(context, _returnViewId);
   actionURL = external.encodeActionURL(actionURL);
   try {
      external.redirect(actionURL);
   } catch (IOException e) {
      String message = e.getMessage();
      // to do ...
   }
}

コードが切替を扱うよう準備が整ったため、次の手順は動的切替を使用可能にすることです。この動作はマネージドBeanから新しいロケールを取得するようにカスタムPhase Listenerを実装して、UIViewRootにこのロケールを設定して使用できるようにすることで実現できます。これを処理するコードは、上書きされたbeforePhase()メソッドにあります。


注意:

コード例は最適化されていないため、パフォーマンス競合を含む可能性があります。

SiteStructureContextを使用するコードは、この例の注目点で、ナビゲーション・モデルが更新されていることを確認するために必要です。それ以外の場合は、モデル(ロケール)はブラウザ設定によってのみ更新できます。

public void beforePhase(PagePhaseEvent pagePhaseEvent) {
   Integer phase = pagePhaseEvent.getPhaseId();
   if (phase.equals(ADFLifecycle.PREPARE_MODEL_ID)) {
   FacesContext fctx = FacesContext.getCurrentInstance();
   ChangeLocale changeLocale =
      ChangeLocale)fctx.getApplication().evaluateExpressionGet
      (fctx,"#{ChangeLocale}", Object.class);
   Locale preferredLocale = changeLocale.getPreferredLocale();
   UIViewRoot uiViewRoot = fctx.getCurrentInstance().getViewRoot();
   if (preferredLocale == null) {
       changeLocale.setPreferredLocale(uiViewRoot.getLocale());
   } else {
       uiViewRoot.setLocale(preferredLocale);
   }
   try { 
      SiteStructureContext ctx = SiteStructureContext.getInstance();
      SiteStructure model = ctx.getDefaultSiteStructure();
      model.invalidateCache();
    } catch (ResourceNotFoundException rnfe) {
        rnfe.printStackTrace();
    }
 }
}