この章では、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テンプレート内)から分離するのに役立ちます。