この章では、Listガジェットを例にして、テンプレート実行フローについて説明します。
設計上、ガジェットのディスクリプタXMLをリクエストする唯一の方法は、FW_CSGadget
アセットのGenerateGadgetXML
テンプレートを起動することです。このテンプレートを起動すると、図92-1とその説明で示されているように、レンダリング・プロセスが開始します。
GenerateGadgetXML
は、最初にXML宣言を出力します。これは、すべてのXMLドキュメントで推奨される機能です。プロセスの最初にXML宣言を出力することによって、ガジェット開発者は、記述するすべてのガジェットでこのことを考慮せずに済むようになります。
次に、GenerateGadgetXMLは、渡されたc (FW_CSGadget
)およびcid (ListGadget
のid)に対応するアセットをロードし、descriptortemplateの値を検索します。
注意: cとcidの組合せは、WebCenter Sitesシステム内の特定のアセットをポイントします。パラメータcはアセットのタイプであり、cidはアセットの識別子です。この情報は、テンプレートの起動時に毎回必要になります。 |
GenerateGadgetXML
は、descriptortemplateフィールドのテンプレートを起動し(Listガジェットの場合はFW_CSTemplate/G_List
)、手順0と同じc
およびcid
を渡します。
G_List
テンプレート自体は、外部からコールできないこと(SiteCatalogエントリのpageletonly
フィールドがT
に設定されている)に注意してください。この設定では、(たとえば、コールされるように設計されていない場合、)テンプレートの直接的なコールが禁止されます。
コールされたテンプレートG_List
は、ガジェット・ディスクリプタXMLの本体すべてを出力します。この時点で、ガジェット・ディスクリプタXMLは完全なものになります。
ディスクリプタXMLに基づいてガジェットがレンダリングされたら、ガジェットはそのコンテンツを取得します。図92-2は、Listガジェットがコンテンツを取得する様子を示しています。このプロセスはガジェットごとに異なります。Listガジェットは、G_Listテンプレートが出力する次のJavaScriptによって、WebCenter Sitesから記事を取得します(コードのこの行は、Google Gadgets APIをコールします)。
gadgets.io.makeRequest(url, handleJson, params);
G_List
テンプレートは、このガジェットのDataAsset
(この場合は、Recommendation)をポイントする追加のWebCenter Sites URLを作成します。これは、そのアセット・タイプ用のG_JSON
テンプレートを通じて行われます。このURLは、最終的にgadgets.io.makeRequest
関数に渡されます。この関数を使用して、XML、JSON、Atom/RSSなどの各種の形式のデータに対応する追加のリモート・サーバー・コールを行うことができます。このリクエストによって、コンテンツ取得プロセスが開始されます。
XML本体内のガジェット・コードがAdvCols/G_JSON
テンプレートを起動し、JSONレスポンスの開始を準備します。Recommendationsには他のアセットのリストが含まれているため、このテンプレートは単にJSON配列の出力を開始してから、アセットのリストをループ処理し、各アセットでそれぞれのG_JSON
テンプレートをコールします。
Listガジェットの場合、すべての子はコンテンツ・アセットであるため、Recommendation内のアセットごとにContent_C/G_JSON
が起動されます。Content_C/G_JSON
テンプレートは、起動されるたびに完全なJSONオブジェクト表現を出力します。このJSONオブジェクト表現には、そのアセットの該当するフィールドが含まれます。
Content_C/G_JSON
の各コールの間に、AdvCols/G_JSON
は、構築する配列内のオブジェクトを正しく区切るためにコンマを出力します。ループが完了すると、AdvCols/G_JSON
テンプレートは配列を閉じます。
この配列は、ガジェット・コード(gadgets.io.makeRequest(url, handleJson, params);
)によって受け取られます。このガジェット・コードは、元のmakeRequest
コールの指示に従って、handleJson
コールバック関数を実行します。handleJson
関数は、コンテンツをHTMLでラップします。このHTMLは、そのガジェットのビュー(この例ではリスト・ビュー)をレンダリングします。
前の項では、Listガジェットのテンプレート・フローについて説明しました。他のサンプル・ガジェットのテンプレート・フローもよく似ていますが、WebCenter Sitesのテンプレート・ロジックの違いは注目に値します。
WebCenter Sitesでのガジェットのレンダリング手順は、Listガジェットのものに酷似しています。主な違いは、AdvCols/G_JSON
テンプレートによって何が起動されるかです。ListガジェットはContentアセットが格納されたRecommendationを参照しますが、ThumbListガジェットとSlideshowガジェットは、Productアセットが格納されたRecommendationを参照します。また、これらのガジェットではProduct_C/G_JSON
テンプレートのレスポンス固有の属性を調査します(これには、Media_C/G_JSON
テンプレートによって生成されるデータも含まれます)。
追加のサーバー・コールがなぜ行われるのか、疑問に思うかもしれません。たとえば、Listガジェットのすべての記事をG_List
テンプレート自体から取得しないのはなぜでしょうか。その答えは2つあります。
ガジェット・ディスクリプタXMLをガジェット・コンテナでキャッシュ可能にしている可能性があります。これは、XML内に一時的なデータを埋め込まないようにする必要があることを意味します。
追加のサーバー・コールは、プレゼンテーション・ロジック(たとえば、G_List
内)を、下層のモデル(アセット・タイプのG_JSON
テンプレート内)から分離するのに役立ちます。