この章の内容は次のとおりです。
アセット自体の作成の詳細は、「テンプレート・アセット、CSElementアセットおよびSiteEntryアセットの作成」を参照してください。
WebCenter Sitesシステムは、次の2種類の依存性を追跡し、それらに基づいて正確に機能します。
承認依存性。これらは承認済アセットをパブリッシュできるかどうかを決定する条件です。
承認システムは、アセットの承認時、そのアセットの承認依存性を計算します。同じく承認する必要のある依存アセットが存在する場合、親アセットはパブリッシュされません。
構成依存性。これらはページ構成の依存性を表します。これらは、アセットがレンダリングされるページおよびページレットと、そのアセットとの間の依存性であり、ページを再生成する必要があるかどうかを決定します。
WebCenter Sitesサーブレットは、ページをレンダリングする際に構成依存性をログに記録します。CacheManagerは、この依存性ログを調べて、キャッシュされたページをいつ再生成するのかを決定します。ディスクへのエクスポートのパブリッシュ方法は、この依存性ログを調べて、エクスポートされたページ・ファイルをいつ再生成する必要があるのかを決定します。
注意:
開発者はエレメントをコーディングする際、構成依存性が正確にログに記録されるようにする必要があり、静的サイトを設計している場合は、承認依存性が適切に設定されるようにする必要もあります。
この項には次のトピックが含まれます:
管理システム上で作業するパブリッシャ、エディタおよびコンテンツ・プロバイダは、ターゲット宛先にパブリッシュされるアセットを承認します。次にパブリッシュ・システムは、管理チームがWebCenter Sitesシステムに対して設定したスケジュールに従って、バックグラウンド・プロセスとして承認済アセットを自動的にパブリッシュします。
アセットをパブリッシュできるのは、そのアセットがすべての指定された承認依存性を満たしている場合のみです。つまり、すべての関連付けられたアセットが承認済であるか事前にパブリッシュされている必要があります。そうでない場合は、それらの依存性が満たされるまで、つまり依存(関連)アセット自体が同じ宛先へのパブリッシュについて承認されるまで、そのアセットのパブリッシュは保留されます。
この承認プロセスが実行されることで、コンテンツ・チームと編集チームは、アセットの依存性を手動で確認してから大量の関連アセットをパブリッシュするという作業から解放されます。また、アセットのパブリッシュ後にオンライン・サイト上に壊れたリンクが存在している可能性もなくなります。
その後アセットが変更されると、そのアセットは承認済とは見なされなくなるため、再パブリッシュ可能にするには再び承認する必要があります。
この項には次のトピックが含まれます:
承認依存性は、対象アセットの承認時に記録されます。これらの承認依存性は、WebCenter Sitesデータベース内のApprovedAssetDeps
表に書き込まれます。
アセットの承認ステータスは、そのアセットの依存性および関連付けられたアイテムの依存性によって決定されます。前者の依存性には、特定のアセット・アイテムと関連付けられたすべてのアセット・アイテムの承認ステータスが含まれます。
依存性の計算は、パブリッシュ方法に依存します。
ディスクへのエクスポートの場合は、承認システムは、対象アセットに割り当てられたテンプレート、またはそのタイプのアセットのデフォルト承認テンプレート(指定されている場合)を使用して、そのアセットをレンダリングします。テンプレート・コード内のタグによって、承認済アセットの適切な依存アセットを決定する承認依存性が設定されます。現在のアセットをパブリッシュするためには、これらの依存アセットが適切な承認状態になっている必要があります。
サーバーへのミラーリングまたはXMLへのアセットのエクスポートの場合は、承認プロセスはアセット・タイプ間のデータ関係を調べます。ベーシック・アセットはアソシエーションを持っています。フレックス・アセットはファミリ関係を持っています。これらの関係はどちらも、これらのパブリッシュ方法の承認依存性を作成します。たとえば、フレックス・アセットを承認した場合は、そのフレックス・アセットの親アセットが適切な承認状態になるまでは、そのフレックス・アセットはパブリッシュ・セッションの対象になりません。
承認依存性は、exists、exactおよびnoneのいずれかです。この項では、それぞれの承認タイプについて説明します。
CSElementアセットとSiteEntryアセット、埋込みリンクと埋込みページレットおよびOracle WebCenter Sites: Engage訪問者データ・アセットの承認依存性タイプを変更することはできません。フレックス属性を除いて(フレックス属性の依存性タイプはその属性の作成時に設定する)、フレックス・ファミリ・アセット・タイプの承認依存性タイプも変更できません。ベーシック・アセット・タイプの場合、それらに関連付けられたアセットの承認依存性のタイプは、アソシエーション・フィールドの構成時に設定します。
使用しているパブリッシュ方法がディスクへのエクスポートの場合、ページのレンダリング時に構成依存性を設定するタグは、承認システムがアセットをパブリッシュできるかどうかを計算する際に承認依存性も作成します。記述するコードによって、他のアセット用に生成されたページレットに対する承認依存性が設定される場合は、承認タイプをexists、exactまたはnoneに設定できます。
注意:
様々なタイプのアセット間の関係によって作成される承認依存性のタイプについては、『Oracle WebCenter Sitesの管理』の「パブリッシュ」を参照してください。
exists
exists依存性の場合は、依存アセットがターゲット上に存在していることのみが必要であり、そのアセットのバージョンは問われません。exists依存性の場合は、子アセットが変化した場合でも(すなわちその子アセットが承認済でなくなった場合でも)、その子アセットが以前に承認されて同じ宛先にパブリッシュされていた場合は、承認済の親アセットをパブリッシュできます。
たとえば、次の手順では、コレクション・アセットは自身のランク付けされた子とのexists関係を持っています。
あるコレクションとそのコレクションのランク付けされた記事すべてが承認されてターゲットにパブリッシュされます。
ランク付けされた記事のいずれかが再び編集されますが、承認はされません。
このコレクション全体が再び編集されて、承認されて、宛先にパブリッシュされます。
変更されたが承認されていない記事の前のバージョンが存在(exists)しているため、この記事が原因でこのコレクションのパブリッシュが保留されることはありません。
ただし、次の例では、自身の記事とのexists依存性を持つコレクションをパブリッシュできません。
あるコレクションとそのコレクションのランク付けされた記事すべてが承認されますが、パブリッシュはされません。
ランク付けされた記事のいずれかが再び編集されます。
編集された記事は宛先に一度もパブリッシュされなかったため、この記事はその宛先に対してまだ存在しておらず、したがってそのコレクションをパブリッシュできません。このコレクション・アセットは保留されて、このコレクションをパブリッシュするには、このコレクションと編集された記事の両方が承認される必要があります。
exists承認タイプは、一般にリンクに対して有用です。
exact
exact依存性の場合は、依存アセットとターゲット上のアセットのバージョンは一致している必要があります。異なるバージョンの承認済アセットであってはいけません。exact依存性の場合は、宛先上の子アセットのバージョンと親アセットのバージョンが一致しない場合は、親アセットをパブリッシュできません。
次の例では、ページ・アセットは自身の記事アセットとのexact依存性を持っています。
あるページ・アセットとそのアセットの記事アセットすべてが承認されて宛先にパブリッシュされます。
これらの記事のいずれかが再び編集されますが、再承認はされません。
このページ・アセットが編集されて再承認されます。
このページ・アセットは保留されて、WebCenter Sitesインタフェース上で生成されるフォームには、このページ・アセットをパブリッシュ可能にするために承認される必要のあるアセットのリストへのリンクが表示されます。このリストでは、編集されたが再承認されていない記事が表示されます。
編集された記事が承認されます。
このページ・アセットは承認されているため、この時点でパブリッシュできます。この記事とページ・アセットのバージョン・スタンプが一致するからです。
このページ・アセットと関連付けられた別の記事アセットが編集されます。
このページ・アセットと編集された記事アセットの両方が再承認される必要があります。これら2つのバージョン・スタンプが一致しないからです。
この記事は編集されたがまだ再承認されていないため、再承認される必要があります。
このページ・アセットは、この記事の異なるバージョンに対する依存性に基づいてその前に承認されたため、再承認される必要があります。
exact承認タイプは、一般に埋込みコンテンツに対して有用です。
none
none依存性の場合は、依存アセットの承認状態にかかわらず、承認済アセットをパブリッシュできます。承認依存性タイプをnone
に設定するには、承認依存性を設定するタグにDEPTYPE
パラメータを追加して、そのパラメータをnone
に設定します。
DEPTYPE
のnone
という設定は、承認依存性のみに影響します。ディスクへのエクスポートのプロセスによってページが生成されてタグが呼び出されると、構成依存性がログに記録されます。ただし、承認システムが計算時にタグを呼び出すときは、承認依存性はログに記録されません。
ディスクへのエクスポートのパブリッシュ方法を使用するパブリッシュの宛先に対してアセットが承認されると、承認システムはアセットに割り当てられたテンプレートを調査して、その依存性を判別します。
ただし、ディスクへのエクスポートによってアセットが実際にパブリッシュされる際に、必ずしもそのアセットに割り当てられているテンプレートが使用されるわけではありません。なぜでしょうか。なぜなら、別のエレメントのコードによって、特定のケースではそのアセットに別のテンプレートが使用されていると判断される可能性があるからです。
コンテキストに応じて様々なテンプレートでレンダリングできるアセットがあるサイトについて考えてみます。では、このアセットのパブリッシュを承認する場合、承認プロセスで依存性を判断するためにどのテンプレートを使用する必要があるでしょうか。それは、すべてのテンプレートの最も代表的な一連の依存性が含まれるテンプレートです。開発者は、各タイプのアセットのすべての考えられる依存性が含まれた特別なテンプレートを作成できます。
最も代表的な一連の依存性が含まれるテンプレートが、アセットに割り当てることを希望するテンプレートではない場合はどうでしょうか。その場合は、前者のテンプレートをそのタイプのアセットのデフォルト承認テンプレートとして設定してください。
デフォルト承認テンプレートは、アセット・タイプごとおよびパブリッシュ宛先ごとに設定できます。この機能にツリー内でアクセスするには、「管理」タブを選択し、次に「パブリッシュ」→「宛先」→「MyStaticDestinationName」,→「デフォルト・テンプレートの設定」を選択します。
注意:
サーバーへのミラーリングのパブリッシュ方法を使用している宛先上のアセット・タイプのデフォルト承認テンプレートを指定した場合は、そのテンプレートは、「アセットのステータス」画面でそのアセットをプレビューする際に使用されますが、そのアセットが承認またはパブリッシュされる際には使用されません。
静的サイト用にフレックス・アセットを使用している場合は、複数のデフォルト承認テンプレートをファミリ内のそのフレックス・アセット・タイプに割り当てることができます。フレックス定義ごとに異なるデフォルト承認テンプレートを指定できます。
ベーシック・アセットの場合は、サブタイプ機能を使用すると、1つのアセット・タイプのアセットをさらに細かくカテゴリ分けできます。この機能を使用して、他のなんらかの編成構成に基づいて、特定タイプのアセット用に複数のデフォルト承認テンプレートを割り当てることができます。
たとえば、スポーツ記事の承認テンプレートは、海外ニュース記事の承認テンプレートとはおそらく異なるでしょう。この場合は、記事アセット・タイプに対してスポーツのサブタイプと海外ニュースのサブタイプを作成してから、このアセット・タイプの各サブタイプに異なる承認テンプレートを割り当てることができます。
ベーシック・アセットのサブタイプは、通常はアセット・タイプの作成時にアセット記述子ファイル内で作成しますが、アセット・タイプの作成後にサブタイプが必要になった場合は、「一般的な管理」ツリー内の「管理」ノードの下の「アセット・タイプ」オプションを使用して作成します。サブタイプをアセットに割り当てるには、「新規」および「編集」アセット・フォームを使用します。前述のとおり、フレックス・アセットは、それらのフレックス定義というサブタイプを持っています。
ベーシック・アセットのサブタイプの構成の詳細、およびサブタイプ全般の詳細は、「ベーシック・アセット・タイプの設計」を参照してください。
構成依存性は、次のようないくつかの方法で記録されます。
ディスクへのエクスポートのパブリッシュ方法は、ページをレンダリングするときに、構成依存性を適切なパブリッシュ表に記録します。そうすることで、再パブリッシュが必要になったときに、ディスクへのエクスポートのパブリッシュ方法は、どのアセットがパブリッシュ対象なのかに基づいて、再生成する必要のあるページを特定できます。つまり、これらのアセットを構成上の依存アセットとしてログに記録したすべてのページを生成します。
WebCenter Sitesは、ページをレンダリングおよびキャッシュする際に、依存性をSystemItemCache
表に記録します。この表の各行には、アセットのIDと、そのアセットがレンダリングされた生成済ページのIDまたはキャッシュ・キーが格納されています。
CacheManagerとページ・キャッシュ
CacheManagerは、WebCenter Sitesのページ・キャッシュを管理します。アセットが変更されると、SystemItemCache
表を調べて、それらのアセットがレンダリングされたキャッシュ済ページを特定します。次に、SystemPageCache
表を処理して、適切なページをフラッシュおよび再生成します。
CacheManagerは、WebCenter Sitesのページ・キャッシュに変更を加えた後に、その情報をWebCenter Sitesシステムに属しているすべてのSatellite Serverに通知するとともに、共存Satellite ServerおよびシステムにインストールされたすべてのリモートSatellite Serverにも通知します。その後、Satellite Serverアプリケーションは、Satelliteページ・キャッシュを更新します。
注意:
適切な権限を持っている場合は、SystemItemCache
表とSystemPageCache
表内のデータを調べることができますが、WebCenter Sitesデータベース内の他のシステム表と同様に、これらの表に格納されている情報は一切変更しないでください。
CacheManagerは、サーバーへのミラーリングのパブリッシュ・セッション時にパブリッシュ・システムと連動します。サーバーへのミラーリングのパブリッシュ・セッションが終了すると、パブリッシュ・システムは、そのパブリッシュ操作の対象に含まれていたすべてのアセットのすべてのIDのリストを、宛先システム上のCacheManagerサーブレットに提供します。
CacheManagerは、そのリストをキャッシュ内のページについてログに記録された構成依存性と照合し、ページ・キャッシュからフラッシュして再生成する必要のあるページおよびページレットを特定します。その結果に応じてWebCenter Sitesのページ・キャッシュを更新してから、ページのリストを共存SatelliteサーブレットとリモートSatelliteサーブレットに送信します。そうすることで、これらのサーブレットはこれらと同じページをフラッシュして、新しいバージョンのページをWebCenter Sitesのページ・キャッシュから取得できます。
アセットをプレビューする際は(開発システムまたは管理システム上で)、WebCenter Sitesインタフェースは、そのアセットのテンプレートのページ名を実行します。WebCenter Sitesは、そのページをレンダリングおよびキャッシュして、レンダリングされたページとそのアセットの間の構成依存性をログに記録します。
CacheManagerは、アセットの保存時にプレビュー対象ページのキャッシュ済バージョンを更新します。つまり、ユーザーが「保存」をクリックすると、CacheManagerはそのアセットのオブジェクトIDを、キャッシュ内のそれらのページについてログ記録された構成依存性と照合します。次に、ページ・キャッシュ内の適切なページをクリアおよびリフレッシュして、変更されたページに関する情報をSatelliteサーブレットに通知します。
エレメントのコーディング時には、依存性を正確にログに記録するコードを記述する必要があります。
構成依存性をログに記録するためのいくつかのタグが存在します。このタグが実行されると、WebCenter Sitesは、レンダリングされたページとアセットの間の依存性をSystemItemCache
表に書き込むことで、この依存性情報をログに記録します。
ディスクへのエクスポートのパブリッシュ方法を使用している静的サイトの場合は、構成依存性をログに記録するタグは、承認依存性もログに記録できます。アセットが承認されると、承認システムはそのアセットをレンダリングして、そのアセットをパブリッシュできるかどうかを判断します。承認依存性タイプがnoneに設定されているタグを除いて、承認システムは、これらのタグの結果をApprovedAssetDep
表に記録します。依存性タイプnoneの詳細は、「Exists、ExactおよびNone」を参照してください。
この項では、依存性をログに記録するタグをアルファベット順に紹介します。これらのタグおよび他のタグの詳細は、Oracle WebCenter Sitesタグ・リファレンスを参照してください。
この項には次のトピックが含まれます:
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"/>
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という名前のアセットセット内の各製品アセットとレンダリングされたページの間に構成依存性が存在することを定義しています。
アセット・セットと検索状態の詳細は、「アセットセット」および「検索状態オブジェクト」を参照してください。
静的サイト用にフレックス・アセットを使用している場合は、承認システムがassetset
タグを呼び出すと、承認依存性タイプはデフォルトでnone
に設定されることに注意してください。
この値をexists
またはexact
に変更するには:
deptype
パラメータを使用します。次に例を示します。
<assetset:setsearchedassets name=as assettypes=Products constrain=ss fixedlist=true deptype=exists />
assetset:setsearchedassets
タグの承認タイプを設定することに意味があるのは、fixedlist
パラメータがtrue
に設定されている場合のみです。
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のパブリッシュは保留されます。
場合によっては、コード側でアセットを実際にロードすることなく、そのアセットのデータを取得できることがあります。その場合は、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"/> ...
RENDER.FILTER
タグは、問合せによって作成されたアセットのリストに対して使用します。このタグは、非承認アセットをリストまたは問合せから除外します。また、unknownという構成依存性も設定します。 (unknown構成依存性については、「RENDER.UNKNOWNDEPSおよびrender:unknowndeps」を参照してください。)
このタグを使用するのは、問合せ(コレクション・アセットや問合せアセットなど)によって返されたリスト内に非承認アセットが含まれている場合に、その問合せの結果に対する承認依存性を持つ承認済アセットのパブリッシュが保留されないようにする場合です。たとえば、コレクションに含まれている5つの記事のうち2つのみをパブリッシュできない場合でも問題ないように、エレメントに渡された任意の数の記事アセットの適切な形式設定を実行するようそのエレメントがコーディングされているとします。このタグは、非承認アセットを除外するようにディスクへのエクスポートに指示するため、非承認アセットが未パブリッシュのままでも、この問合せを使用しているページをパブリッシュできます。
このタグは、次の場所で使用することが考えられます。
問合せアセットのテンプレート
コレクション・アセットのテンプレート
SELECTTO
文とEXECSQL
問合せ
次に例を示します。
<RENDER.FILTER LIST="ArticlesFromWireQuery" LISTVARNAME="ArticlesFromWireQuery" LISTIDCOL="id"/>
RENDER.UNKNOWNDEPS
タグは、依存アセットが存在しているが、これらのアセットの出所が問合せであるかこれらのアセットが頻繁に変化するという理由で、これらのアセットのIDを予測できないことを通知します。このタグは、レンダリングされたページのunknownという構成依存性をログに記録します。このタグは、ディスクへのエクスポートのパブリッシュ方法については承認依存性を設定しません。
構成依存性がunknownに設定されている場合は、対象ページは、ディスクへのエクスポートのパブリッシュ・セッションが実行されるたびに再生成される必要があり、サーバーへのミラーリングのパブリッシュ・セッションが終了するたびにページ・キャッシュ内で更新される必要があります(更新が必要かどうかにかかわらず)。
注意:
再生成する必要があるページが多いほど、サイトのパブリッシュにかかる時間が長くなるため、このタグは慎重に使用する必要があります。
このタグは、依存アセットをまったく特定できないコーディング状況に対応するために使用します。たとえば、問合せは動的であるため、実行されるたびに異なる結果セットが取得される可能性があります。いずれかの種類の問合せ(問合せアセット、SELECTTO
文、EXECSQL
など)を使用する場合は、RENDER.UNKNOWNDEPS
タグを使用する必要があります。
設計上の要件として、コード側で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はキャッシュを自動的に更新しません。)
テンプレートのエレメントをコーディングするには、そのテンプレートによって形式設定されるアセット・タイプの設計を理解する必要があります。データ設計とサイト設計について事前に理解しておくことで、更新されたアセットを再表示するためにテンプレートを再コーディングする必要がなくなります。(そのために、この開発者ガイドではデータ設計とサイト設計の両方を扱っています。)
この項の内容は、次のとおりです。
ベーシック・アセット・タイプのテンプレートをコーディングする際に留意すべき情報を提供します。
様々な状況のコード部分とコード例を紹介します。これには、静的サイトについて承認を正しく計算できるように、および動的サイトについて適切なタイミングでページ・キャッシュをクリアできるように、アセット間の依存性を管理することが含まれます。
開始する前に、このガイドのプログラミングの基本に関する部分の各章、特に「タグ・テクノロジを使用したWebサイト開発」を必ず読んでください。
この章のコード例で使用されているタグについては、Oracle WebCenter Sitesタグ・リファレンスを参照してください。
ベーシック・アセットを表示する他のコード例については、「ベーシック・アセットのテンプレート・エレメント例」を参照してください。
この項には次のトピックが含まれます:
コンテンツ・アセットのテンプレート・エレメントは通常、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
タグを使用して、それらのリンクが正しくレンダリングされるようにします。
アソシエーション・フィールドを通じて他のアセットと関連付けられているアセットを特定するには、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
パラメータで指定され、このimagefile
はARGS_cid
パラメータで指定されます。TeaserSummary
テンプレートは、このimagefile
をページレット内にレンダリングして、そのページレットをこのページに渡して戻し、このページ上でこれが記事とともに表示されます。
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の作成」を参照してください。
記事アセットおよび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
タグは、埋込みリンクが含まれたフィールドのコンテンツを取得したときに、埋込みリンクを適切に管理します。
コレクション・アセットのテンプレートは通常、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"/>
この項には次のトピックが含まれます:
ディスクへのエクスポートのパブリッシュ方法を使用している場合は、コレクション・テンプレート内で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>
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
タグを挿入してください。そうすることで、これらのアセットとレンダリングされたページの間の構成依存性を正しく追跡できます。
別の例については、「コレクション・アセット内の記事アセットへのリンクのコーディング」を参照してください。
問合せアセットは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
文、CALLSQL
、EXECSQL
)を使用している場合は、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/>
別の例については、「問合せアセットのテンプレートのコーディング」を参照してください。
ページ・アセットのテンプレートには通常、次のタイプのコードが含まれています。
そのページ・アセットのフレームワーク(そのページ・アセットがレンダリング対象ページである場合)
レンダリング対象ページのコンテンツを取得するためのロジック
他のレンダリング対象ページへのリンクのロジック
コンテンツ・アセットのテンプレートには、個別のコンテンツの形式設定コードが含まれています。ページ・テンプレートは、他のアセットのテンプレートを呼び出して、形式設定されたアセットをこれらのテンプレート・エレメントから受け取ってから、これらの形式設定されたアセットをページ・フレームワークのコンテキスト内に配置します。
次に、ページ・アセットを形式設定するためのシンプルなテンプレートのコードを示します。
<?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
問合せによって返される各記事のサマリー・テキストを表示するページレットを作成して、そのページレットをこのページに渡して戻し、そのページレットがこのページ上で表示されます。
ベーシック・アセットのテンプレートをコーディングする際は、WebCenter SitesのASSET
タグ・ファミリを使用します。たとえば、ベーシック・アセットを抽出して表示するには、ASSET.LOAD
タグを使用します。このタグは、そのアセット・タイプのプライマリ記憶域表からデータを抽出します。
フレックス・アセットのデータベース・スキーマはベーシック・アセットのデータベース・スキーマと異なるため、WebCenter Sitesでは、ASSET
タグ群のかわりに使用する次のフレックス・アセット用タグ・ファミリが用意されています。
ASSETSET
: このタグ・ファミリを使用して、1つ以上のフレックス・アセットのセットを指定します。
SEARCHSTATE
: このタグ・ファミリを使用して、アセットセット内のアセットをフィルタリングする検索絞込み条件を作成します。
注意:
ASSET.LOAD
タグは、フレックス・アセットを自動的にロードします。ただし、ASSET.LOAD
タグをフレックス・アセットに対して使用することはサポートされていません。そのコードをアップグレードできず、アセットをこの方法で抽出すると、ASSETSET
タグ・ファミリを使用する場合よりはるかに時間がかかるからです。
フレックス・アセット・モデルを使用してコンテンツを表す場合は、オンライン・サイトでは、フレックス・アセットとベーシック・アセットを組み合せて使用します。ページ・アセット・タイプ(使用される可能性が高い)はベーシック・アセット・タイプであるからです。
この項には次のトピックが含まれます:
アセットセットは、1つ以上のフレックス・アセットまたはフレックス親アセットのグループです。各種のASSETSET
タグを使用して、アセットのセットを作成したり、表示する属性値を抽出したりします。
アセットセットから取得できる情報は次のとおりです。
アセットセット内の各フレックス・アセットの1つの属性の値
アセットセット内の各フレックス・アセットの複数の属性の値
アセットセット内のフレックス・アセットのリスト
アセットセット内のフレックス・アセットの数
アセットセット内のすべてのフレックス・アセットの1つの属性の一意の属性値のリスト
アセットセット内のすべてのフレックス・アセットの属性の一意の属性値の数
複数のタイプのフレックス・アセットが含まれたアセットセットを作成できますが、そのためには、それらのフレックス・アセットが同じフレックス属性アセット・タイプを使用している必要があります。
使用頻度の高いASSETSET
タグは次のとおりです。
ASSETSET.SETASSET ASSETSET.SETSEARCHEDASSETS ASSETSET.GETMULTIPLEVALUES ASSETSET.GETATTRIBUTEVALUES ASSETSET.GETASSETLIST ASSETSET.SORTLISTENTRY ...
すべてのASSETSET
タグはOracle WebCenter Sitesタグ・リファレンスで説明されており、これらのうちいくつかはこの章のコード例で使用しています。構成依存性とASSETSETタグの詳細は、「ASSETSET (assetset)タグ・ファミリ」を参照してください。
検索状態オブジェクトを使用すると、表示するフレックス・アセットの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 WebCenter Sitesタグ・リファレンスで説明されており、これらのうちいくつかはこの章のコード例で使用しています。
検索状態は属性値に基づいて特定のアセットをフィルタリングし、アセットセットはデータベース内のアセットに検索状態を適用することで作成されるため、同じ属性アセット・タイプを共有しているフレックス・アセット・タイプのみを同じアセットセット内に含めることができます。
たとえば、フレックス記事アセット・タイプやフレックス・イメージ・アセット・タイプなどの2つのフレックス・アセット・タイプによって共有されるコンテンツ属性がサイトに含まれる場合、フレックス記事とフレックス・イメージの両方が含まれるアセットセットを作成できます。ただし、コンテンツ属性のかわりに製品属性を使用する製品アセット・タイプもこのサイトに含まれる場合、フレックス記事と製品アセットの両方が含まれるアセットセット、またはフレックス・イメージと製品アセットの両方が含まれるアセットセットを作成することはできません。
アセットセットと検索状態のスコープはローカルです。つまり、アセットセットと検索状態は現在のエレメント(レンダリング対象ページ)に対してのみ存在します。
既存の検索状態を維持するには、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/>
フレックス・アセット・モデルを使用するオンライン・サイトのテンプレートをコーディングする際は、開発者の主な関心対象はフレックス属性の値です(フレックス属性自体がアセットです)。
フレックス・アセット(製品など)やフレックス親アセットは、そのアセットを表示するコンテキストで考慮される場合は、実際には属性値を抽象化したものです。
検索状態を使用して、表示するフレックス・アセットのIDを取得して、考慮対象のアセットをそれらの属性値に基づいてフィルタリングします。その結果として、属性値に基づいたフレックス・アセットやフレックス親アセットのアセットセットが得られ、その後、このアセットセット内のアセットの属性値を表示できます。
フレックス・アセットのテンプレート・エレメントのコーディングを開始する前に、使用しているフレックス・ファミリのデータ・モデルを必ず理解してください。詳細は、「アセット・モデルの理解」および「フレックス・アセット・タイプの設計」を参照してください。
この項には次のトピックが含まれます:
この項のコード例は、小規模なデータ・セット例(これらの例の製品フレックス・ファミリ)とやり取りする簡単なアセットセットおよび検索状態から始まります。これらの例で使用する製品ファミリ・セットは、次のとおりです。
フレックス・アセット・タイプ | 外部名(WebCenter Sitesインタフェースに表示されます) | 内部名(WebCenter Sitesデータベースで使用されます)* |
---|---|---|
フレックス属性 |
製品属性 |
|
フレックス・アセット |
製品 |
|
フレックス親 |
製品親 |
|
|
該当なし |
該当なし |
このデータ・セット内のサンプル製品は、次の属性を持つブルー・ジーンズです。
属性 | データ型 | 値の数 |
---|---|---|
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 |
この項のコード・サンプルでは次を実行します。
sku
番号で指定された1着のジーンズが含まれたアセットセットを作成します。
製品アセットとレンダリング対象ページ(またはページレット)の間の依存性をログに記録します。
price
属性の値を取得して表示します。
color
属性の値を取得して表示します。
同じタグ(ASSETSET.GETMULTIPLEVALUES
)を使用して、price
属性とcolor
属性の両方の値を取得して表示します。
この項には次のトピックが含まれます:
次のコード行は、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
タグによって、この製品アセットの構成依存性がログに記録されるようになります。
次に、このジーンズの価格を抽出します。
<ASSETSET.GETATTRIBUTEVALUES NAME="as" ATTRIBUTE="price" TYPENAME="PAttributes" LISTVARNAME="pricelist"/>
price
は単一値属性(つまり、この製品の価格は1つのみ)ですが、ASSETSET.GETATTRIBUTEVALUES
タグは、price
属性の値をリスト変数(LISTVARNAME=pricelist
)として返します。
次のコード行は、jeans-2
製品の価格を表示できます。
Price: <ics.listget listname=pricelist fieldname=value/> And this is the result: Price: 30
次に、このジーンズで用意されている色を確認します。
前述のとおり、color
属性は複数値属性です。ASSETSET.GETATTRIBUTEVALUES
タグは、属性が単一値属性なのか複数値属性なのかにかかわらず同じように機能するため、ここでも、price
という単一値属性で使用したのとまったく同じ方法でこのタグを使用します。
<ASSETSET.GETATTRIBUTEVALUES NAME="as" ATTRIBUTE="color" TYPENAME="PAttributes" LISTVARNAME="colorlist"/>
次のコードは、jeans-2
製品の色を表示できます。この製品には複数の色が用意されているため、このコードはリストをループ処理します。
Colors: <LOOP LIST="colorlist"> <ics.listget listname=colorlist fieldname=value/> </LOOP>
結果は次のようになります。
Colors: black blue
一般に、複数の属性の値を取得するためには、ASSETSET.GETATTRIBUTEVALUES
タグを使用しないでください。
ASSETSET.GETMULTIPLEVALUES
タグは、アセットセット内のすべてのアセットについて、複数の属性の値を取得して分散します。このタグは、すべての属性値を対象にして1度のみデータベースをコールするため、複数のASSETSET.GETATTRIBUTEVALUES
タグを使用する場合よりも効率的に問合せを実行できます。
ただし、このタグを使用する前に、LISTOBJECT
タグを使用して、ASSETSET.GETMULTIPLEVALUES
タグによって返される属性を表すリスト・オブジェクトを作成する必要があります。このリスト・オブジェクトは、取得する属性ごとに1つの行を必要とします。
次のコード行は、attributetypename
、attributename
およびdirection
という列がある、lo
という名前のリスト・オブジェクトを作成します。
<LISTOBJECT.CREATE NAME="lo" COLUMNS="attributetypename,attributename,direction"/>
次のコード行は、color
とprice
という各属性の行を、このリスト・オブジェクトに追加します。
<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"/>
次に、as
という名前の元のアセットセットからprice属性とcolor属性の両方の値を取得します。
<ASSETSET.GETMULTIPLEVALUES NAME="as" PREFIX="multi" LIST="lolist" BYASSET="false"/>
これらの値はリスト変数(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/> </LOOP><P/> </LOOP>
このコードは、lolist
変数内のすべての属性をループ処理するネストされたループを構成してから、lolist
リスト変数内の各属性のすべての個別属性値をループ処理します。
結果は次のようになります。
color is blue black price is 30
text
型またはblob
型のフレックス属性に保持されている値を表示するには、この項で説明している方法を使用します。
この項には次のトピックが含まれます:
ASSETSET.GETMULTIPLEVALUES
タグは、text
型の属性の値を取得しません。したがって、この型の属性を対象にした別個のASSETSET.GETATTRIBUTEVALUES
タグを挿入する必要があります。
たとえば、これらの例で使用しているサンプル・データ・セット内のcolor属性が、string
型ではなくtext
型の属性であった場合は、これまでの例でASSETSET.GETMULTIPLEVALUES
タグを使用してこの属性の値を取得できなかったはずです。
「アセット・モデルの理解」で説明したように、フレックス・アセット・タイプの_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の実際の値を抽出できます。
フレックス属性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 thejeans-2
asset'sdescription
attribute (that attribute of typeblob
) and stores it in a list variable called descFile <ASSETSET.GETATTRIBUTEVALUES NAME="as" TYPENAME="PAttributes" ATTRIBUTE="description" LISTVARNAME="descFile"/>
次のコード行は、BLOBSERVICE
タグを使用して、BLOB属性の属性値が格納されているWebCenter Sites表から表名と列名を取得し、それらをuTabname
、idColumn
およびuColumn
という名前の変数に格納します。
<BLOBSERVICE.GETTABLENAME VARNAME="uTabname"/> <BLOBSERVICE.GETIDCOLUMN VARNAME="idColumn"/> <BLOBSERVICE.GETURLCOLUMN VARNAME="uColumn"/>
次に、descFile
というリスト変数と、uTabname
、idColumn
および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を返します。
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/>
この項のコード・サンプルでは次を実行します。
この章で使用しているサンプル・データ・セット内のすべての製品(ジーンズ)が含まれたアセットセットを作成します。
このアセットセット内のジーンズの数を取得して表示します。
このアセットセット内のすべてのジーンズのcolor
属性のすべての値を取得して表示します。
このアセットセット内のジーンズのcolor
属性とstyle
属性のすべての値を取得して表示します。
このアセットセット内のジーンズのすべての属性値を取得して表内に表示します。
このアセットセットから特定の価格範囲に属するジーンズを抽出する検索絞込み条件を追加します。
price属性に基づいたこの範囲制約を、bという文字で始まる色が用意されているジーンズをこのアセットセットから抽出する検索絞込み条件に置き換えます。
この色制約を、blueまたはblackのどちらかが用意されているジーンズをこのアセットセットから抽出する絞込み条件に置き換えます。
この項には次のトピックが含まれます:
次のコード行は、ss
という名前のフィルタリングされない検索状態を作成します。
<SEARCHSTATE.CREATE NAME="ss"/>
フィルタリングされない検索状態をアセットセットに適用すると、指定されたタイプ(この例では製品アセット)のすべてのフレックス・アセットが取得されます。
<ASSETSET.SETSEARCHEDASSETS NAME="as" CONSTRAINT="ss" ASSETTYPES="Products"/>
次のコード行は、アセットセット内のアセットの数を返して表示します(この時点ではこの数はサンプル・カタログ全体を表します)。
<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
次のコード行は、ジーンズの各種の色を取得して表示します。つまり、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
次に、このアセットセット内のジーンズの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
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"/> </LOOP> </THEN></IF> </TD> </TR> </LOOP> </TABLE>
結果は次のようになります。
表20-1 すべてのジーンズとそれらの属性値を表示する表
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ここまでは、この項の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
ここで、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
最後に、この色制約を、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
動的サイトか静的サイトかにかかわらず、WebCenter Sitesシステムを使用しているということは、コンテンツが定期的に変化するということです。このため、URLをハイパーリンク内にハードコード化できません。ページは、ディスクへのエクスポートのパブリッシュ方法によってまたは動的サイト上の訪問者のブラウザによってレンダリングされる際に、そのページでリンクを提供している、対象のアセットのIDを特定できる必要があります。
WebCenter Sitesでは、URLを作成するために使用できる次の3つのタグが用意されています(それぞれのタグにはXMLバージョンとJSPバージョンがあります)。
BLOBではないアセットのURLについては、RENDER.GETPAGEURL
タグを使用します。
BLOBであるアセットのURLについては、RENDER.SATELLITEBLOB
タグまたはRENDER.GETBLOBURL
タグを使用します。
この項には次のトピックが含まれます:
標準アセット(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 WebCenter Sitesタグ・リファレンスを参照してください。
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 WebCenter Sitesタグ・リファレンスを参照してください。
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型のフレックス属性について」を参照してください。
RENDER.GETBLOBURL
タグの詳細は、Oracle WebCenter Sitesタグ・リファレンスを参照してください。
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 WebCenter Sitesタグ・リファレンスを参照してください。
エレメントをコーディングする際に、エラー状態の有無をチェックするコードも含める必要があります。どのエラー状態が重大であるのかを決定して、必要に応じて、解決策や代替アクションをコーディングしてください。場合によっては、わかりやすいエラー・メッセージを記述することが解決策になります。追加のステップとして、壊れたページがキャッシュされることを防止するコードを含めることができます。
注意:
コードをデバッグする際は、commons-logging.properties
ファイルとloggingconfig.xml
ファイルを使用してログ出力を有効にできます。これにより、エラー・メッセージとデバッグ・メッセージはWebCenter Sitesのログ・ファイルに書き込まれます。デバッグ・プロパティの詳細は、『Oracle WebCenter Sitesプロパティ・ファイル・リファレンス』を参照してください。
この項には次のトピックが含まれます:
標準のWebCenter Sites変数であるerrno
変数には、WebCenter SitesのXMLタグやJSPタグによって報告されるエラー番号が格納されます。WebCenter Sitesのタグを正常に実行できない場合は、そのタグによって、その理由を最も適切に示す値にerrnoが設定されます。たとえば、-13004というerrno値は、CURRENCY
タグが読み取ろうとした数値が正しい通貨形式でなかったために、その数値を読み取ることができなかったことを示します。すべてのerrno値のリストとそれらの説明については、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>
エレメントの出力が間違っていると判断できる場合は、おそらく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
のアセットを、作成するアセットセット内に含めません。