ヘッダーをスキップ
Oracle® Fusion Middleware WebCenter Sites開発者ガイド
11gリリース1 (11.1.1.8.0)
E49681-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
次
 

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

エレメントは、コンテンツを指定、抽出および表示するコードを提供します。WebCenter Sitesシステムでは、コンテンツはアセットとして保管されます。したがって、エレメント内のXMLコードやJSPコードの多くは、適切なコンテキストの適切なアセットを指定し、そのアセットのデータを抽出および表示するために使用されます。

この章では、テンプレート・アセットおよびCSElementアセット用に作成するエレメントのコーディング方法について説明します。アセット自体の作成については、第23章「テンプレート・アセット、CSElementアセットおよびSiteEntryアセットの作成」を参照してください。

この章には次の項が含まれます。

28.1 依存性について

WebCenter Sitesシステムは、次の2種類の依存性を追跡し、それらに基づいて正確に機能します。

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

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

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

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

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

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

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

28.1.1.1 承認依存性の計算

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

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

依存性の計算のベースとなるのは何でしょうか。それは次のようにパブリッシュ方法に依存します。

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

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

28.1.1.2 Exists、ExactおよびNone

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

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

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


注意:

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


Exists

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

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

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

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

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

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

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

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

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

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

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

Exact

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

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

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

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

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

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

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

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

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

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

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

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

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

None

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

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

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

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

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

Burlington Financialサンプル・サイトについて考えます。このサンプル・サイトの記事のアセットは、コンテキストに応じて、様々なテンプレートでレンダリングできます。

では、Burlington Financialサンプル・サイトの記事アセットを承認する場合、承認プロセスでは記事の依存性を判別するためにどのテンプレートを使用する必要があるでしょうか。それは、すべてのテンプレートの最も代表的な一連の依存性が含まれるテンプレートです。たとえば、Burlington FinancialのFullという名前のテンプレート記事を参照してください。開発者は、各タイプのアセットのすべての考えられる依存性が含まれた特別なテンプレートを作成できます。

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

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

l_d_templates01_small.pngの説明が続きます
図l_d_templates01_small.pngの説明

l_d_templates02_small.pngの説明が続きます
図l_d_templates02_small.pngの説明


注意:

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


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

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

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

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

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

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

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

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

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

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

CacheManagerとページ・キャッシュ

CacheManagerは、WebCenter Sitesのページ・キャッシュを管理します。アセットが変更されると、CacheManagerはSystemItemCache表を調べて、それらのアセットがレンダリングされたキャッシュ済ページを特定します。次に、CacheManagerはSystemPageCache表を処理して、適切なページをフラッシュおよび再生成します。

CacheManagerは、WebCenter Sitesのページ・キャッシュに変更を加えた後に、その情報をWebCenter Sitesシステムに属しているすべてのSatellite Serverに通知するとともに、共存Satellite ServerおよびシステムにインストールされたすべてのリモートSatellite Serverにも通知します。その後、Satellite Serverアプリケーションは、Satelliteページ・キャッシュを更新します。


注意:

適切な権限を持っている場合は、SystemItemCache表とSystemPageCache表内のデータを調べることができますが、WebCenter Sitesデータベース内の他のシステム表と同様に、これらの表に格納されている情報は一切変更しないでください。


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

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

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

CacheManagerとプレビュー機能

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

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

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

エレメントのコーディング時には、依存性を正確にログに記録するコードを記述する必要があります。

構成依存性をログに記録するためのいくつかのタグが存在します。このタグが実行されると、WebCenter Sitesは、レンダリングされたページとアセットの間の依存性をSystemItemCache表に書き込むことで、この依存性情報をログに記録します。

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

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

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

28.2.1 ASSET.LOADおよびasset:load

WebCenter SitesがASSET.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"/>

28.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という名前のアセットセット内の各製品アセットとレンダリングされたページの間に構成依存性が存在することを定義しています。

アセット・セットと検索状態の詳細は、第28.5.1項「アセットセット」および第28.5.2項「検索状態」を参照してください。

承認依存性タイプの設定

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

例:

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

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

28.2.3 RENDER.GETPAGEURLおよびrender:getpageurl

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

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

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

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

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

28.2.4 RENDER.LOGDEP (render:logdep)

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

例1:

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

<render:callelement name=BurlingtonFinancial/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"/>
...

承認依存性タイプの設定

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

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

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

28.2.5 RENDER.FILTERおよびrender:filter

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

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

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

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

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

  • SELECTTO文とEXECSQL問合せ

例:

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

28.2.6 RENDER.UNKNOWNDEPSおよびrender:unknowndeps

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

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


注意:

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


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

28.3 CSElementアセットとSiteEntryアセットのコール

設計上の要件として、コード側でCSElementアセットまたはSiteEntryアセットをコールする必要がある場合は、そのアセット自体をロードする必要はありません。コーディングの観点からは、開発者の関心対象はアセットとしてのCSElementやSiteEntryではなく、そのアセットが表しているエレメント・エントリやページ・エントリのみです。したがって、コード側で、適切なタグを使用してそのエレメント・エントリやページ・エントリを直接呼び出すことができます。

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

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

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

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

注意:

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

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

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


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

テンプレートのエレメントをコーディングするには、そのテンプレートによって形式設定されるアセット・タイプの設計を理解する必要があります。データ設計とサイト設計について事前に理解しておくことで、更新されたアセットを再表示するためにテンプレートを再コーディングする必要がなくなります。(そのために、この開発者ガイドではデータ設計とサイト設計の両方を扱っています。)

たとえば、Burlington FinancialサイトのHomeページ・アセットには、名前付きアソシエーションを通じて次の4つのコレクションと1つの問合せが割り当てられています。

Homeページ・アセットには、同じくHomeという名前のテンプレートが割り当てられています。このHomeテンプレートは、これらの名前付きアソシエーションを通じてHomeページに関連するこれらのコレクションと問合せを識別するようにコーディングされているとともに、これらのコレクション内のアセットおよびこの問合せによって返されるアセットを表示するようにコーディングされています。

Homeテンプレートは、これらのアソシエーションを通じてHomeページと関連付けられた任意のコレクションまたは問合せを処理するようにコーディングされているため(特定の記事を抽出するようにハードコード化されているのではなく)、このページに表示されるアセットを必要な頻度で更新できますが、このコードを変更する必要はありません。

コンテンツ・プロバイダはこれらのコレクション内の記事を変更でき、ワイヤー・フィード・サービスはWirefeed問合せによって取得される記事を毎日更新できます。これらのコレクション内でどの記事が選択されているのかや、この問合せによってどの記事が返されるのかにかかわらず、これらの記事は常に同じように形式設定されます。

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

開始する前に、このガイドの「プログラミングの基本事項」の各章を必ず参照してください。特に、第4章「Oracle WebCenter Sitesを使用したプログラミング」を参照してください。

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

ベーシック・アセットを表示する他のコード例については、第29章「ベーシック・アセットのテンプレート・エレメント例」を参照してください。

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

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

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

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

<?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タグを使用して、それらのリンクが正しくレンダリングされるようにします。

さらに複雑な記事テンプレートの例については、Burlington FinancialのFullという名前のテンプレートを調べてください。それは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェース内で検索して検査します。

  • Oracle WebCenter Sites Explorerを使用し、次の名前のテンプレート・エレメントを開きます。

ElementCatalog/BurlingtonFinancial/Article/Full. 

このテンプレート・エレメントは、ブラウザ上のページに全体表示される際の記事の形式を提供します。

28.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="BurlingtonFinancial/ImageFile/TeaserSummary" ARGS_cid="associatedImage.oid"/> 
</THEN> 
</IF> 

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

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

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

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

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

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

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

28.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タグは、埋込みリンクが含まれたフィールドのコンテンツを取得したときに、埋込みリンクを適切に管理します。

28.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"/>

より長いコード例については、Burlington FinancialのMainStory Listという名前のテンプレートを調べてください。それは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェース内で検索して検査します。

  • Oracle WebCenter Sites Explorerを使用し、次の名前のテンプレート・エレメントを開きます。

    ElementCatalog/BurlingtonFinancial/Collection/MainStoryList
    

このテンプレート・エレメントは、他の2つのテンプレートの2つのページ・エントリをコールします。これら2つのうち1つ目のページ・エントリのルート・エレメントは、コレクション内の最上位ランクの記事を表示します。2つ目のページ・エントリのルート・エレメントは、残りの記事を表示します。

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

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

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

次のコード部分は、Burlington FinancialのStoryListテンプレートから抜粋したものであり、このタグを例示しています。

<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="BurlingtonFinancial/Article/Summary"
ARGS_cid="ApprovedArticles.oid" 
ARGS_p="Variables.p"/>
</LOOP>
</THEN>
</IF>

28.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タグを挿入してください。そうすることで、これらのアセットとレンダリングされたページの間の構成依存性を正しく追跡できます。

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

28.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>

より長いコード例については、Burlington FinancialのPlainListという名前の問合せテンプレートを調べてください。それは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェース内で検索して検査します。

  • Oracle WebCenter Sites Explorerを使用し、次の名前のテンプレート・エレメントを開きます。

ElementCatalog/BurlingtonFinancial/Query/PlainList. 

このエレメントは、PlainListQuery問合せアセットを実行するためのExecuteQueryエレメントを呼び出して、パブリッシュ方法がディスクへのエクスポートの場合はすべての非承認アセットを除外してから、得られるリストをループ処理して、そのリスト内の各アイテムの動的URLを取得して、そのURLのハイパーリンクを作成します。

ハイパーリンクの詳細は、第28.7項「ハイパーリンクのURLの作成」を参照してください。

問合せと構成依存性

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="BurlingtonFinancial/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/>

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

28.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="BurlingtonFinancial/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="BurlingtonFinancial/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テンプレートは、WireFeed問合せによって返される各記事のサマリー・テキストを表示するページレットを作成して、そのページレットをこのページに渡して戻し、そのページレットがこのページ上で表示されます。

さらに複雑なページ・アセット・テンプレートの例については、Burlington FinancialのSectionFrontという名前のテンプレートを調べてください。それは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェース内で検索して検査します。

  • Oracle WebCenter Sites Explorerを使用し、次の名前のテンプレート・エレメントを開きます。

ElementCatalog/BurlingtonFinancial/Page/SectionFront

このエレメントは、SectionFrontページを作成します。このページは、上部に配置されたナビゲーション・バー、左側に配置されたリンク付きのナビゲーション領域、記事のリストなどで構成されています。

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

ベーシック・アセットのテンプレートをコーディングする際は、WebCenter SitesのASSETタグ・ファミリを使用します。たとえば、ベーシック・アセットを抽出して表示するには、ASSET.LOADタグを使用します。このタグは、そのアセット・タイプのプライマリ記憶域表からデータを抽出します。

フレックス・アセットのデータベース・スキーマはベーシック・アセットのデータベース・スキーマと異なるため、WebCenter Sitesでは、ASSETタグ群のかわりに使用する次のフレックス・アセット用タグ・ファミリが用意されています。

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

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

28.5.1 アセットセット

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

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

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

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

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

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

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

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

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

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

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

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

28.5.2 検索状態

表示するフレックス・アセットのIDをどのようにして取得しますか。そのためには、検索状態オブジェクトを使用します。

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

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

絞込み条件が指定されていない検索状態をアセットセットに適用すると、そのタイプのすべてのアセットのフィルタリングされないリストが作成されます。たとえば、次のコード例では、GE 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 WebCenter Sitesタグ・リファレンスで説明されており、これらのうちいくつかはこの章のコード例で使用しています。

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

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

たとえば、GE Lightingサンプル・サイトでは、フレックス記事とフレックス・イメージの両方が含まれたアセットセットを作成できます。これらはコンテンツ・アセット属性という同じ属性アセット・タイプを使用しているからです。ただし、フレックス記事はコンテンツ属性アセット・タイプを使用しており、製品は製品属性アセット・タイプを使用しているため、フレックス記事と製品アセットの両方が含まれたアセットセットを作成することはできません。

28.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/>

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

フレックス・アセット・モデルを使用するオンライン・サイトのテンプレートをコーディングする際は、開発者の主な関心対象はフレックス属性の値です(フレックス属性自体がアセットです)。

フレックス・アセット(製品など)やフレックス親アセットは、そのアセットを表示するコンテキストで考慮される場合は、実際には属性値を抽象化したものです。

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

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

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

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

GE Lightingサンプル・サイトと、Burlington Financialサンプル・サイトに対するEngage拡張では、WebCenter Sitesに付属しているコーディング・ツールセットとフレックス・アセット・データ・モデルの最大限の機能を示しています。これらのサンプル・サイト内のテンプレートとエレメントでは、実環境とほぼ同じ量のデータを表示するフル機能を備えたオンライン・サイトのコードを示しています。

この項に記載されているコード例は、サンプル・サイト内のエレメントよりも簡単です。これらの例として最初に紹介するのは、小さいサンプル・データ・セットを操作するシンプルなアセットセット(hello assetset)と検索状態(hello searchstate)です。

これらの例で使用するサンプル・データ・セットは、次のように製品フレックス・ファミリに基づいています。

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

フレックス属性

製品属性

PAttributes

フレックス・アセット

製品

Products

フレックス親

製品親

ProductGroups

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

なし

なし


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

属性 データ型 値の数

sku

string

single

color

string

multiple

price

integer

single

style

text

single


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

sku color price style

jeans-1

35

wide

jeans-2

blue、black

30

straight

jeans-3

black、green

25

straight

jeans-4

green

20

wide


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

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

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

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

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

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

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

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

28.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値)を問い合せることで作成されたため、このアセットセットの正確なコンテンツがわかります。これが、FIXEDLISTパラメータをtrueに設定した理由です。これで、ASSETSET.SETSEARCHEDASSETタグによって、この製品アセットの構成依存性がログに記録されるようになります。

28.6.2.2 製品の価格の取得

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

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

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

28.6.2.3 製品の価格の表示

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

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

28.6.2.4 製品の色の取得

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

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

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

28.6.2.5 製品の色の表示

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

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

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

Colors: black blue

28.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"/>

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

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

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

28.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.attrName
fieldname=value/>&nbsp; </LOOP><P/> </LOOP>

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

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

color is blue black
price is 30

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

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

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

28.6.3.1 TEXT型のフレックス属性

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

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

28.6.3.2 BLOB型のフレックス属性

第11章「データ・デザイン: アセット・モデル」で説明したように、フレックス・アセット・タイプの_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の実際の値を抽出できます。

28.6.3.3 BlobServer URLの作成

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

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

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


  • 注意:

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


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

属性 データ型 値の数

説明

blob

single


最初に、アセットセットを作成して、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を返します。

28.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"/>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<SEARCHSTATE.CREATE NAME="ss"/>

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

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

28.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

28.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

28.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

28.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>

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

jeans-1

35

wide

blue

jeans-2

30

straight

black blue

jeans-3

25

straight

black green

jeans-4

20

wide

green


28.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

28.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

28.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

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

動的サイトか静的サイトかにかかわらず、WebCenter Sitesシステムを使用しているということは、コンテンツが定期的に変化するということです。このため、URLをハイパーリンク内にハードコード化できません。ページは、ディスクへのエクスポートのパブリッシュ方法によってまたは動的サイト上の訪問者のブラウザによってレンダリングされる際に、そのページでリンクを提供している、対象のアセットのIDを特定できる必要があります。

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

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

28.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="BurlingtonFinancial/Article/Full
cid="Variables.cid"
c="Article"
p="Variables.p"
OUTSTR="referURL"/>

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

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

28.7.2 RENDER.SATELLITEBLOB (render:satelliteblob)

WebCenter Sitesデータベースに格納されているバイナリ・ラージ・オブジェクト(BLOB)は、ContentServerサーブレットではなく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を作成する場合は、追加のコーディング手順が必要になることに注意してください。詳細は、第28.6.3.2項「BLOB型のフレックス属性」を参照してください。

より長いコード例については、Burlington FinancialのTeaserSummaryという名前のイメージファイル・テンプレートを調べてください。それは、次の2つの方法で調べることができます。

  • WebCenter Sitesインタフェース内で検索して検査します。

  • Oracle WebCenter Sites Explorerを使用し、次の名前のテンプレート・エレメントを開きます。

ElementCatalog/BurlingtonFinancial/ImageFile/TeaserSummary.

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

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

28.7.3 RENDER.GETBLOBURL (render:getbloburl)

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

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

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

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

  • Oracle WebCenter Sites Explorerを使用して次のエレメントを開きます。

ElementCatalog/BurlingtonFinancial/Common/SetHTMLHeader

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

RENDER.GETBLOBURLタグの詳細は、Oracle Fusion Middleware WebCenter Sitesタグ・リファレンスを参照してください。

28.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タグに渡します。

RENDER.PACKARGSタグの詳細は、Oracle Fusion Middleware WebCenter Sitesタグ・リファレンスを参照してください。

28.8 エラー状態の処理

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


注意:

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


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

28.8.1 errno変数の使用

標準のWebCenter Sites変数であるerrno変数には、WebCenter SitesのXMLタグやJSPタグによって報告されるエラー番号が格納されます。WebCenter Sitesのタグを正常に実行できない場合は、そのタグによって、その理由を最も適切に示す値にerrnoが設定されます。たとえば、-13004というerrno値は、CURRENCYタグが読み取ろうとした数値が正しい通貨形式でなかったために、その数値を読み取ることができなかったことを示します。すべてのerrno値のリストとそれらの説明については、Oracle Fusion Middleware 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/>

より長いコード例については、Burlington FinancialのBurlingtonFinancial/Util/Account/SignUpという名前のCSElementを参照してください。このCSElementは、サイトにメンバーを追加して既存メンバーの情報を更新するコードを提供します。このCSElementは、いくつかのエラー状態の有無をチェックして、それらに対する適切な対応を提供します。

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

<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>

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

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

例1: エラー状態

第28.8.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の場合にキャッシュからページをクリア(ベーシック・アセットのみ)

第28.1.2項「ページの生成と構成依存性」「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のアセットを、作成するアセットセット内に含めません。