プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebCenter Sitesでの開発
12c (12.2.1.2.0)
E82734-02
目次へ移動
目次

前
次

20 テンプレートおよびCSElementのエレメントのコーディング

エレメントは、コンテンツを指定、抽出および表示するコードを提供します。WebCenter Sitesシステムではコンテンツがアセットとして格納されるため、エレメントのXMLまたはJSPコードの大部分は適切なコンテキストに適したアセットを識別し、該当するアセットのデータを抽出して表示するためのものになります。

トピック:

アセット自体の作成の詳細は、「テンプレート・アセット、CSElementアセットおよびSiteEntryアセットの作成」を参照してください。

20.1 依存性について

WebCenter Sitesシステムは、正しく機能するために、承認依存性および構成依存性を追跡し、利用します。構成依存性が正確にログに記録されるようにエレメントをコーディングし、さらに静的サイトを設計している場合には承認依存性も適切に設定します。

  • 承認依存性は、承認済アセットをパブリッシュできるかどうかを決定する条件です。

    承認システムは、アセットの承認時、そのアセットの承認依存性を計算します。同じく承認する必要のある依存アセットが存在する場合、親アセットはパブリッシュされません。

  • 構成依存性。ページ構成の依存性を表します。これらは、アセットがレンダリングされるページおよびページレットと、そのアセットとの間の依存性であり、ページを再生成する必要があるかどうかを決定します。

    WebCenter Sitesサーブレットは、ページをレンダリングする際に構成依存性をログに記録します。CacheManagerは、この依存性ログを調べて、キャッシュされたページをいつ再生成するのかを決定します。ディスクへのエクスポートのパブリッシュ方法は、この依存性ログを調べて、エクスポートされたページ・ファイルをいつ再生成する必要があるのかを決定します。

次のトピックを参照してください。

20.1.1 パブリッシュ・システムと承認依存性

管理システム上で作業するパブリッシャ、エディタおよびコンテンツ・プロバイダは、ターゲット宛先にパブリッシュされるアセットを承認します。次にパブリッシュ・システムは、管理チームがWebCenter Sitesシステムに対して設定したスケジュールに従って、バックグラウンド・プロセスとして承認済アセットを自動的にパブリッシュします。

アセットをパブリッシュできるのは、そのアセットがすべての指定された承認依存性を満たしている場合のみです。つまり、すべての関連付けられたアセットが承認済であるか事前にパブリッシュされている必要があります。そうでない場合は、それらの依存性が満たされるまで、つまり依存(関連)アセット自体が同じ宛先へのパブリッシュについて承認されるまで、そのアセットのパブリッシュは保留されます。

この承認プロセスが実行されることで、コンテンツ・チームと編集チームは、アセットの依存性を手動で確認してから大量の関連アセットをパブリッシュするという作業から解放されます。また、アセットのパブリッシュ後にオンライン・サイト上に壊れたリンクが存在している可能性もなくなります。

その後アセットが変更されると、そのアセットは承認済とは見なされなくなるため、再パブリッシュ可能にするには再び承認する必要があります。

この項には次のトピックが含まれます:

20.1.1.1 承認依存性の計算

承認依存性は、対象アセットの承認時に記録されます。これらの承認依存性は、WebCenter Sitesデータベース内のApprovedAssetDeps表に書き込まれます。

アセットの承認ステータスは、そのアセットの依存性および関連付けられたアイテムの依存性によって決定されます。前者の依存性には、特定のアセット・アイテムと関連付けられたすべてのアセット・アイテムの承認ステータスが含まれます。

依存性の計算は、パブリッシュ方法に依存します。

  • ディスクへのエクスポートの場合は、承認システムは、対象アセットに割り当てられたテンプレート、またはそのタイプのアセットのデフォルト承認テンプレート(指定されている場合)を使用して、そのアセットをレンダリングします。テンプレート・コード内のタグによって、承認済アセットの適切な依存アセットを決定する承認依存性が設定されます。現在のアセットをパブリッシュするためには、これらの依存アセットが適切な承認状態になっている必要があります。

  • サーバーへのミラーリングまたはXMLへのアセットのエクスポートの場合は、承認プロセスはアセット・タイプ間のデータ関係を調べます。ベーシック・アセットはアソシエーションを持っています。フレックス・アセットはファミリ関係を持っています。これらの関係はどちらも、これらのパブリッシュ方法の承認依存性を作成します。たとえば、フレックス・アセットを承認した場合は、そのフレックス・アセットの親アセットが適切な承認状態になるまでは、そのフレックス・アセットはパブリッシュ・セッションの対象になりません。

20.1.1.2 Exists、ExactおよびNone

承認依存性は、existsexactおよびnoneのいずれかです。この項では、それぞれの承認タイプについて説明します。

CSElementアセットとSiteEntryアセット、埋込みリンクと埋込みページレットおよびOracle WebCenter Sites: Engage訪問者データ・アセットの承認依存性タイプを変更することはできません。フレックス属性を除いて(フレックス属性の依存性タイプはその属性の作成時に設定する)、フレックス・ファミリ・アセット・タイプの承認依存性タイプも変更できません。ベーシック・アセット・タイプの場合、それらに関連付けられたアセットの承認依存性のタイプは、アソシエーション・フィールドの構成時に設定します。

使用しているパブリッシュ方法がディスクへのエクスポートの場合、ページのレンダリング時に構成依存性を設定するタグは、承認システムがアセットをパブリッシュできるかどうかを計算する際に承認依存性も作成します。記述するコードによって、他のアセット用に生成されたページレットに対する承認依存性が設定される場合は、承認タイプをexists、exactまたはnoneに設定できます。

注意:

様々なタイプのアセット間の関係によって生じる承認依存性のタイプについては、『Oracle Fusion Middleware Oracle WebCenter Sitesの管理』のパブリッシュの管理に関する項を参照してください。

exists

exists依存性の場合は、依存アセットがターゲット上に存在していることのみが必要であり、そのアセットのバージョンは問われません。exists依存性の場合は、子アセットが変化した場合でも(すなわちその子アセットが承認済でなくなった場合でも)、その子アセットが以前に承認されて同じ宛先にパブリッシュされていた場合は、承認済の親アセットをパブリッシュできます。

たとえば、次の手順では、コレクション・アセットは自身のランク付けされた子とのexists関係を持っています。

  • あるコレクションとそのコレクションのランク付けされた記事すべてが承認されてターゲットにパブリッシュされます。

  • ランク付けされた記事のいずれかが再び編集されますが、承認はされません。

  • このコレクション全体が再び編集されて、承認されて、宛先にパブリッシュされます。

    変更されたが承認されていない記事の前のバージョンが存在(exists)しているため、この記事が原因でこのコレクションのパブリッシュが保留されることはありません。

ただし、次の例では、自身の記事とのexists依存性を持つコレクションをパブリッシュできません。

  • あるコレクションとそのコレクションのランク付けされた記事すべてが承認されますが、パブリッシュはされません。

  • ランク付けされた記事のいずれかが再び編集されます。

編集された記事は宛先に一度もパブリッシュされなかったため、この記事はその宛先に対してまだ存在しておらず、したがってそのコレクションをパブリッシュできません。このコレクション・アセットは保留されて、このコレクションをパブリッシュするには、このコレクションと編集された記事の両方が承認される必要があります。

exists承認タイプは、一般にリンクに対して有用です。

exact

exact依存性の場合は、依存アセットとターゲット上のアセットのバージョンは一致している必要があります。異なるバージョンの承認済アセットであってはいけません。exact依存性の場合は、宛先上の子アセットのバージョンと親アセットのバージョンが一致しない場合は、親アセットをパブリッシュできません。

次の例では、ページ・アセットは自身の記事アセットとのexact依存性を持っています。

  1. あるページ・アセットとそのアセットの記事アセットすべてが承認されて宛先にパブリッシュされます。

  2. これらの記事のいずれかが再び編集されますが、再承認はされません。

  3. このページ・アセットが編集されて再承認されます。

    このページ・アセットは保留されて、WebCenter Sitesインタフェース上で生成されるフォームには、このページ・アセットをパブリッシュ可能にするために承認される必要のあるアセットのリストへのリンクが表示されます。このリストでは、編集されたが再承認されていない記事が表示されます。

  4. 編集された記事が承認されます。

    このページ・アセットは承認されているため、この時点でパブリッシュできます。この記事とページ・アセットのバージョン・スタンプが一致するからです。

  5. このページ・アセットと関連付けられた別の記事アセットが編集されます。

  6. このページ・アセットと編集された記事アセットの両方が再承認される必要があります。これら2つのバージョン・スタンプが一致しないからです。

    • この記事は編集されたがまだ再承認されていないため、再承認される必要があります。

    • このページ・アセットは、この記事の異なるバージョンに対する依存性に基づいてその前に承認されたため、再承認される必要があります。

exact承認タイプは、一般に埋込みコンテンツに対して有用です。

none

none依存性の場合は、依存アセットの承認状態にかかわらず、承認済アセットをパブリッシュできます。承認依存性タイプをnoneに設定するには、承認依存性を設定するタグにDEPTYPEパラメータを追加して、そのパラメータをnoneに設定します。

DEPTYPEnoneという設定は、承認依存性のみに影響します。ディスクへのエクスポートのプロセスによってページが生成されてタグが呼び出されると、構成依存性がログに記録されます。ただし、承認システムが計算時にタグを呼び出すときは、承認依存性はログに記録されません。

20.1.1.3 ディスクへのエクスポート用の承認テンプレート

ディスクへのエクスポートのパブリッシュ方法を使用するパブリッシュの宛先に対してアセットが承認されると、承認システムはアセットに割り当てられたテンプレートを調査して、その依存性を判別します。

ただし、ディスクへのエクスポートによってアセットが実際にパブリッシュされる際に、必ずしもそのアセットに割り当てられているテンプレートが使用されるわけではありません。なぜでしょうか。なぜなら、別のエレメントのコードによって、特定のケースではそのアセットに別のテンプレートが使用されていると判断される可能性があるからです。

コンテキストに応じて様々なテンプレートでレンダリングできるアセットがあるサイトについて考えてみます。では、このアセットのパブリッシュを承認する場合、承認プロセスで依存性を判断するためにどのテンプレートを使用する必要があるでしょうか。それは、すべてのテンプレートの最も代表的な一連の依存性が含まれるテンプレートです。開発者は、各タイプのアセットのすべての考えられる依存性が含まれた特別なテンプレートを作成できます。

最も代表的な一連の依存性が含まれるテンプレートが、アセットに割り当てることを希望するテンプレートではない場合はどうでしょうか。その場合は、前者のテンプレートをそのタイプのアセットのデフォルト承認テンプレートとして設定してください。

デフォルト承認テンプレートは、アセット・タイプごとおよびパブリッシュ宛先ごとに設定できます。この機能にツリー内でアクセスするには、「管理」タブを選択し、次に「パブリッシュ」「宛先」「MyStaticDestinationName」,→「デフォルト・テンプレートの設定」を選択します。

注意:

サーバーへのミラーリングのパブリッシュ方法を使用している宛先上のアセット・タイプのデフォルト承認テンプレートを指定した場合は、そのテンプレートは、「アセットのステータス」画面でそのアセットをプレビューする際に使用されますが、そのアセットが承認またはパブリッシュされる際には使用されません。

20.1.1.4 サブタイプ、フレックス定義および承認テンプレート

静的サイト用にフレックス・アセットを使用している場合は、複数のデフォルト承認テンプレートをファミリ内のそのフレックス・アセット・タイプに割り当てることができます。フレックス定義ごとに異なるデフォルト承認テンプレートを指定できます。

ベーシック・アセットの場合は、サブタイプ機能を使用すると、1つのアセット・タイプのアセットをさらに細かくカテゴリ分けできます。この機能を使用して、他のなんらかの編成構成に基づいて、特定タイプのアセット用に複数のデフォルト承認テンプレートを割り当てることができます。

たとえば、スポーツ記事の承認テンプレートは、海外ニュース記事の承認テンプレートとはおそらく異なるでしょう。この場合は、記事アセット・タイプに対してスポーツのサブタイプと海外ニュースのサブタイプを作成してから、このアセット・タイプの各サブタイプに異なる承認テンプレートを割り当てることができます。

ベーシック・アセットのサブタイプは、通常はアセット・タイプの作成時にアセット記述子ファイル内で作成しますが、アセット・タイプの作成後にサブタイプが必要になった場合は、「一般的な管理」ツリー内の「管理」ノードの下の「アセット・タイプ」オプションを使用して作成します。サブタイプをアセットに割り当てるには、「新規」および「編集」アセット・フォームを使用します。前述のとおり、フレックス・アセットは、それらのフレックス定義というサブタイプを持っています。

ベーシック・アセットのサブタイプの構成の詳細、およびサブタイプ全般の詳細は、「ベーシック・アセット・タイプの設計」を参照してください。

20.1.2 ページの生成と構成依存性

構成依存性は、次のようないくつかの方法で記録されます。

  • ディスクへのエクスポートのパブリッシュ方法は、ページをレンダリングするときに、構成依存性を適切なパブリッシュ表に記録します。そうすることで、再パブリッシュが必要になったときに、ディスクへのエクスポートのパブリッシュ方法は、どのアセットがパブリッシュ対象なのかに基づいて、再生成する必要のあるページを特定できます。つまり、これらのアセットを構成上の依存アセットとしてログに記録したすべてのページを生成します。

  • WebCenter Sitesは、ページをレンダリングおよびキャッシュする際に、依存性をEhCacheに記録します。この表の各行には、アセットのIDと、そのアセットがレンダリングされた生成済ページのIDまたはキャッシュ・キーが格納されています。

CacheManagerとページ・キャッシュ

CacheManagerは、WebCenter Sitesのページ・キャッシュをEhCacheで管理します。アセットが変更されると、アセット依存性に基づく適切なページのフラッシュおよび再生成の実行がEhCacheに通知されます。CacheManagerは、WebCenter Sitesのページ・キャッシュに変更を加えた後に、その情報をWebCenter Sitesシステムに属しているすべてのSatellite Serverに通知するとともに、共存Satellite ServerおよびシステムにインストールされたすべてのリモートSatellite Serverにも通知します。その後、Satellite Serverアプリケーションは、Satelliteページ・キャッシュを更新します。

注意:

適切な権限を持つ場合、Adminツリーの「キャッシュ」の「システム・ツール」を使用してデータを調べることができます。

20.1.2.1 CacheManagerと動的パブリッシュ・セッション

CacheManagerは、サーバーへのミラーリングのパブリッシュ・セッション時にパブリッシュ・システムと連動します。サーバーへのミラーリングのパブリッシュ・セッションが終了すると、パブリッシュ・システムは、そのパブリッシュ操作の対象に含まれていたすべてのアセットのすべてのIDのリストを、宛先システム上のCacheManagerサーブレットに提供します。

CacheManagerは、そのリストをキャッシュ内のページについてログに記録された構成依存性と照合し、ページ・キャッシュからフラッシュして再生成する必要のあるページおよびページレットを特定します。その結果に応じてWebCenter Sitesのページ・キャッシュを更新してから、ページのリストを共存SatelliteサーブレットとリモートSatelliteサーブレットに送信します。そうすることで、これらのサーブレットはこれらと同じページをフラッシュして、新しいバージョンのページをWebCenter Sitesのページ・キャッシュから取得できます。

20.1.2.2 CacheManagerとプレビュー機能

アセットをプレビューする際は(開発システムまたは管理システム上で)、WebCenter Sitesインタフェースは、そのアセットのテンプレートのページ名を実行します。ContentServerは、そのページをレンダリングおよびキャッシュして、レンダリングされたページとそのアセットの間の構成依存性をログに記録します。

CacheManagerは、アセットの保存時にプレビュー対象ページのキャッシュ済バージョンを更新します。つまり、ユーザーが「保存」をクリックすると、CacheManagerはそのアセットのオブジェクトIDを、キャッシュ内のそれらのページについてログ記録された構成依存性と照合します。次に、ページ・キャッシュ内の適切なページをクリアおよびリフレッシュして、変更されたページに関する情報をSatelliteサーブレットに通知します。

20.2 依存性をログに記録するためのコーディングについて

エレメントには、依存性を正確にログに記録するコードを忘れずに含めてください。いくつかのタグが構成依存性をログに記録できます。タグを処理する際に、WebCenter Sitesはレンダリングされたページとアセットとの間の依存性をログに記録します。

ディスクへのエクスポートのパブリッシュ方法を使用している静的サイトの場合は、構成依存性をログに記録するタグは、承認依存性もログに記録できます。アセットが承認されると、承認システムはそのアセットをレンダリングして、そのアセットをパブリッシュできるかどうかを判断します。承認依存性タイプがnoneに設定されているタグを除いて、承認システムは、これらのタグの結果をApprovedAssetDep表に記録します。Exists、ExactおよびNoneを参照してください。

以降のトピックでは、依存性をログに記録するタグをアルファベット順に紹介します。これらおよび他のタグの詳細は、『Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンス』を参照してください。

トピック:

20.2.1 ASSET.LOADおよびasset:load

WebCenter SitesASSET.LOADタグ(またはasset:load)を実行すると、ロードされたアセットの構成依存性が自動的にログに記録されます。次に例を示します。

<ASSET.LOAD TYPE="Page" NAME="target" FIELD="name" VALUE="Home"/>

このコード行は、Homeという名前のページ・アセットとこのアセットを表示しているレンダリングされたページの間の構成依存性をマークします。

承認依存性タイプの設定

ディスクへのエクスポートの宛先に対してアセットが承認されて、承認システムがこのタグをレンダリングすると、このタグによって、現在使用されているアセット間の承認依存性もログに記録されます。

デフォルトでは、ASSET.LOADの承認依存性はexactに設定されています。DEPTYPEパラメータを使用して、この依存性をexistsまたはnoneに設定できます。次に例を示します。

<ASSET.LOAD TYPE="Page" NAME="target" FIELD="name" VALUE="Home" DEPTYPE="exists"/>

20.2.2 ASSETSET (assetset)タグ・ファミリ

ASSETSETタグ・ファミリを使用して、1つ以上のフレックス・アセットのセットを作成できます。次のタグは、アセットセットを作成して、そのセット内のアセットの構成依存性を定義します。

ASSETSET.SETASSET and assetset:setasset
ASSETSET.SETEMPTY and assetset:setempty
ASSETSET.SETLISTEDASSETS and assetset:setlistedassets
ASSETSET.SETSEARCHEDASSETS and assetset:setsearchedassets

このアセットセット内のアセットがレンダリングされると、構成依存性がログに記録されます。

最初の3つのタグは、次の構成依存性を定義します。

  • アセットセット内の各フレックス・アセットとレンダリングされたページの間の依存性。

  • フレックス・アセットの親とレンダリングされたページの間の依存性。フレックス・アセットは自身のフレックス親アセットから値を継承するため、親に対する変更はその子であるフレックス・アセットへの変更を意味することがあり、その結果として、そのアセットを保持しているページの正確性が失われる可能性があります。

4つ目のタグassetset:setsearchedassetsは、検索状態の結果に基づいてアセットセットを作成します。検索状態は問合せであるため、このセット内のアセットのIDを予測することはできません。したがって、ASSETSET.SETSEARCHEDASSETSタグは、構成依存性をunknownとして定義します。構成依存性がunknownの場合は、対象ページは、ディスクへのエクスポートのパブリッシュ・セッションが実行されるたびに再生成される必要があり、サーバーへのミラーリングのパブリッシュ・セッションが終了するたびにページ・キャッシュ内で更新される必要があります(更新が必要かどうかにかかわらず)。

IDが変化しないアセットの固定セットを表している検索状態がある場合は、オプションのfixedlistプロパティをtrueに設定することで、そのアセットセット内のアセットの構成依存性を設定するようにWebCenter Sitesに指示します。

次に例を示します。

<assetset:setsearchedassets name=as assettypes=Products constrain=ss fixedlist=true />

この例では、asという名前のアセットセット内の各製品アセットとレンダリングされたページの間に構成依存性が存在することを定義しています。

アセットセットおよび検索状態オブジェクトを参照してください。

20.2.2.1 承認依存性タイプの設定

静的サイト用にフレックス・アセットを使用している場合は、承認システムがassetsetタグを呼び出すと、承認依存性タイプはデフォルトでnoneに設定されることに注意してください。

この値をexistsまたはexactに変更するには:

  • deptypeパラメータを使用します。次に例を示します。

    <assetset:setsearchedassets name=as assettypes=Products constrain=ss fixedlist=true deptype=exists />
    

    assetset:setsearchedassetsタグの承認タイプを設定することに意味があるのは、fixedlistパラメータがtrueに設定されている場合のみです。

20.2.3 RENDER.GETPAGEURLおよびrender:getpageurl

RENDER.GETPAGEURLタグは、BLOBではないアセットのURLを作成します。このタグは、承認(レンダリング)対象のアセットとこのタグで指定されているアセットの間のexists承認依存性をログに記録します(構成依存性ではありません)。したがって、このタグが依存性を作成するのは、パブリッシュ方法がディスクへのエクスポートである場合のみです。

この例では、記事ABCに割り当てられたテンプレートには次のコードが含まれています。

<RENDER.GETPAGEURL PAGENAME="<site_name>/Page/Home"
cid="Variables.pageid"
c="Page"
OUTSTR="referURL"/>

このコード部分は、URLを作成して(このURLはOUTSTRパラメータによって作成された変数に格納して返される)、cid変数で指定されたアセットと記事ABCの間のexists承認依存性をログに記録します。

その後、記事ABCが承認されたときに、cid変数で指定されたページが承認されるかすでにパブリッシュされている必要があります。そうでない場合は、記事ABCのパブリッシュは保留されます。

20.2.4 RENDER.LOGDEP (render:logdep)

場合によっては、コード側でアセットを実際にロードすることなく、そのアセットのデータを取得できることがあります。その場合は、render:logdepタグを使用して、必ず手動で構成依存性をログに記録してください。

例1

テンプレート・アセットまたは他のCSElementアセットからCSElementをコールする際は、実行するエレメント・ファイルを識別するためにそのアセットをロードすることはありません。かわりに、RENDER.CALLELEMENTタグまたはrender:callelementタグを使用して、名前を指定してそのエレメントを直接呼び出します。次に例を示します。

<render:callelement name=<site_name>/Common/HeaderText/>

asset:loadタグを使用してCSElementにアクセスしなかったため、CSElementアセットとこのアセットがレンダリングされるページの間の構成依存性は自動的にログに記録されません。かわりに、この構成依存性を手動で設定する必要があります。

各CSElementアセットのエレメントの先頭に、次のコード行を挿入します。

<render:logdep cid="Variables.eid" c="CSElement"/>

テンプレート・アセットのエレメントの先頭では、render.logdep文は次のようになります。

<render:logdep cid="Variables.tid" c="template"/>

WebCenter SitesインタフェースでCSElementフォームまたはテンプレート・フォームを使用してエレメントのコーディングを開始する場合は、WebCenter Sitesは、そのエレメントに自動的に追加するスタブ・コード内に、適切なrender:logdep文を自動的に挿入します。

例2

ベーシック・アセットの場合は、ASSET.LOADタグを親アセット(ベーシック・アセット)で使用してから、ASSET.CHILDRENタグを使用すると、子アセットをロードすることなく子アセットのデータにアクセスできます。この場合は、構成依存性をログに記録するためのRENDER.LOGDEP文を挿入する必要があります。

次に例を示します。

<ASSET.CHILDREN NAME="PlainListCollection" LIST="theArticles"
OBJECTTYPE="Article" ORDER="nrank" CODE=-/>
<LOOP LIST="theArticles">
<RENDER.LOGDEP cid="theArticles.id" c="Article"/>
...

20.2.4.1 承認依存性タイプの設定

ディスクへのエクスポートの宛先に対してアセットが承認されて、承認システムがこのタグを呼び出すと、このタグによって、そのアセットとレンダリングされたページの間のexact承認依存性が作成されます。

  • 次の例のように、DEPTYPE引数を設定することにより、承認依存性タイプをexistsまたはnoneに変更できます。

    <RENDER.LOGDEP cid="theArticles.id" c="Article" DEPTYPE="exists"/>

20.2.5 RENDER.FILTERおよびrender:filter

RENDER.FILTERタグは、問合せによって作成されたアセットのリストに対して使用します。このタグは、非承認アセットをリストまたは問合せから除外します。また、unknownという構成依存性も設定します。 (unknown構成依存性については、「RENDER.UNKNOWNDEPSおよびrender:unknowndeps」を参照してください。)

このタグを使用するのは、問合せ(コレクション・アセットや問合せアセットなど)によって返されたリスト内に非承認アセットが含まれている場合に、その問合せの結果に対する承認依存性を持つ承認済アセットのパブリッシュが保留されないようにする場合です。たとえば、コレクションに含まれている5つの記事のうち2つのみをパブリッシュできない場合でも問題ないように、エレメントに渡された任意の数の記事アセットの適切な形式設定を実行するようそのエレメントがコーディングされているとします。このタグは、非承認アセットを除外するようにディスクへのエクスポートに指示するため、非承認アセットが未パブリッシュのままでも、この問合せを使用しているページをパブリッシュできます。

このタグは、次の場所で使用することが考えられます。

  • 問合せアセットのテンプレート

  • コレクション・アセットのテンプレート

  • SELECTTO文とEXECSQL問合せ

次に例を示します。

<RENDER.FILTER LIST="ArticlesFromWireQuery" LISTVARNAME="ArticlesFromWireQuery" LISTIDCOL="id"/>

20.2.6 RENDER.UNKNOWNDEPSおよびrender:unknowndeps

RENDER.UNKNOWNDEPSタグは、依存アセットが存在しているが、これらのアセットの出所が問合せであるかこれらのアセットが頻繁に変化するという理由で、これらのアセットのIDを予測できないことを通知します。このタグは、レンダリングされたページのunknownという構成依存性をログに記録します。このタグは、ディスクへのエクスポートのパブリッシュ方法については承認依存性を設定しません。

構成依存性がunknownに設定されている場合は、対象ページは、ディスクへのエクスポートのパブリッシュ・セッションが実行されるたびに再生成される必要があり、サーバーへのミラーリングのパブリッシュ・セッションが終了するたびにページ・キャッシュ内で更新される必要があります(更新が必要かどうかにかかわらず)。

注意:

再生成する必要があるページが多いほど、サイトのパブリッシュにかかる時間が長くなるため、このタグは慎重に使用する必要があります。

このタグは、依存アセットをまったく特定できないコーディング状況に対応するために使用します。たとえば、問合せは動的であるため、実行されるたびに異なる結果セットが取得される可能性があります。いずれかの種類の問合せ(問合せアセット、SELECTTO文、EXECSQLなど)を使用する場合は、RENDER.UNKNOWNDEPSタグを使用する必要があります。

20.3 CSElementアセットおよびSiteEntryアセットの呼出しについて

コーディングの観点からは、開発者の関心対象はアセットとしてのCSElementやSiteEntryではなく、そのアセットが表しているエレメント・エントリやページ・エントリです。そのため、適切なタグを使用して、エレメントまたはページ・エントリを直接呼び出すコードを記述します。

CSElementが対応するSiteEntryアセットを持たない場合(つまり、そのCSElementの出力はコール側ページに対して設定されたキャッシュ基準に従ってキャッシュされる場合)や、この呼び出し時に別個のページレットが必要ない場合は、RENDER.CALLELEMENT (render:callelement)タグを使用して名前を指定してそのCSElementを呼び出します。次に例を示します。

<render:callelement name="FiscalNews/Common/SetHTMLHeader"/>

CSElementが対応するSiteEntryアセットを持っている場合は、RENDER.SATELLITEPAGE (render:satellitepage)タグを使用してそのSiteEntryアセットのページ名をコールすることで、そのエレメントを呼び出します。次に例を示します。

<render:satellitepage pagename="FiscalNews/Pagelet/Common/SiteBanner"/>

注意:

Oracle WebCenter Sites Explorerを使用してSiteCatalogエントリとElementCatalogエントリを調査する場合、これらのエントリは、ページとページレットを視覚的に編成したフォルダおよびサブフォルダとして表示されます。ただし、これらのエントリは単なるデータベース表内の行であり、実際の階層は存在しません。そのため、コードでページ・エントリまたはエレメント・エントリをコールする場合は、常にフルネームを使用する必要があります。相対パスは使用できません。

また、コール先エレメントのチェーンは、20レベルより深くなってはいけません。20レベルより深い場合は、アセットを表示する際にシステムのパフォーマンスが低下します。

また、Oracle WebCenter Sites Explorerを使用して編集する場合は、アセットをそのアセットの編集フォーム(WebCenter Sitesインタフェース上)に保存することで、編集内容に応じてキャッシュが更新されるようにします。(Oracle WebCenter Sites Explorerはキャッシュを自動的に更新しません。)

20.4 ベーシック・アセットを表示するエレメントのコーディング

アセット・タイプ(エレメント・コードを記述しているテンプレートのもの)がどのように設計されているかについて理解を深めます。データとサイトの設計を事前に理解しておくだけで、更新されたアセットを表示するテンプレートをコーディングしなおすことの難しさがわかるようになります。

十分に理解できるように、このトピックでは次のことについて説明します。

  • ベーシック・アセット・タイプのテンプレートをコーディングするときに留意すべきこと。

  • 様々な状況に応じたコード・フラグメントおよび例。たとえば、静的サイトの承認を正しく計算するためにアセット間の依存性を管理し、動的サイトのページ・キャッシュをクリアする(適切な場合)という状況が考えられます。

開始する前に、このガイドのプログラミングの基本に関する部分の各章、特に「タグ・テクノロジを使用したWebサイト開発」を必ず読んでください。

コード例で使用されているタグについては、Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスを参照してください。

ベーシック・アセットのテンプレート・エレメント例を参照してください。

トピック:

20.4.1 シンプルなコンテンツを表すアセット

コンテンツ・アセットのテンプレート・エレメントは通常、1つの特定の記事、広告コピー、特別オファー、イメージなどをデータベースから抽出した後、ヘッドライン、本文、署名行などの関連フィールドから情報を取得して、その情報をオンラインで表示します。

記事アセット用に設計された次のシンプルなテンプレート・エレメントについて見てみましょう。

<?xml version="1.0" ?> 
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd"> 
<FTCS Version="1.1"> 
<!-- Article/VeryBasic 
- 
- INPUT 
- Variables.c - asset type (Article) 
- Variables.cid - id of the asset to display 
- Variables.tid - template used to display the page(let) 
- OUTPUT 
- 
--> 
<!-- log the template as a dependent of the pagelet being rendered, so changes to the template will force regeneration of the page(let) --> 

<IF COND="IsVariable.tid=true"> 
<THEN> 
<RENDER.LOGDEP cid="Variables.tid" c="Template"/> 
</THEN> 
</IF> 
<!-- asset load will mark the asset as an 'exact' dependent of the pagelet being rendered --> 

<ASSET.LOAD NAME="anAsset" TYPE="Variables.c" OBJECTID="Variables.cid"/> 

<!-- get all the primary table fields of the asset --> 

<ASSET.SCATTER NAME="anAsset" PREFIX="asset"/> 

<!-- display the description --> 
<ics.getvar name=asset:description/>

<!-- display the contents of the urlbody file --> 

<ics.getvar name="asset:urlbody" encoding="default" 
output="bodyvar"/>
<RENDER.STREAM VARIABLE="bodyvar" /><br/> 

</FTCS>

このテンプレート内のこのコードは、次の処理を実行します。

  • RENDER.LOGDEPタグを使用して、このエレメントによってレンダリングされるページとテンプレート・アセットの間の構成依存性をログに記録します。

  • 承認システムがディスクへのエクスポートのターゲットについてこのコードを評価している場合は、承認依存性をログに記録します。

  • ASSET.LOADタグを使用して記事アセットをロードします。このタグは、レンダリングされるページと記事アセットの間の構成依存性をログに記録します。

  • ASSET.SCATTERタグを使用して、記事のすべてのフィールドからすべての値を抽出します。

  • CSVARタグを使用して、description列のコンテンツを表示します。description列は、WebCenter Sitesインタフェース上の「新規」または「編集」記事フォーム内の「ヘッドライン」フィールドに対応しています。

  • ics.getvarタグとRENDER.STREAMタグを使用して、urlbody列のコンテンツを表示します。urlbody列は、WebCenter Sitesインタフェース上の「新規」または「編集」記事フォーム内の「ヘッドライン」フィールドに対応しています。

description列の値を表示するコードと、urlbody列の値を表示するコードの違いに注意してください。urlbody列には埋込みリンクを格納でき、フィールドに埋込みリンクを格納できる場合は常に、CSVARタグではなくRENDER.STREAMタグを使用して、それらのリンクが正しくレンダリングされるようにします。

20.4.2 アソシエーション

アソシエーション・フィールドを通じて他のアセットと関連付けられているアセットを特定するには、ASSET.CHILDRENタグを使用します。関連付けられたアセットを指定するには、CODEパラメータを使用してアソシエーション・フィールドを指定します。

たとえば、前述のコード例の</FTCS>タグの直前に、次のコード部分が挿入されたとします。

<!-- display the Main Image --> 
<ASSET.CHILDREN NAME="anAsset" LIST="associatedImage"
CODE="MainImage"/> 
<IF COND="IsList.associatedImage=true"> 
<THEN> 
<RENDER.SATELLITEPAGE PAGENAME="FiscalNews/ImageFile/TeaserSummary" ARGS_cid="associatedImage.oid"/> 
</THEN> 
</IF> 

このコード部分は、次の処理を実行します。

  • ASSET.CHILDRENタグと、MainImageという値に設定されたCODEパラメータを使用して、この記事アセット(anAssetという名前)のメイン・イメージ・フィールドで指定されたimagefileアセットを抽出します。

  • RENDER.SATELLITEPAGEタグを使用して、そのimagefileのIDをTeaserSummaryテンプレートのページ・エントリに渡します。このページ・エントリはPAGENAMEパラメータで指定され、このimagefileARGS_cidパラメータで指定されます。TeaserSummaryテンプレートは、このimagefileをページレット内にレンダリングして、そのページレットをこのページに渡して戻し、このページ上でこれが記事とともに表示されます。

20.4.3 ImageFileアセットまたは他のBLOBアセット

imagefileアセット・タイプには、アップロードされたイメージ・ファイルが格納されます。言い換えると、imagefileアセット・タイプは、WebCenter Sitesデータベースから提供されるバイナリ・ラージ・オブジェクト(Binary Large OBject: BLOB)です。イメージファイルなどのBLOBを提供および表示するには、BlobServerサーブレットを使用します。

imagefileなどのBLOBのテンプレート・エレメントは、RENDER.SATELLITEBLOBタグを使用して、そのBLOBにアクセスする方法とそのBLOBを形式設定して表示する方法をブラウザに指示するHTMLタグを作成して返すことができます。BlobServer URLのみが必要な場合は(そのURLがHTMLタグに埋め込まれない状態で)、RENDER.GETBLOBURLタグを使用できます。

BLOBへのリンクのコーディングの詳細は、「ハイパーリンクのURLの作成」を参照してください。

20.4.4 埋込みリンクを保持できるベーシック・アセット

記事アセットおよびTEXTAREAというデータ型のフィールドを持つ他のアセットの「本文」フィールドを使用して、エディタはテキスト・フィールド内の埋込みハイパーリンクを作成できます。これらのリンクが適切にレンダリングされるようにするには、次の例に示すようにRENDER.STREAMタグを使用してそのフィールドのコンテンツを取得できます。

<asset:load name="TestArticle" type="<%=ics.GetVar("c")%>"
 objectid='<%=ics.GetVar("cid")%>' />
<asset:scatter name="MainArticle" prefix="articleAsset" />
<!-- display the contents of the urlbody file --> 

<ics:getvar name="articleAsset:urlbody" encoding="default"
 output="bodyvar"/>
<render:stream variable="bodyvar"/><br/>

管理システム上でWebモードが有効になっている場合は、insite:editタグは、埋込みリンクが含まれたフィールドのコンテンツを取得したときに、埋込みリンクを適切に管理します。

20.4.5 コレクション

コレクション・アセットのテンプレートは通常、ASSET.CHILDRENタグを使用してコレクション内のアセットをデータベースから抽出します。次に例を示します。

<ASSET.LOAD TYPE="Variables.c" OBJECTID="Variables.cid"
NAME="PlainListCollection"/>
<ASSET.SCATTER NAME="PlainListCollection" PREFIX="asset"/>
<ASSET.CHILDREN NAME="PlainListCollection" LIST="theArticles"
OBJECTTYPE="Article"/>

子が特定された後に、テンプレート・コードは、これらのアセットの各部分をレンダリングされたページ上のリストに表示できます。

場合によっては、コレクションのテンプレートは、そのコレクション内の最初のアイテムを残りのアイテムとは異なる形で処理するようにコーディングされていることがあります。コレクション内の最上位ランクのアセットを選出するには、次のように、リスト内のアイテムをそれらのランクに従って順序付けするようにエレメントをコーディングします。

<ASSET.CHILDREN NAME="HomePageStories" LIST="theArticles"
OBJECTTYPE="Article" ORDER="nrank"/>

この項には次のトピックが含まれます:

20.4.5.1 コレクション・テンプレートと承認依存性

ディスクへのエクスポートのパブリッシュ方法を使用している場合は、コレクション・テンプレート内でRENDER.FILTERタグを使用できます。このタグは、承認依存性の計算時とパブリッシュ・プロセスによるサイトのレンダリング時に、すべての非承認アセットをコレクションから除外します。

次のコード部分は、このタグを示します。

<ASSET.LOAD TYPE="Variables.c" OBJECTID="Variables.cid"
NAME="StoryListCollection"/>
<ASSET.SCATTER NAME="StoryListCollection" PREFIX="asset"/>
<ASSET.CHILDREN NAME="StoryListCollection" LIST="theArticles"
ORDER="nrank" CODE="-"/>

<!-- Get only the articles that are approved for export -->

<RENDER.FILTER LIST="theArticles"
LISTVARNAME="ApprovedArticles" 
LISTIDCOL="oid"/>

<!-- Display only the articles that are approved-->

<IF COND="IsList.ApprovedArticles=true">
<THEN>
<LOOP LIST="ApprovedArticles">
<RENDER.SATELLITEPAGE 
PAGENAME="<site_name>/Article/Summary"
ARGS_cid="ApprovedArticles.oid" 
ARGS_p="Variables.p"/>
</LOOP>
</THEN>
</IF>

20.4.5.2 コレクション・テンプレートと構成依存性

RENDER.FILTERタグを例示している前述のコード例では、コレクション内の各子アセットのIDはSummaryテンプレートに渡されます。

Summaryテンプレート内の最初のコード行はASSET.LOAD文であるため、この文によってロードされる記事アセットとSummaryテンプレートによってレンダリングされるページの間の依存性はログに記録されます。

コレクション用のテンプレート内のコードによって子記事も書式設定される場合は、そのコードを慎重に検討して、RENDER.LOGDEPタグを使用して依存性をログに記録する必要があるかどうかを判断する必要があります。

たとえば、ASSET.CHILDRENタグ内でOBJECTYPEパラメータを使用している場合、次の例のように、得られるリストは、AssetRelationTree表と指定されたタイプのアセット表の結合になるため、両方の表内の情報を含んでいます。

<ASSET.CHILDREN NAME="StoryListCollection" LIST="theArticles"
OBJECTTYPE=Article ORDER="nrank" CODE="-"/>

その場合は、後続のASSET.LOADタグを使用することなく、子アセットの情報にアクセスできます。子アセットの情報にアクセスする場合は、必ずそれぞれの子のRENDER.LOGDEPタグを挿入してください。そうすることで、これらのアセットとレンダリングされたページの間の構成依存性を正しく追跡できます。

別の例については、「コレクション・アセット内の記事アセットへのリンクのコーディング」を参照してください。

20.4.6 問合せアセット

問合せアセットはSQLコードを実行することも、問合せコードが含まれたエレメントを実行することもできます。これらは、コレクションやページ・アセットなどのアプリケーションで使用します。

  • コレクションを作成するには、「コレクションの作成」フォームで問合せを実行して、得られるリストから希望のアセットを選択して順序付けします。このコレクションは、この問合せの結果セットから選択されたアセットの静的リストです。

  • ページ・アセット用の問合せは、名前なし関係またはアソシエーションのいずれかを通じて選択します。記事などのアセット用の問合せは、アソシエーションを通じて選択します。

    これらのケースでは、ページ・アセットや記事アセット自体はその問合せを呼び出しません。したがって、OpenMarket/Xcelerate/AssetType/Query/ExecuteQueryという名前の標準WebCenter Sitesエレメントを呼び出すように、問合せテンプレート・エレメントをコーディングします。 このエレメントは、ページ・アセットや記事アセットのレンダリング時に問合せアセットを実行します。

問合せテンプレートのエレメントはExecuteQueryエレメントを呼び出し、通常は、その問合せによって作成されたリスト・オブジェクトに格納して返されるアイテムをループ処理するコードを含んでいます。このコードは、ループ処理を実行した後に、これらのアイテムから情報を抽出してから、その情報を表示します。

次の例では、問合せアセットをロードして、このアセットをExecuteQueryエレメントに渡します。

<ASSET.LOAD TYPE="Query" NAME="Wirefeed" OBJECTID="Variables.id"/>
<CALLELEMENT NAME="OpenMarket/Xcelerate/AssetType/Query/
ExecuteQuery">
<ARGUMENT NAME="list" VALUE="ArticlesFromWireFeed"/>
<ARGUMENT NAME="assetname" VALUE="WireFeed"/>
<ARGUMENT NAME="ResultLimit" VALUE="-1"/>
</CALLELEMENT>

問合せと構成依存性

ExecuteQueryエレメント内のコードの1行目に配置されたRENDER.UNKNOWNDEPSタグは、動的配信システム上のCacheManagerおよびディスクへのエクスポートのパブリッシュ方法に対して、この問合せによって取得されるアセットを予測できないこと、およびその結果として依存性を計算してログに記録できないことを通知します。

他の種類の問合せ(たとえば、SELECTTO文、CALLSQLEXECSQL)を使用している場合は、RENDER.UNKNOWNDEPSタグを挿入してください。

また、次の例のように、ディスクへのエクスポートのパブリッシュ方法を使用している場合は、問合せによって生成されるアセット・リストが返される先となるエレメント内で、RENDER.FILTERタグを使用する必要があります。

<CALLELEMENT NAME="OpenMarket/Xcelerate/AssetType/Query/ExecuteQuery">
<ARGUMENT NAME="list" VALUE="ArticlesFromTheQuery"/>
<ARGUMENT NAME="assetname" VALUE="PlainListQuery"/>
<ARGUMENT NAME="ResultLimit" VALUE="5"/>
</CALLELEMENT>

<!-- On export - filter out un-approved assets -->
<RENDER.FILTER LIST="ArticlesFromTheQuery" LISTVARNAME="ArticlesFromTheQuery" LISTIDCOL="id"/>

<if COND="ArticlesFromTheQuery.#numRows!=0">
<then>
<LOOP LIST="ArticlesFromTheQuery">
<RENDER.GETPAGEURL PAGENAME="FiscalNews/Article/
Variables.ct"
cid="ArticlesFromTheQuery.id"
c="Article"
p="Variables.p"
OUTSTR="referURL"/>
<A class="wirelink" HREF="Variables.referURL"
REPLACEALL="Variables.referURL"><ics.listget listname=ArticlesFromTheQuery fieldname=subheadline/>
</A><P/>

別の例については、「問合せアセットのテンプレートのコーディング」を参照してください。

20.4.7 ページ・アセット

ページ・アセットのテンプレートには通常、次のタイプのコードが含まれています。

  • そのページ・アセットのフレームワーク(そのページ・アセットがレンダリング対象ページである場合)

  • レンダリング対象ページのコンテンツを取得するためのロジック

  • 他のレンダリング対象ページへのリンクのロジック

コンテンツ・アセットのテンプレートには、個別のコンテンツの形式設定コードが含まれています。ページ・テンプレートは、他のアセットのテンプレートを呼び出して、形式設定されたアセットをこれらのテンプレート・エレメントから受け取ってから、これらの形式設定されたアセットをページ・フレームワークのコンテキスト内に配置します。

次に、ページ・アセットを形式設定するためのシンプルなテンプレートのコードを示します。

<?xml version="1.0" ?> 
<!DOCTYPE FTCS SYSTEM "futuretense_cs.dtd"> 
<FTCS Version="1.1"> 
<!-- Page/CollectionsAndQuery 
-
- INPUT 
- Variables.c - asset type (Page) 
- Variables.cid - id of the asset to display 
- Variables.tid - template used to display the page(let) 
- OUTPUT 
- 
--> 

<!-- log the template as a dependent of the pagelet being rendered, so changes to the template will force regeneration of the page(let) -->

<IF COND="IsVariable.tid=true"> 
<THEN> 
<RENDER.LOGDEP cid="Variables.tid" c="Template"/> 
</THEN> 
</IF>

<!-- asset load will mark the asset as an 'exact' dependent of the pagelet being rendered --> 

<ASSET.LOAD NAME="anAsset" TYPE="Variables.c"
OBJECTID="Variables.cid"/> 

<!-- get all the primary table fields of the asset --> 

<ASSET.SCATTER NAME="anAsset" PREFIX="asset"/> 

<!-- get a list of id's of the child assets in the collection in order of their rank --> 

<!-- get the WireFeed query --> 

<ASSET.CHILDREN NAME="HomeTextPage" LIST="WireFeedStories"
CODE="WireFeed"/> 
<IF COND="IsList.WireFeedStories=true"> 
<THEN> 
<RENDER.GETPAGEURL PAGENAME="<site_name>/Query/WireFeedFrontText" 
cid="WireFeedStories.oid" 
c="Query" 
p="Variables.asset:id" 
OUTSTR="referURL"/> 
<P> 
<A HREF="Variables.referURL" 
REPLACEALL="Variables.referURL">From the Wires...</A>
 
</P> 
<RENDER.SATELLITEPAGE PAGENAME="<site_name>/Query/WireSummaryText" 
ARGS_cid="WireFeedStories.oid" 
ARGS_ct="WireStoryText" 
ARGS_p="Variables.asset:id"/> 
</THEN> 
</IF> 
</FTCS> 

この例のコードは、次の処理を実行します。

  • RENDER.LOGDEPタグを使用して、レンダリングされるページとテンプレート・アセットの間の構成依存性をログに記録します。

  • ASSET.LOADタグを使用してページ・アセットをロードします。このタグは、レンダリングされるページと記事アセットの間の構成依存性をログに記録します。

  • ASSET.CHILDRENタグと、WireFeedという値に設定されたCODEパラメータを使用して、WireFeed問合せを抽出します。

  • RENDER.GETPAGEURLタグを使用して、WireFeed問合せから得られる記事を表示するページのURLを取得します。PAGENAMEパラメータは、そのページを作成するために使用するテンプレートのページ・エントリを指定するとともに、そのURLの一部を特定します。OUTSTRパラメータは、RENDER.GETPAGEURLによって作成されるURLを保持するための、referURLという名前の変数を作成します。

  • referURL変数内のURLを使用して、そのページへの<A HREF>リンクを作成します。

  • 問合せアセットのIDをWireSummaryTextテンプレートのページ・エントリに渡します。その後、WireSummaryTextテンプレートは、Wire Feed問合せによって返される各記事のサマリー・テキストを表示するページレットを作成して、そのページレットをこのページに渡して戻し、そのページレットがこのページ上で表示されます。

20.5 フレックス・アセットを表示するエレメントのコーディングについて

WebCenter Sitesには、フレックス・アセットを表示するエレメントをコーディングできるようにASSETSETおよびSEARCHSTATEタグ・ファミリが用意されています。

ベーシック・アセットのテンプレートをコーディングする際は、WebCenter SitesASSETタグ・ファミリを使用します。たとえば、ベーシック・アセットを抽出して表示するには、ASSET.LOADタグを使用します。このタグは、そのアセット・タイプのプライマリ記憶域表からデータを抽出します。ただし、フレックス・アセットのデータベース・スキーマはベーシック・アセットのデータベース・スキーマと異なるため、WebCenter Sitesでは、ASSETタグ群のかわりに使用する次のフレックス・アセット用タグ・ファミリが用意されています。

  • ASSETSET: このタグ・ファミリを使用して、1つ以上のフレックス・アセットのセットを指定します。

  • SEARCHSTATE: このタグ・ファミリを使用して、アセットセット内のアセットをフィルタリングする検索絞込み条件を作成します。

    注意:

    ASSET.LOADタグは、フレックス・アセットを自動的にロードします。ただし、ASSET.LOADタグをフレックス・アセットに対して使用することはサポートされていません。そのコードをアップグレードできず、アセットをこの方法で抽出すると、ASSETSETタグ・ファミリを使用する場合よりはるかに時間がかかるからです。

フレックス・アセット・モデルを使用してコンテンツを表す場合は、オンライン・サイトでは、フレックス・アセットとベーシック・アセットを組み合せて使用します。ページ・アセット・タイプ(使用される可能性が高い)はベーシック・アセット・タイプであるからです。

トピック:

20.5.1 アセットセット

アセットセットは、1つ以上のフレックス・アセットまたはフレックス親アセットのグループです。各種のASSETSETタグを使用して、アセットのセットを作成したり、表示する属性値を抽出したりします。

アセットセットから取得できる情報は次のとおりです。

  • アセットセット内の各フレックス・アセットの1つの属性の値

  • アセットセット内の各フレックス・アセットの複数の属性の値

  • アセットセット内のフレックス・アセットのリスト

  • アセットセット内のフレックス・アセットの数

  • アセットセット内のすべてのフレックス・アセットの1つの属性の一意の属性値のリスト

  • アセットセット内のすべてのフレックス・アセットの属性の一意の属性値の数

複数のタイプのフレックス・アセットが含まれたアセットセットを作成できますが、そのためには、それらのフレックス・アセットが同じフレックス属性アセット・タイプを使用している必要があります。

使用頻度の高いASSETSETタグは次のとおりです。

ASSETSET.SETASSET 
ASSETSET.SETSEARCHEDASSETS 
ASSETSET.GETMULTIPLEVALUES 
ASSETSET.GETATTRIBUTEVALUES 
ASSETSET.GETASSETLIST 
ASSETSET.SORTLISTENTRY ... 

すべてのASSETSETタグは『Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンス』で説明されており、これらのうちいくつかはこの章のコード例で使用しています。構成依存性とASSETSETタグの詳細は、「ASSETSET (assetset)タグ・ファミリ」を参照してください。

20.5.2 検索状態オブジェクト

検索状態オブジェクトを使用すると、表示するフレックス・アセットのIDを取得できます。

検索状態は、フレックス・アセット・タイプの_Mungo表に格納されている属性値に基づいた一連の検索絞込み条件です。検索状態は、アセットセット適用します。

検索状態を構築するには、検索状態によって記述されるフレックス・アセットのリストに対して、制約を追加して絞り込むか、または制約を削除して広げます。たとえば、照明器具を販売することが目的であるLightingサイトを運営している場合、検索状態を使用して、訪問者が製品カタログを参照するために使用するドリルダウン検索機能を作成できます。

絞込み条件が指定されていない検索状態をアセットセットに適用すると、そのタイプのすべてのアセットのフィルタリングされないリストが作成されます。たとえば、次のコード例では、Lightingサイトの製品カタログ内のすべての製品が含まれるアセットセットを作成します。

<SEARCHSTATE.CREATE NAME=nolimits/>
<ASSETSET.SETSEARCHEDASSETS NAME=unconstrainedAssetSet
CONSTRAINT=nolimits ASSETTYPES=Products/>

このアセットセット内の製品の数を絞り込むには、絞込み条件を追加します。たとえば、次のコード例では、カタログ内の40ワットの電球のみが含まれたアセットセットを作成します。

<SEARCHSTATE.CREATE NAME=lightbulbs/>
<SEARCHSTATE.ADDSIMPLESTANDARDCONSTRAINT NAME=lightbulbs
 ATTRIBUTE=wattage VALUE=40/>
<ASSETSET.SETSEARCHEDASSETS NAME=40WattLightbulbs
CONSTRAINT=lightbulbs ASSETTYPES=Products/>

絞込み条件とは、属性の値または別の検索状態(ネストされた検索状態)に基づいて設定できるフィルタ(制限)です。

検索状態は、そのアセット・タイプのデータベースの_Mungo表内を検索することも、そのアセット・タイプの検索エンジンによって作成された属性索引内を検索することもできます。つまり、データベース検索とリッチテキスト(索引を通じたフルテキスト)検索を同じ問合せ内に混在させることができます。検索エンジンの索引に対して絞込み条件を適用するには、SEARCHSTATE.ADDRICHTEXTCONSTRAINTタグを使用します。

注意:

SEARCHSTATEタグ・ファミリを使用するかわりに、SQLを使用してフレックス・アセットのデータベース表に対する問合せを実行することはサポートされていません。

使用頻度の高いSEARCHSTATEタグは次のとおりです。

SEARCHSTATE.CREATE 
SEARCHSTATE.ADDSTANDARDCONSTRAINT 
SEARCHSTATE.ADDSIMPLESTANDARDCONSTRAINT 
SEARCHSTATE.ADDRANGECONSTRAINT 
SEARCHSTATE.ADDRICHTEXTCONSTRAINT 
SEARCHSTATE.TOSTRING 
SEARCHSTATE.FROMSTRING 

すべてのSEARCHSTATEタグは『Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンス』で説明されており、これらのうちいくつかはこの章のコード例で使用しています。

20.5.3 アセットセット、検索状態およびフレックス属性アセット・タイプ

検索状態は属性値に基づいて特定のアセットをフィルタリングし、アセットセットはデータベース内のアセットに検索状態を適用することで作成されるため、同じ属性アセット・タイプを共有しているフレックス・アセット・タイプのみを同じアセットセット内に含めることができます。

たとえば、フレックス記事アセット・タイプやフレックス・イメージ・アセット・タイプなどの2つのフレックス・アセット・タイプによって共有されるコンテンツ属性がサイトに含まれる場合、フレックス記事とフレックス・イメージの両方が含まれるアセットセットを作成できます。ただし、コンテンツ属性のかわりに製品属性を使用する製品アセット・タイプもこのサイトに含まれる場合、フレックス記事と製品アセットの両方が含まれるアセットセット、またはフレックス・イメージと製品アセットの両方が含まれるアセットセットを作成することはできません。

20.5.4 有効範囲

アセットセットと検索状態のスコープはローカルです。つまり、アセットセットと検索状態は現在のエレメント(レンダリング対象ページ)に対してのみ存在します。

既存の検索状態を維持するには、SEARCHSTATE.TOSTRINGタグを使用して、その検索状態を文字列に変換してから、その文字列を引数として次ページのURLに組み込みます。

次に例を示します。

<SEARCHSTATE.TOSTRING NAME=ss VARNAME=stringss/>
<RENDER.SATELLITEPAGE 
pagename= SiteName/Products/Example 
ARGS_search=Variables.stringss/>

次に、その文字列を受け取るこのサンプル・ページのルート・エレメント内で、次のように別の検索状態をコーディングします。

<SEARCHSTATE CREATE NAME=ss/>

次に、SEARCHSTATE.FROMSTRINGタグを使用して、サンプル・エレメントに渡された文字列を元の検索状態に復元します。

<SEARCHSTATE.FROMSTRING NAME=ss VALUE= Variables.search/>

20.6 フレックス・アセットを表示するテンプレートのコーディング

オンライン・サイトのフレックス・アセット・モデル用にテンプレートをコーディングしますか。その際の第1の関心事は、フレックス属性の値です。しかも、これらの値自体がアセットです。このコンテキストでは、フレックス・アセット(たとえば製品)またはフレックス親アセットは実際には属性値を抽象化したものです。

検索状態を使用して、表示するフレックス・アセットのIDを取得して、考慮対象のアセットをそれらの属性値に基づいてフィルタリングします。その結果、フレックスまたはフレックス親アセットのアセットセットが得られ、それは属性値に基づいたものになっています。アセットセット内のアセットの属性値を表示できます。

フレックス・アセットのテンプレート・エレメントのコーディングを開始する前に、使用しているフレックス・ファミリのデータ・モデルを必ず理解してください。アセット・タイプおよびアセット・モデルの理解およびフレックス・アセット・タイプの設計を参照してください。

トピック:

20.6.1 この項の例で使用するサンプル・データ・セット

この項のコード例は、小規模なデータ・セット例(これらの例の製品フレックス・ファミリ)とやり取りする簡単なアセットセットおよび検索状態から始まります。これらの例で使用する製品ファミリ・セットは、次のとおりです。

フレックス・アセット・タイプ 外部名(WebCenter Sitesインタフェースに表示されます) 内部名(WebCenter Sitesデータベースで使用されます)*

フレックス属性

製品属性

PAttributes

フレックス・アセット

製品

Products

フレックス親

製品親

ProductGroups

ASSETSETタグでASSETTYPESパラメータを使用する場合は、常にアセット・タイプの内部名を使用してください。

該当なし

該当なし

このデータ・セット内のサンプル製品は、次の属性を持つブルー・ジーンズです。

属性 データ型 値の数

sku

string

単一

color

string

複数

price

integer

単一

style

text

単一

次のように定義された4着のブルー・ジーンズがあります。

sku color price style

jeans-1

blue

35

wide

jeans-2

blue、black

30

straight

jeans-3

black、green

25

straight

jeans-4

green

20

wide

20.6.2 1つの製品(フレックス・アセット)が含まれたアセットセットの例

この項のコード・サンプルでは次を実行します。

  • sku番号で指定された1着のジーンズが含まれたアセットセットを作成します。

  • 製品アセットとレンダリング対象ページ(またはページレット)の間の依存性をログに記録します。

  • price属性の値を取得して表示します。

  • color属性の値を取得して表示します。

  • 同じタグ(ASSETSET.GETMULTIPLEVALUES)を使用して、price属性とcolor属性の両方の値を取得して表示します。

この項には次のトピックが含まれます:

20.6.2.1 検索状態の作成とアセットセットへの適用

次のコード行は、ssという名前のフィルタリングされない検索状態を作成します。

<SEARCHSTATE.CREATE NAME="ss"/>

次に、サンプル・データ・セット内の特定の1つの製品が検出されるように、ssという名前のフィルタリングされない検索状態を絞り込みます。そのためには、その製品のskuを指定します。

<SEARCHSTATE.ADDSIMPLESTANDARDCONSTRAINT NAME="ss" TYPENAME="PAttributes" ATTRIBUTE="sku" VALUE="jeans-2"/>

次に、asという名前のアセットセットを作成して、ssという名前の検索状態をこのアセットセットに適用します。

<ASSETSET.SETSEARCHEDASSETS NAME="as" ASSETTYPES="Products"CONSTRAINT="ss" FIXEDLIST="true"/>

sku属性の値は各製品アセットに対して一意です。そのため、このアセットセットには1つの製品(skuの値がjeans-2の製品)のみが含まれます。

この検索状態は、ハードコード化された属性値(jeans-2というsku値)を問い合せることで作成されたため、このassetsetの正確なコンテンツがわかります。これが、FIXEDLISTパラメータをtrueに設定した理由です。これで、ASSETSET.SETSEARCHEDASSETタグによって、この製品アセットの構成依存性がログに記録されるようになります。

20.6.2.2 製品の価格の取得

次に、このジーンズの価格を抽出します。

<ASSETSET.GETATTRIBUTEVALUES NAME="as" ATTRIBUTE="price" TYPENAME="PAttributes" LISTVARNAME="pricelist"/>

priceは単一値属性(つまり、この製品の価格は1つのみ)ですが、ASSETSET.GETATTRIBUTEVALUESタグは、price属性の値をリスト変数(LISTVARNAME=pricelist)として返します。

20.6.2.3 製品の価格の表示

次のコード行は、jeans-2製品の価格を表示できます。

Price: <ics.listget listname=pricelist fieldname=value/>
And this is the result:
Price: 30

20.6.2.4 製品の色の取得

次に、このジーンズで用意されている色を確認します。

前述のとおり、color属性は複数値属性です。ASSETSET.GETATTRIBUTEVALUESタグは、属性が単一値属性なのか複数値属性なのかにかかわらず同じように機能するため、ここでも、priceという単一値属性で使用したのとまったく同じ方法でこのタグを使用します。

<ASSETSET.GETATTRIBUTEVALUES NAME="as" ATTRIBUTE="color" TYPENAME="PAttributes" LISTVARNAME="colorlist"/>

20.6.2.5 製品の色の表示

次のコードは、jeans-2製品の色を表示できます。この製品には複数の色が用意されているため、このコードはリストをループ処理します。

Colors: <LOOP LIST="colorlist">
<ics.listget listname=colorlist fieldname=value/>
&nbsp;
</LOOP>

結果は次のようになります。

Colors: black blue

20.6.2.6 ASSETSET.GETMULTIPLEVALUESタグのリスト・オブジェクトの作成

一般に、複数の属性の値を取得するためには、ASSETSET.GETATTRIBUTEVALUESタグを使用しないでください。

ASSETSET.GETMULTIPLEVALUESタグは、アセットセット内のすべてのアセットについて、複数の属性の値を取得して分散します。このタグは、すべての属性値を対象にして1度のみデータベースをコールするため、複数のASSETSET.GETATTRIBUTEVALUESタグを使用する場合よりも効率的に問合せを実行できます。

ただし、このタグを使用する前に、LISTOBJECTタグを使用して、ASSETSET.GETMULTIPLEVALUESタグによって返される属性を表すリスト・オブジェクトを作成する必要があります。このリスト・オブジェクトは、取得する属性ごとに1つの行を必要とします。

次のコード行は、attributetypenameattributenameおよびdirectionという列がある、loという名前のリスト・オブジェクトを作成します。

<LISTOBJECT.CREATE NAME="lo"
COLUMNS="attributetypename,attributename,direction"/>

次のコード行は、colorpriceという各属性の行を、このリスト・オブジェクトに追加します。

<LISTOBJECT.ADDROW NAME="lo" attributetypename="PAttributes" attributename="color" direction="none"/>
<LISTOBJECT.ADDROW NAME="lo" attributetypename="PAttributes" attributename="price" direction="none"/>

次のコード行は、このリスト・オブジェクトをlolistという名前のリスト変数に変換します。

<LISTOBJECT.TOLIST NAME="lo" LISTVARNAME="lolist"/>

20.6.2.7 ASSETSET.GETMULTIPLEVALUESを使用した価格と色の両方の値の取得

次に、asという名前の元のアセットセットからprice属性とcolor属性の両方の値を取得します。

<ASSETSET.GETMULTIPLEVALUES NAME="as" PREFIX="multi" LIST="lolist" BYASSET="false"/>

20.6.2.8 jeans-2製品の価格と色の値の表示

これらの値はリスト変数(lolist)に格納されているため、次のコードによってすべての属性のすべての値を表示できます。

<LOOP LIST="lolist">
<ics.listget listname=lolist fieldname=attributename output=attrName/>
<ics.getvar name=attrName/> is
<LOOP LIST="multi:Variables.attrName">
<ics.listget listname=multi:Variables.attrNamefieldname=value/>&nbsp;
</LOOP><P/>
</LOOP>

このコードは、lolist変数内のすべての属性をループ処理するネストされたループを構成してから、lolistリスト変数内の各属性のすべての個別属性値をループ処理します。

結果は次のようになります。

color is blue black
price is 30

20.6.3 特殊なケース: TEXT型、BLOB型およびURL型のフレックス属性

text型またはblob型のフレックス属性に保持されている値を表示するには、この項で説明している方法を使用します。

この項には次のトピックが含まれます:

20.6.3.1 TEXT型のフレックス属性について

ASSETSET.GETMULTIPLEVALUESタグは、text型の属性の値を取得しません。したがって、この型の属性を対象にした別個のASSETSET.GETATTRIBUTEVALUESタグを挿入する必要があります。

たとえば、これらの例で使用しているサンプル・データ・セット内のcolor属性が、string型ではなくtext型の属性であった場合は、これまでの例でASSETSET.GETMULTIPLEVALUESタグを使用してこの属性の値を取得できなかったはずです。

20.6.3.2 BLOB型のフレックス属性について

アセット・タイプおよびアセット・モデルの理解で説明したように、フレックス・アセット・タイプの_Mungo表には、そのタイプのフレックス・アセットの属性値が格納され、ASSETSETタグは、そのアセット・タイプの_Mungo表に対して属性値を問い合せます。

blob型の属性は例外です。

  • WebCenter Sitesでは、blob型のすべての属性のすべての値がMungoBlobs表に格納されます。

  • _Mungo表(たとえば、Products_Mungo)内のblob型属性の行には、MungoBlobs表内のその属性の値が保持されている行のIDのみが格納されます。つまり、_Mungo表内のblob列は、MungoBlobs表に対する外部キーです。

つまり、blob型の属性の場合、ASSETSET.GETATTRIBUTEVALUESタグとASSETSET.GETMULTIPLEVALUESタグは、そのBLOB属性の実際の値を返すのではなく、その値のIDを返します。

属性値のIDが特定されたら、そのIDを使用して次の2つのいずれかの操作を実行できます。

  • そのIDを使用してBlobServer URLを取得できます。

  • そのIDを使用してBLOBの実際の値を抽出できます。

20.6.3.3 BlobServer URLの作成

フレックス属性BLOBの値のBlobServer URLを取得するには、次の操作を実行します。

  • BLOBSERVICEタグを使用して、プログラムによってMungoBlobs表とこの表内の適切な列の名前を取得します。

  • URLをHTMLタグに埋め込む場合は、その名前をRENDER.SATELLITEBLOBタグに渡し、HTMLタグなしでURLのみが必要な場合は、その名前をRENDER.GETBLOBURLタグに渡します。

  • 次の例に示すように、BLOBSERVICEタグを使用してプログラムによってMungoBlobs表の名前を取得します。この表の名前をコード内にハードコード化するかわりに、BLOBSERVICEタグを使用してこの値を取得することで、当製品の将来のバージョンでこの表の名前が変更された場合でも、コードが正しく機能します。

    次のBLOBの例を紹介するために、次の属性をサンプル・データ・セット内のジーンズ製品に追加します。

    属性 データ型 値の数

    description

    blob

    単一

    • 最初に、アセットセットを作成して、jeans-2製品とレンダリング対象ページの間の依存性をログに記録します。

      <SEARCHSTATE.CREATE NAME="ss"/>
      <SEARCHSTATE.ADDSIMPLESTANDARDCONSTRAINT NAME="ss" TYPENAME="PAttributes" ATTRIBUTE="sku" VALUE="jeans-2"/>
      <ASSETSET.SETSEARCHEDASSETS NAME="as" ASSETTYPES="Products" CONSTRAINT="ss"/>
      <ASSETSET.GETASSETLIST NAME="as" LISTVARNAME="aslist"/>
      <RENDER.LOGDEP cid="aslist.assetid" c="aslist.assettype"/>
      The next line of code gets the ID of the jeans-2 asset's description attribute (that attribute of type blob) and stores it in a list variable called descFile
      <ASSETSET.GETATTRIBUTEVALUES NAME="as" TYPENAME="PAttributes" ATTRIBUTE="description" LISTVARNAME="descFile"/>
      
    • 次のコード行は、BLOBSERVICEタグを使用して、BLOB属性の属性値が格納されているWebCenter Sites表から表名と列名を取得し、それらをuTabnameidColumnおよびuColumnという名前の変数に格納します。

      <BLOBSERVICE.GETTABLENAME VARNAME="uTabname"/>
      <BLOBSERVICE.GETIDCOLUMN VARNAME="idColumn"/>
      <BLOBSERVICE.GETURLCOLUMN VARNAME="uColumn"/>
      
    • 次に、descFileというリスト変数と、uTabnameidColumnおよびuColumnという変数をRENDER.SATELLITEBLOBタグに渡します。このタグは、HTMLタグに埋め込まれたBlobServer URLを返します。

      <RENDER.SATELLITEBLOB
      BLOBTABLE="Variables.uTabname" 
      BLOBWHERE="descFile.value" 
      BLOBKEY="Variables.idColumn" 
      BLOBCOL="Variables.uColumn" 
      BLOBHEADER="application/pdf"
      /> add service=a href ... download link... 
      

      RENDER.SATELLITEBLOBタグは、HREFタグに埋め込まれたBlobServer URLを返します。

20.6.3.4 BLOBフレックス属性の値の取得および表示

BLOBフレックス属性のIDが返された後に、このBLOBフレックス属性内のコンテンツまたはデータを取得して表示するには、BLOBSERVICE.READDATAタグを使用します。このタグは、そのBLOBのファイル名とURLデータをロードします。

  • 前述のBLOBの例で使用したデータ・セットに関するものと同じ想定に基づいて、アセットセットを作成して、jeans-2アセットとレンダリング対象ページの間の依存性をログに記録して、description属性の値のIDを取得します。

    <SEARCHSTATE.CREATE NAME="ss"/>
    <SEARCHSTATE.ADDSIMPLESTANDARDCONSTRAINT NAME="ss" TYPENAME="PAttributes" ATTRIBUTE="sku" VALUE="jeans-2"/>
    <ASSETSET.SETSEARCHEDASSETS NAME="as" ASSETTYPES="Products" CONSTRAINT="ss"/>
    <ASSETSET.GETASSETLIST NAME="as" LISTVARNAME="aslist"/>
    <RENDER.LOGDEP cid="aslist.assetid" c="aslist.assettype"/>
    <ASSETSET.GETATTRIBUTEVALUES NAME="as" TYPENAME="PAttributes" ATTRIBUTE="description" LISTVARNAME="descFile"/>
    

    ここでは、BLOBSERVICE.READDATAタグを使用して、description属性の値(データ)を取得してから表示します。

    <BLOBSERVICE.READDATA ID="descFile.value" LISTVARNAME="descData"/>
    <ics.listget listname=descData fieldname=@urldata/>

20.6.4 複数の製品(フレックス・アセット)が含まれたアセットセットの例

この項のコード・サンプルでは次を実行します。

  • この章で使用しているサンプル・データ・セット内のすべての製品(ジーンズ)が含まれたアセットセットを作成します。

  • このアセットセット内のジーンズの数を取得して表示します。

  • このアセットセット内のすべてのジーンズのcolor属性のすべての値を取得して表示します。

  • このアセットセット内のジーンズのcolor属性とstyle属性のすべての値を取得して表示します。

  • このアセットセット内のジーンズのすべての属性値を取得して表内に表示します。

  • このアセットセットから特定の価格範囲に属するジーンズを抽出する検索絞込み条件を追加します。

  • price属性に基づいたこの範囲制約を、bという文字で始まる色が用意されているジーンズをこのアセットセットから抽出する検索絞込み条件に置き換えます。

  • この色制約を、blueまたはblackのどちらかが用意されているジーンズをこのアセットセットから抽出する絞込み条件に置き換えます。

この項には次のトピックが含まれます:

20.6.4.1 検索状態の作成とアセットセットへの適用

次のコード行は、ssという名前のフィルタリングされない検索状態を作成します。

<SEARCHSTATE.CREATE NAME="ss"/>

フィルタリングされない検索状態をアセットセットに適用すると、指定されたタイプ(この例では製品アセット)のすべてのフレックス・アセットが取得されます。

<ASSETSET.SETSEARCHEDASSETS NAME="as" CONSTRAINT="ss" ASSETTYPES="Products"/>

20.6.4.2 アセットセット内のアセットの数の表示

次のコード行は、アセットセット内のアセットの数を返して表示します(この時点ではこの数はサンプル・カタログ全体を表します)。

<ASSETSET.GETASSETCOUNT NAME="as" VARNAME="count"/>
How many products are in the catalog? 
<ics.getvar name=count/>

結果は次のようになります。

How many products are in the catalog? 4

20.6.4.3 ジーンズで用意されている色の表示

次のコード行は、ジーンズの各種の色を取得して表示します。つまり、color属性の重複しない値を取得して表示します。

<ASSETSET.GETATTRIBUTEVALUES NAME="as" ATTRIBUTE="color" TYPENAME="PAttributes" LISTVARNAME="colors"/>
What are the possible colors for any pair of jeans?<BR/>
<LOOP LIST="colors">
<ics.listget listname=colors fieldname=value/>
</LOOP><p/>

結果は次のようになります。

What are the possible colors for any pair of jeans?
black blue green

20.6.4.4 アセットセット内のジーンズの色とスタイルの表示

次に、このアセットセット内のジーンズのcolor属性とstyle属性の値を抽出して表示します。ここでは、ASSETSET.GETMULTIPLEVALUESタグを使用します。

ただし、最初に、ASSETSET.GETMULTIPLEVALUESタグによって返される結果セット用のリスト・オブジェクトを作成する必要があります。このリスト・オブジェクトは、次のように対象の属性ごとに1つの行を必要とします。

<LISTOBJECT.CREATE NAME="lo" COLUMNS="attributename,attributetypename,direction"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="color" attributetypename="PAttributes" direction="none"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="style" attributetypename="PAttributes" direction="none"/>

次のコード行は、このリスト・オブジェクトをlolistという名前のリスト変数に変換します。

<LISTOBJECT.TOLIST NAME="lo" LISTVARNAME="lolist"/>

次に、属性を抽出して、lolistという名前のリスト変数に格納します。

<ASSETSET.GETMULTIPLEVALUES NAME="as" LIST="lolist" PREFIX="distinct" BYASSET="false"/>

このコード行内のBYASSETパラメータに注目してください。このアセットセットには複数のアセットが含まれており、取得しようとしているのは、このアセットセット内の各アセットのすべての属性値ではなく、他と重複しない属性値であるため、BYASSET=falseと設定しています。このように設定することで、すべての属性値ではなく、一意の属性値のみを取得できます。

次のコード行は、リストをループ処理して、各属性の一意の値を表示します。

Here are all the possible colors:
<LOOP LIST="distinct:color">
<ics.listget listname=distinct:color fieldname=value/>
</LOOP><P/>

Here are all the possible styles:
<LOOP LIST="distinct:style">
<ics.listget listname=distinct:style fieldname=value/>
</LOOP><P/>

結果は次のようになります。

Here are all the possible colors: green blue black
Here are all the possible styles: wide straight

20.6.4.5 すべてのジーンズとそれらの属性値を表示する表の作成

ASSETSET.GETMULTIPLEVALUESタグを使用して、アセットセット内の各アセットについて重複しない属性値を取得することもできます。このタグは、すべての製品とそれらの属性値のリストを作成します。このリストを使用して、サンプル・カタログ内のすべての製品を表示するグリッドまたは表を作成できます。

この例では、次の2つの追加操作を実行する必要があります。

  • 属性値をその所属先アセットに基づいてグループ化するために、BYASSETパラメータをtrueに設定する必要があります。

  • この例では、アセットのIDが必要なため、ASSETSET.GETASSETLISTタグを使用してそれらのIDを取得する必要があります。

最初に、次のコードによってリスト・オブジェクトを作成します。

<LISTOBJECT.CREATE NAME="lo" COLUMNS="attributename,attributetypename,direction"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="color" attributetypename="PAttributes" direction="none"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="style" attributetypename="PAttributes" direction="none"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="price" attributetypename="PAttributes" direction="none"/>
<LISTOBJECT.ADDROW NAME="lo" attributename="sku" attributetypename="PAttributes" direction="none"/>
<LISTOBJECT.TOLIST NAME="lo" LISTVARNAME="lolist"/>

次に、属性値を取得します。

<ASSETSET.GETMULTIPLEVALUES NAME="as" LIST="lolist" PREFIX="grid" BYASSET="true"/>

次に、ASSETSET.GETASSETLISTタグを使用します。

<ASSETSET.GETASSETLIST NAME="as" LISTVARNAME="aslist"/>

このタグは、次の列が含まれたリストを返します。

  • assettype

  • assetid

両方のリストを使用して、すべての製品とそれらのすべての属性値を表示するグリッドを作成できます。

<TABLE>
<LOOP LIST="aslist">
<TR>
<TD><CSVAR NAME="grid:aslist.assetid:sku.value"/></TD>
<TD><CSVAR NAME="grid:aslist.assetid:price.value"/>
   </TD>
<TD><CSVAR NAME="grid:aslist.assetid:style.value"/>
</TD>
<TD>
<IF COND="IsList.grid:aslist.assetid:color=true"><THEN>
<LOOP LIST="grid:aslist.assetid:color">
<CSVAR NAME="grid:aslist.assetid:color.value"/>&nbsp;
</LOOP>
</THEN></IF>
</TD>
</TR>
</LOOP>
</TABLE>

結果は次のようになります。

表20-1 すべてのジーンズとそれらの属性値を表示する表

SKU 価格 スタイル

jeans-1

35

wide

blue

jeans-2

30

straight

black blue

jeans-3

25

straight

black green

jeans-4

20

wide

green

20.6.4.6 価格範囲に基づいたジーンズの検索

ここまでは、この項の2行目のコードで作成された同じアセット(NAME=as)を使用してきました。次に、範囲制約を使用して、price属性に基づいてアセットセットをフィルタリングします。

次のコード行は、この項の1行目のコードで作成された元の検索状態(NAME=ss)に範囲制約を追加します。

<SEARCHSTATE.ADDRANGECONSTRAINT NAME="ss" ATTRIBUTE="price" TYPENAME="PAttributes" LOWER="0" UPPEREQUAL="30"/>

範囲は0から30です。変更した検索状態をアセットセットに適用します。

<ASSETSET.SETSEARCHEDASSETS NAME="as" CONSTRAINT="ss" ASSETTYPES="Products"/>

アセットセットに現在含まれているジーンズの数を取得して表示することで、この検索状態が正常に機能したかどうかを確認します。

<ASSETSET.GETASSETCOUNT NAME="as" VARNAME="count"/>
How many jeans products are less than or equal to $30?
<ics.getvar name=count/>

結果は次のようになります。

How many jeans products are less than or equal to $30? 3

20.6.4.7 色のワイルドカードを使用したジーンズの検索

ここで、price属性に基づいたこの範囲制約を、bという文字で始まる色が用意されているジーンズをこのアセットセットから抽出する検索絞込み条件に置き換えます。

最初に、次のコード行によって価格の範囲制約を削除します。

<SEARCHSTATE.DELETECONSTRAINT NAME="ss" ATTRIBUTE="price"/>

次のコード行では、VALUEパラメータでパーセンテージ(%)記号をワイルドカードとして使用して、色に関する新しい制約を追加します。

<SEARCHSTATE.ADDSIMPLELIKECONSTRAINT NAME="ss" ATTRIBUTE="color" TYPENAME="PAttributes" VALUE="b%"/>

VALUE="b%"文は、bという文字で始まる任意の色が対象になることを指定します。変更した検索状態を同じアセットセット(as)に適用します。

<ASSETSET.SETSEARCHEDASSETS NAME="as" CONSTRAINT="ss" ASSETTYPES="Products"/>

また、アセットセット内のジーンズの数を取得および表示することによって、これが機能していることを確認します。

<ASSETSET.GETASSETCOUNT NAME="as" VARNAME="count"/>
How many jeans have a color that begins with the letter b? 
<ics.getvar name=count/>

結果は次のようになります。

How many jeans have a color that begins with the letter b? 3

20.6.4.8 特定の色のジーンズの検索

最後に、この色制約を、blueまたはblackのどちらかが用意されているジーンズをこのアセットセットから抽出する絞込み条件に変更します。

次のコード行によって色制約を検索状態から削除します。

<SEARCHSTATE.DELETECONSTRAINT NAME="ss" ATTRIBUTE="color"/>

次に、color属性の2つの値に基づいてフィルタリングするために、これらの値が含まれたリスト・オブジェクトを作成する必要があります。

<LISTOBJECT.CREATE NAME="lo" COLUMNS="value"/>
<LISTOBJECT.ADDROW NAME="lo" value="blue"/>
<LISTOBJECT.ADDROW NAME="lo" value="black"/>
<LISTOBJECT.TOLIST NAME="lo" LISTVARNAME="colorlist"/>

colorlistという名前のリスト変数を使用して検索状態を作成します。

<SEARCHSTATE.ADDSTANDARDCONSTRAINT NAME="ss" ATTRIBUTE="color" TYPENAME="PAttributes" LIST="colorlist"/>

LIST=colorlist文は、前述の例のVALUE文に相当しますこの文は、colorlistという名前のリスト内のいずれかの色と一致する属性値が対象となることを指定します。変更した検索状態を同じアセットセットに適用します。

<ASSETSET.SETSEARCHEDASSETS NAME="as" CONSTRAINT="ss" ASSETTYPES="Products"/>

また、アセットセット内のジーンズの数を取得および表示することによって、これが機能していることを確認します。

<ASSETSET.GETASSETCOUNT NAME="as" VARNAME="count"/>
How many products have a color that is black or blue?
<ics.getvar name=count/>

結果は次のようになります。

How many products have a color that is black or blue? 3

20.7 ハイパーリンクのURLの作成

サイトは動的にも静的にもできますが、そのコンテンツは定期的に変わります。そのため、URLをハイパーリンクにハードコード化することはできません。レンダリングの時点で、ページ上にリンクが提供されているアセットのIDを判別できる必要があります。

WebCenter Sitesでは、URLを作成するために使用できる次の3つのタグが用意されています(それぞれのタグにはXMLバージョンとJSPバージョンがあります)。

  • BLOBではないアセットのURLについては、RENDER.GETPAGEURLタグを使用します。

  • BLOBであるアセットのURLについては、RENDER.SATELLITEBLOBタグまたはRENDER.GETBLOBURLタグを使用します。

次のトピックを参照してください。

20.7.1 RENDER.GETPAGEURL (render:getpageurl)

標準アセット(BLOBではないアセット)のURLを取得するには、RENDER.GETPAGEURLタグを使用します。

RENDER.GETPAGEURLタグは、このタグの起動元のエレメントから渡された引数をURLエンコードされた文字列に変換して、この文字列をOUTSTRパラメータで指定された変数として返します。慣例的に、この変数の名前はreferURLです。

rendermodeがexportに設定されている場合は、このタグは静的URLを作成します(ただし動的URLになるように指定している場合は除きます)。rendermodeがliveに設定されている場合、このタグは動的URLを作成します。

次に例を示します。

<RENDER.GETPAGEURL PAGENAME="FiscalNews/Article/Full
cid="Variables.cid"
c="Article"
p="Variables.p"
OUTSTR="referURL"/>

これで、referURL変数の値を使用して、<A HREF>タグ付きのハイパーリンクを作成できます。

Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスを参照してください。

20.7.2 RENDER.SATELLITEBLOB (render:satelliteblob)

WebCenter Sitesデータベースに格納されているバイナリ・ラージ・オブジェクト(BLOB)は、WebCenter SitesサーブレットではなくBlobServerサーブレットによって提供されます。RENDER.SATELLITEBLOBタグは、BlobServer URLが埋め込まれたHTMLタグを返します。

このタグは、BLOBを定義する一連の引数と、BLOBの形式設定方法を指定する追加の一連の引数を受け取ります。たとえば、このタグを使用して、次のように<IMG SRC>タグや<A HREF>タグを作成できます。

<RENDER.SATELLITEBLOB 
BLOBTABLE=ImageFile 
BLOBKEY=id 
BLOBCOL=urlpicture 
BLOBWHERE=Variables.asset:id 
BLOBHEADER=Variables.asset:mimetype 
SERVICE=IMG SRC 
ARGS_alt=Variables.asset:alttext 
ARGS_hspace=5 ARGS_vspace=5/>

blob型のフレックス属性のURLを作成する場合は、追加のコーディング手順が必要になることに注意してください。BLOB型のフレックス属性についてを参照してください。

Satellite Serverを使用していない場合でも、RENDER.SATELLITEBLOBタグを使用してください。このタグは、Satellite Serverが存在しない場合でも、HTMLタグに埋め込まれたBlobServer URLを作成できるからです。

Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスを参照してください。

20.7.3 RENDER.GETBLOBURL (render:getbloburl)

BlobServer URLのみが必要な場合は(そのURLがHTMLタグに埋め込まれない状態で)、RENDER.GETBLOBURLタグを使用します。

たとえば、SetHTMLHeaderという名前の次のエレメントは、RENDER.GETBLOBURLエレメントを使用して、BlobServer URL (referURL変数に格納)を取得してから、クライアント側で実行されるJavaScriptコードにこのBlobServer URLを渡して、訪問者が使用しているブラウザが特定されます。この場合は、クライアント側のJavaScriptは、検知したブラウザに基づいてHTMLタグを作成するため、HTMLタグなしのBlobServer URLを必要とします。

SetHTMLHeaderは、CSElementのエレメントです。これは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェースを使用して、path-name/SetHTMLHeader CSElementを検索して調べます。

  • Explorerを使用してpath-name/SetHTMLHeaderエレメントを開きます。

blob型のフレックス属性のURLを作成している場合、追加のコーディング手順があります。BLOB型のフレックス属性についてを参照してください。

Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスを参照してください。

20.7.4 referURL変数の使用

RENDER.GETPAGEURLタグ、RENDER.GETBLOBURLタグおよびRENDER.SATELLITEBLOBタグは、当製品の3.6.xバージョンで導入されました。当製品のこれより前のバージョンでは、GetPageURLおよびGetBlobURLというエレメントを使用してURLを取得していました。これらのエレメントは、URLをreferURLという変数に格納して返すようにコーディングされています。

慣例的に、GetPageURLエレメントとGetBlobURLエレメントの後継として導入されたタグを使用しているサンプル・サイト内のすべてのサンプル・コードでは、URLの値を格納するためにreferURL変数が使用されています。

referURL変数の値や、RENDER.GETPAGEURLタグまたはRENDER.GETBLOBURLタグによって返される他のどの変数の値にも、テキストを一切追加しないでください。このタイプの変数に格納されているURLは完全なもの(URL全体)です。これらのタグによって返されるURLを変更した場合は、そのURLが壊れる可能性があります。

URLに追加の引数を含める必要がある場合は、RENDER.PACKARGSタグを使用してそれらの引数をURLエンコード(パック)してから、それらのエンコードされた引数をPACKEDARGSパラメータを通じてRENDER.GETPAGEURLタグまたはRENDER.GETBLOBURLタグに渡します。

Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスを参照してください。

20.8 エラー状態の処理

エレメント・コードは、エラー状態をチェックできますか。どの状態が重大であるのかを決定して、必要に応じて、解決策や代替アクションをコーディングしてください。場合によっては、わかりやすいエラー・メッセージを記述することが解決策になります。また、破損したページがキャッシュされないようにするコードを含めることもできます。

注意:

コードをデバッグする際は、commons-logging.propertiesファイルとloggingconfig.xmlファイルを使用してログ出力を有効にできます。これにより、エラー・メッセージとデバッグ・メッセージはWebCenter Sitesのログ・ファイルに書き込まれます。デバッグ・プロパティの詳細は、『Oracle Fusion Middleware Oracle WebCenter Sitesプロパティ・ファイル・リファレンス』を参照してください。

トピック:

20.8.1 errno変数の使用

標準のWebCenter Sites変数であるerrno変数には、WebCenter SitesのXMLタグやJSPタグによって報告されるエラー番号が格納されます。WebCenter Sitesのタグを正常に実行できない場合は、そのタグによって、その理由を最も適切に示す値にerrnoが設定されます。たとえば、-13004というerrno値は、CURRENCYタグが読み取ろうとした数値が正しい通貨形式でなかったために、その数値を読み取ることができなかったことを示します。すべてのerrno値のリストとそれらの説明については、『Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンス』のエラー状態に関する項を参照してください。

WebCenter Sitesのモジュールと製品で用意されているタグの実行前にerrnoがクリアされるため、これらのタグでエラーの有無をチェックする際に、errnoを0に設定する必要はありません。ただし、タグを実行する前にエラー番号をクリアすることをお薦めします。次のコード例では、子アセットのロードを試行する前にASSET.LOADが正常に実行されたかどうかを確認します。

<ASSET.LOAD NAME="topArticle" TYPE="Article" 
OBJECTID="Variables.cid"/>
<IF COND="IsError.Variables.errno=false">
<THEN>
<ASSET.CHILDREN NAME="topArticle" 
LIST="listOfChildren/>
</THEN>
</IF>

WebCenter Sitesで用意されているタグの結果をチェックするには、結果をチェックするタグの前に、errno値をクリアするコードを配置する必要があります。次に例を示します。

<SETVAR NAME=errno VALUE=0/>

次のコード例では、テンプレートの開発プロセス中に使用できるエラー・メッセージを示しています。

<IF rendermode=preview>
<THEN>
<IF COND=IsError.Variables.errno=true>
<THEN>
<FONT COLOR=#FF0000>
Error <ics.geterrno/>
while rendering <ics.getvar name=pagename/> 
with asset ID <ics.getvar name=cid/>.
</FONT>
</THEN>
</IF>
</THEN>
</IF>

20.8.2 間違ったページのキャッシングの防止

エレメントの出力が間違っていると判断できる場合は、おそらくWebCenter SitesやSatellite Serverによってそのページがキャッシュされる必要はありません。ics.disablecacheタグを使用して、生成されるページがキャッシュされることを防止できます。

例1: エラー状態

「errno変数の使用」の1つ目の例の続きとして、記事アセットをロードできなかった場合は、そのページをキャッシュする理由もありません。そのコード例のIF条件に、次のELSE文を追加できます。

<ASSET.LOAD NAME="topArticle" TYPE="Article" 
OBJECTID="Variables.cid"/>
<IF COND="IsError.Variables.errno=false">
<THEN>
<ASSET.CHILDREN NAME="topArticle" 
LIST="listOfChildren/>
</THEN>
<ELSE>
<ics.disablecache/>
</ELSE>
</IF>

例2: アセットのステータスがVOの場合にキャッシュからページをクリア(ベーシック・アセットのみ)

「ページの生成と構成依存性」の「CacheManagerと動的パブリッシュ・セッション」で説明したように、宛先システム上のCacheManagerは、パブリッシュ・セッションの影響を受けたすべてのページとページレットを再生成します。これらの影響を受けたページには、削除された依存アセットが属するページも含まれます。

削除されたアセットのステータスはVOに設定されます。ASSET.LOADタグとasset:loadタグは、実行前にアセットのステータスをチェックしないため、削除されたアセットをロードでき、実際にロードします。通常は、このことは問題ではありません。なぜでしょうか。アセットに対する他のアセットからのすべてのリンクが削除されないかぎり、そのアセットを削除できないからです。したがって、サイトが再生成されたときには、削除されたアセットを表示するページやページレットへのリンクはもう存在しません。しかし、キャッシュ内の削除されたアセットを表示するページやページレットを残しておく必要はありません。

次のコード例は、アセットをロードできない場合やアセットのステータスが削除された場合は、ページがキャッシュされることを防止します。

<ASSET.LOAD TYPE="Variables.c" OBJECTID="Variables.cid" NAME="WireStoryTextArticle"/>
<!-- if the asset cannot be loaded, then flush the pagelet from cache -->
<if COND="IsError.Variables.errno=true">
<then>
<ics.disablecache/>
</then>
</if>
<ASSET.SCATTER NAME="WireStoryTextArticle" PREFIX="asset"/>
<!-- if the asset is marked as void, then flush the pagelet from cache -->
<if COND="Variables.asset:status=VO">
<then>
<ics.disablecache/>
</then>
</if>

フレックス・アセットのステータスをチェックするコードを含める必要はありません。SEARCHSTATEタグとsearchstateタグは、ステータスがVOのアセットを返しません。また、ASSETSETタグとassetsetタグは、ステータスがVOのアセットを、作成するアセットセット内に含めません。

20.9 ページ引数のエンコード

引数をエンコードするには、encodeParameterエレメントを呼び出します。excludeParametersLst引数値フィールドには、エンコードしない引数を含めることができます。この方法は、セキュアなコーディングを行う場合や、URLで引数をテンプレートに渡す場合などに、ベスト・プラクティスとして使用します。

 <ics:callelement element="UI/Utils/encodeParameters"> 
 <ics:argument name="excludeParametersLst" 
 value="<list_of_comma_seperated_args>"/> 
  </ics:callelement> 

次に例を示します。

 <ics:callelement element="UI/Utils/encodeParameters"> 
 <ics:argument name="excludeParametersLst" value="attributes, 
 displayData,browseUrl,chartParams"/> 
 </ics:callelement> 

20.10 XSS攻撃からのサイトの保護に関する必知事項

サイト用に記述したカスタム・エレメントでカスタム・パラメータおよびシステム・パラメータをサニタイズしましたか。

クロス・サイト・スクリプティング(XSS)攻撃を回避するには、まず脆弱なパラメータを識別し、次にビジネス・ロジックに従ってそれらをエンコードまたはサニタイズする必要があります。