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

前
次

56 プロキシ・アセットを使用したサードパーティ・コンテンツ・ソースの統合

コンテンツ・チームおよびマーケティング・チームは、頻繁に、WebCenter Sitesで開発したWebサイトの外部にあるコンテンツをパブリッシュする必要があります。プロキシ・アセット・タイプ・フレームワークを使用して、彼らが外部Webコンテンツを統合できるようにすることができます。

トピック:

56.1 プロキシ・アセットのアーキテクチャおよびContributorインタフェース

プロキシ・アセットのアーキテクチャで、サードパーティのコンテンツ・リポジトリを編集用インスタンスと配信インスタンスからアクセスできるようにし、Contributorインタフェースをカスタマイズしてこのリポジトリにアクセスするようにします。

プロキシ・アセットのアーキテクチャ

プロキシ・アセットとは、リモートの場所に保管され、その場所で管理されているコンテンツを表します。この図は、プロキシ・アセットのアーキテクチャを示しています。

図56-1 プロキシ・アセットのアーキテクチャ

図56-1の説明が続きます
「図56-1 プロキシ・アセットのアーキテクチャ」の説明

このアーキテクチャの内容は、次のとおりです。

  • サード・パーティのコンテンツ・リポジトリは、パブリックの読取りAPIを通じて、編集用インスタンスと配信インスタンスの両方からアクセスできると想定されています。

  • Contributorインタフェースは、外部コンテンツをUIに表示するために、サード・パーティ・リポジトリにアクセスするようにカスタマイズされています。

  • プロキシ・アセットは、UIにレンダリングされる外部コンテンツごとに実行時に作成されます。プロキシ・アセットには、メタデータは格納されません。このメタデータは、サード・パーティのサービスが提供するパブリックの読取りAPIを通じてアクセスできると想定されています。

  • ライブ・インスタンスでは、プロキシ・アセット用に作成されたテンプレートで同一のリポジトリとAPIにアクセスして、ライブ・サイトに外部コンテンツをレンダリングします。

注意:

プロキシ・アセットは、使用されるもののみがWebCenter Sitesデータベースに永久的に格納されます。たとえば、検索結果のレンダリング中に作成されるプロキシ・アセットは、その後、専用のクリーニング・イベントで消去されます。

Contributorインタフェース

WebCenter Sitesデータベースに新しいプロキシ・アセット・タイプを登録した後で、開発者は、適切なUIカスタマイズを提供して、コントリビュータが外部コンテンツとの対話を始められるようにする必要があります。

実装するUIカスタマイズの特性は、コントリビュータに固有の要件に応じて異なります。たとえば、Contributorインタフェースの検索機能は、多くの場合、外部リポジトリに固有の検索サービスにフックされることになります。

これが行われていて、外部コンテンツがプロキシ・アセットの形式でContributorインタフェースに表示されていると、それらのアセットは標準アセットとほとんど同じように機能します。つまり、コントリビュータは、次の操作を実行できるようになります。

  • 外部コンテンツ・リポジトリの検索(同じアセット検索タブを使用し、結果をドッキングまたはドッキング解除されたリスト表示またはサムネイル表示に示します)

  • 検索またはツリーからのドラッグ・アンド・ドロップの使用。

  • 外部コンテンツの別のアセットへの関連付け(フォーム・ビューまたはWebビュー)

  • 外部コンテンツのプレビュー(WebCenter Sitesのテンプレートを使用)。

  • ブックマーク、タグのワークフローでの設定、承認およびパブリッシュ。

注意:

次の制限があります。

  • 外部コンテンツのライフサイクルは、サード・パーティのUIで全体的に管理することを想定しています。つまり、WebCenter Sitesには、外部リポジトリへの読取りアクセスのみが必要になります。そのため、編集やバージョニングなどのUIアクションは、すべてのプロキシ・アセットタイプに対してデフォルトで無効化されています。

  • プロキシ・アセットには、関連アセットまたはサブタイプを含めることができません。

  • 外部コンテンツ・リポジトリは、コントリビューションと配信の両方のWebCenter Sitesインスタンスからアクセスできるようにする必要があります。

56.2 サンプル・プロキシ・アセットのインストール

Oracle WebCenter Sitesにプロキシ・アセットをインストールするには、プロキシ・アセット・ディレクトリの設定およびプロキシ・アセットの作成から始めます。

56.2.1 プロキシ・アセット・ディレクトリの設定

プロキシ・アセット・ディレクトリを設定するには:
  1. Oracle WebCenter Sitesインストールで、sites-home\bootstrap\samples\miscellaneous\SampleProxy\proxy_sampleに移動します。後続の手順では、このディレクトリを${WCS_PROXY}と呼びます。
  2. サーバーのWebアプリケーションのルートの下にproxy_samplesディレクトリをコピーします。たとえば、sites-webapp-server\webapps\sites\proxy_samplesのようになります。
    このディレクトリには、サード・パーティのAPIをシミュレートするためのサンプルのJSONおよびイメージが含まれています。
  3. proxy_samplesディレクトリをテストするには、サーバーを起動し、http://localhost:8080/sites/proxy_samples/search/ski.jsonに移動します。次に、ブラウザ内のファイルの1つをクリックし、JSONテキストを表示します。

56.2.2 プロキシ・アセットの作成

プロキシ・アセットを作成するには:
  1. WebCenter Sitesにログインし、Adminインタフェースを起動します。
  2. 「管理」「プロキシ・アセット・メーカー」の順に開き、「新規追加」をダブルクリックします。
  3. フォームで、プロキシ・アセットの「名前」 (ProxyTestなど)、「説明」および「複数形」 (ProxyTestsなど)の各フィールドに値を入力します。
  4. 「保存」をクリックします。
  5. サイト内のProxyTestアセットを有効にします。これを行うには、ProxyTest「検索」スタート・メニューを作成します。
    ContributorではまだProxyTestの「Search」スタート・メニューにはアクセスできません。

56.2.3 プロキシ・アセットへの検索機能の追加

検索機能を追加するには:
  1. Sites Explorerを開き、WebCenter Sitesインスタンスにログインします。
  2. Sites Explorerで、Tables/ElementCatalog/CustomElementsの下で、次のディレクトリ構造ProxyTest/UI/Data/Searchを作成します。
    Sites Explorerのディレクトリ構造Tables/ElementCatalog/CustomElementsを示します。
  3. ProxyTest/UI/Data/Searchの下で、2つの新しい行を追加します。
  4. ${WCS_PROXY}\src\jsp\cs_deployed\CustomElements\ProxyTest\UI\Data\Search内の対応するファイルからコンテンツをコピーして貼り付けます。
    • SearchAction
      • elementname: SearchAction

      • url: CustomElements\ProxyTest\UI\Data\Search\SearchAction.jsp

    • SearchJson

      • elementname: SearchJson

      • url: CustomElements\ProxyTest\UI\Data\Search\SearchJson.jsp

  5. Sites Explorerで、ElementCatalogの下に、ProxyTest: Tables\ElementCatalog\ProxyTestを追加します。
  6. Tables\ElementCatalog\ProxyTestの下で、${WCS_PROXY}\src\jsp\cs_deployed\ProxyTest\GetData.jsp : GetData (elementname: GetData, url: ProxyTest/GetData.jsp)からコンテンツをコピーして貼り付けて新しいエントリを作成し、これらの変更を保存します。
  7. Contributorインタフェースで、ProxyTestの「Search」フィールドに、「ski」または「surfing」を入力するか、何も入力しません。
    プロキシ・アセットが移入されたリストが表示されます。

56.2.4 プロキシ・アセットへのサムネイル・グリッド機能の追加

サムネイル・グリッド機能を追加するには:
  1. Sites Explorerで、Tables\ElementCatalog\CustomElements\ProxyTest\UIの下で、次のフォルダ構造\Layout\CenterPane\Search\Viewを作成します。
  2. ${WCS_PROXY}\src\jsp\cs_deployed\CustomElements\ProxyTest\UI\Layout\CenterPane\Search\View内の対応するファイルからコンテンツをコピーして貼り付けて次のエントリを追加します。
    • ThumbnailViewConfig:
      • elementname: ThumbnailViewConfig

      • url: CustomElements\ProxyTest\UI\Layout\CenterPane\Search\View\ThumbnailViewConfig.jsp

    • DockedThumbnailViewConfig:

      • elementname: DockedThumbnailViewConfig

      • url: CustomElements\ProxyTest\UI\Layout\CenterPane\Search\View\DockedThumbnailViewConfig.jsp

  3. Contributorインタフェースで、ProxyTestアセットの有効な検索条件を入力します。
    グリッド・モードでサムネイル・イメージが表示されます。

56.2.5 プロキシ・アセットへのツリー機能の追加

ツリー機能を追加するには:
  1. Sites Explorerで、Tables\ElementCatalog\ProxyTestの下で、Treeという名前のディレクトリを作成します。
  2. ${WCS_PROXY}\src\jsp\cs_deployed\ProxyTest\Tree内の対応するファイルからコンテンツをコピーして貼り付けて次のエントリを追加します。
    • Load

      • elementname: Load

      • url: ProxyTest\Tree\Load.jsp

    • Root

      • elementname: Root

      • url: ProxyTest\Tree\Root.jsp

  3. Adminインタフェースに切り替えます。
  4. ツリー・タブを追加します。
    1. 「管理」ノードを開きます。
    2. ツリーで「ツリー」をダブルクリックします。
      「ツリー・タブ」ページが表示されます。
    3. 「新規ツリー・タブの追加」をクリックします。
    4. 次を入力します。
      • 「タイトル」フィールドに、ProxyTestTreeTabと入力します。

      • 「サイト」ボックスで、avisports (または使用している任意のサイト)を選択します。

      • 「必須ロール」ボックスで、「任意」を選択します。

      • 「タブ・コンテンツ」ボックスで、「ProxyTest」を選択し、「選択したアイテムの追加」をクリックします。

      • 選択したボックスで、「ProxyTest」をクリックします。

      • 「セクション名」フィールドに、ProxyTestと入力します。

      • 「エレメント名」フィールドに、ProxyTest/Tree/Rootと入力します(スラッシュのみを使用します)。

      • 「セクションの編集」をクリックし、「保存」をクリックします。

  5. Contributorインタフェースに切り替えます。
  6. 「コンテンツ・ツリー」で、「ProxyTestTreeTab」ツリー・タブを開きます。
    カテゴリskiおよびsurfingが各アセットとともにドラッグ・アンド・ドロップが可能になっていることがわかります。

56.3 Contributorインタフェースの外部コンテンツの統合

外部コンテンツ・リポジトリをリポジトリ検索サービスおよびコンテンツ・ツリーと統合した場合、コントリビュータは外部コンテンツを操作できます。

このトピックでは、事例を示すためにProxyTestコンテンツ・リポジトリを使用して、次の項目と統合するための手順について説明します。

  • 検索: 標準のWebCenter Sites検索のかわりに、リポジトリ検索サービスを使用します。

  • コンテンツ・ツリー: カスタム・コンテンツ・ツリーで、コントリビュータがリポジトリのコンテンツを参照できるようにします。

トピック:

56.3.1 事例: ProxyTestリポジトリ

この項では、サンプル・データの設定およびProxyTestリポジトリからのデータの取得について説明します。

サンプル・データの設定

WebCenter Sites Webアプリケーションに直接デプロイされている静的なJSONファイルのセットを使用して、ProxyTestコンテンツ・リポジトリをエミュレートします。ProxyTestのコンテンツは、メディア・コンテンツ(イメージ)であると想定します。

これらのJSONファイルでは、次のサービスをシミュレートします。

  • 特定の用語に対するリポジトリの検索(すべて、skiまたはsurfingについて検索すると、実際の結果が返されます): http://localhost:7001/sites/proxy_samples/search/<searchterm>.json

  • すべてのコンテンツ・カテゴリの取得(SkiおよびSurfing): http://localhost:7001/sites/proxy_samples/browse/categories.json

  • 特定のカテゴリに対するすべてのProxyTestコンテンツの取得: http://localhost:7001/sites/proxy_samples/browse/<category>.json

  • 特定のコンテンツIDに対するメタデータの取得: http://localhost:7001/sites/proxy_samples/content/<id>.json

たとえば、/proxy_samples/search/ski.jsonは、次のサンプル・コンテンツを返します。

{
  "items": [
    {
      "id": "1001", 
      "title": "Yellow Skier",
      "foo": "bar1",
      "lastModified": "1354735336444",
      "thumbnail": "proxy_samples/images/image7_thumbnail.png"
    },
    {
      "id": "1002", 
      "title": "Female Skier",
      "foo": "bar2",
      "lastModified": "1354735336444",
      "thumbnail": "proxy_samples/images/image8_thumbnail.png"
    },
    {
      "id": "1003",
      "title": "Ski Jump",
      "foo": "bar3",
      "lastModified": "1354735336444",
      "thumbnail": "proxy_samples/images/image9_thumbnail.png"
    }
  ]
}

注意:

サンプル・コードは、/misc/proxy_samples/フォルダ内に格納されています。このフォルダは、sites-home\bootstrap\proxy_samples\miscellaneous\SampleProxy内にあります。プロキシ・アセットに固有のサンプル・コードは、sites-home\bootstrap\samples\miscellaneous\SampleProxy\proxy_samples\内にあります。

ProxyTestリポジトリからのデータの取得

コードの重複を避けるために、外部コンテンツ・ソースの問合せに必要なロジックは、ProxyTest/GetDataという専用エレメントにカプセル化します。この例では、データはJSON形式で返されます。そのため、この例では、jersey (http://jersey.java.net/)とjettison (http://jettison.codehaus.org/)ライブラリを使用します。これらのライブラリは、受信JSONデータを取得してデシリアライズするために、WebCenter SitesのWebアプリケーションにデプロイされています。

このエレメントは、serviceURLというICS変数で問合せ(たとえば、/search/ski.json)を受け取り、ics.SetObj(String, Object)を使用してICSスコープ内に格納されたJSONArrayオブジェクトを返します。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
%><%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"
%><%@ page import="javax.ws.rs.client.*" 
%><%@ page import="javax.ws.rs.core.*" 
%><%@ page import="org.codehaus.jettison.json.*"
%><cs:ftcs>
<%
//
// get data from proxytest repository
// 
// 

Client client = ClientBuilder.newClient();
Response resp = null;
WebTarget res = null;


String host = request.getServerName();
String port = Integer.toString(request.getServerPort());
String contextPath = request.getContextPath();
String urlPath = "http://"+host+":"+port+"/"+contextPath+"/proxy_samples" + ics.GetVar("serviceURL");


try {
      res = client.target(urlPath);
      resp = res.request(MediaType.APPLICATION_JSON).get();
}
catch(Exception e) {
      e.printStackTrace();
      throw e;
}

JSONArray list = new JSONArray();

if (resp.getStatus() == 200) {
      String jsonString = resp.readEntity(String.class);
      JSONObject json = new JSONObject(jsonString);
      list = json.getJSONArray("items");
}

ics.SetObj("items", list);

%>

</cs:ftcs>

56.3.2 新しいプロキシ・アセット・タイプの登録

WebCenter SitesリポジトリでProxyTestのコンテンツを表すには、新しいプロキシ・アセット・タイプを定義します。

プロキシ・アセット・タイプを作成するには:

  1. 「管理」ノードで、プロキシ・アセット・マネージャを開き、「新規追加」をダブルクリックします。

    「新規プロキシ・アセット・タイプの追加」ページが開きます。

    図56-2 「新規プロキシ・アセット・タイプの追加」ページ

    図56-2の説明が続きます
    「図56-2 「新規プロキシ・アセット・タイプの追加」ページ」の説明
  2. 「名前」フィールドに、プロキシ・アセット・タイプの名前を入力します。同様に、「説明」フィールドに説明を入力して、「複数形」フィールドに名前の複数形を入力します。

    注意:

    Contributorインタフェースでは、プロキシ・アセットを作成または編集できません。そのため、この手順では、「検索」スタート・メニューのみを有効化する必要があります。

    この例では(さらに、このドキュメントの後続部分で使用するために)、「名前」フィールドにProxyTest「説明」フィールドにProxyTest「複数形」フィールドにProxyTestと入力します。

  3. 「保存」をクリックします。

注意:

プロキシ・アセット・メーカーは、新しいアセット・タイプを登録して、それと同じ名前で単一の表を作成します。プロキシ・アセット表は、標準アセット・メタデータのサブセットのみを保持し、唯一の固有列externalidを定義します。この列は、外部リポジトリに含まれる外部コンテンツの識別子を保管するためのものです。

56.3.3 UI統合コードの実装について

アセットは、Contributorインタフェースの様々な場所に表示されます。たとえば、次のような場所が該当します。

  • アセット・フォーム(アセット参照を含むフィールド)

  • 検索結果

  • コンテンツ・ツリー・パネル

それぞれの場合で、実際の統合コードは、要件と利用可能なカスタマイズ・フックに応じて様々に異なります。ただし、どの場合でも、「Contributorインタフェースに表示される外部コンテンツは、すべてプロキシ・アセットとして登録されている必要がある」という原則に従う必要があります。

実際には、外部コンテンツ・ソース内のコンテンツ識別子をexternalidで参照する、プロキシ・アセットを作成(または再使用)するということです。これは、通常のAsset APIのクラスとメソッドを使用することで実現できます。ただし、これを簡単にするために、プロキシJSPタグ・ライブラリが用意されています。

これには、次に示すユーティリティ・タグが含まれています。このタグは、特定の外部コンテンツをプロキシ・アセット・タイプとして登録するためのものです。

  • <proxy:register />

さらに、データ・グリッド・ウィジェット(検索など)のJSONデータストアを生成するためのユーティリティ・タグも含まれています。これらのタグは、次のとおりです。

  • <proxy:createstore />: 新しいストアを初期化します。

  • <proxy:addstoreitem />: アイテムを特定のストアに追加します。

  • <proxy:tojson />: ストアをJSONにシリアライズします。

Oracle Fusion Middleware Oracle WebCenter Sitesリファレンス・タグ・リファレンスおよび検索のカスタマイズのコード例を参照してください。

56.3.4 検索のカスタマイズ

「検索スタート・メニューのカスタマイズ」で説明したように、ProxyTestアセット・タイプのコントローラ・エレメントUI/Data/Search/Searchをオーバーライドするために、次のエレメントを作成します。

\sites-home\bootstrap\samples\miscellaneous\SampleProxy\proxy_sample\src\jsp\cs_deployed\CustomElements\ProxyTest\UI\Data\Search\SearchAction.jsp
\sites-home\bootstrap\samples\miscellaneous\SampleProxy\proxy_sample\src\jsp\cs_deployed\CustomElements\ProxyTest\UI\Data\Search\SearchAction.jsp\SearchJson

次の図に、検索ドロップダウンの「ProxyTest」オプションを示します。ProxyTest(つまり、作成したプロキシ・アセット・タイプの名前)を選択すると、Luceneベースの検索ではなく、カスタムの検索コードが実行されます。

図56-3 ProxyTestアセットを示す検索ドロップダウン

図56-3の説明が続きます
「図56-3 ProxyTestアセットを示す検索ドロップダウン」の説明

完全なカスタム検索を実装するために、このセクションの残りのトピックを完了してください。

このトピックの内容は次のとおりです。

56.3.4.1 提供済のサード・パーティAPIを使用した検索結果の取得

  1. CustomElements/ProxyTest/UI/Data/Search/SearchActionで、「事例: ProxyTestリポジトリ」に記載されているエレメントを使用して、JSONデータを取得します。

    取得では次のコード例を使用します。

    <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%>
    <%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%>
    <%@ taglib prefix="proxy" uri="futuretense_cs/proxy.tld"%>
    <%@ page import="org.codehaus.jettison.json.*"%>
    <%@ page import="COM.FutureTense.Interfaces.Utilities"%>
    <cs:ftcs>
    
    <%
    // in this ProxyTest example, only the empty search string, 'ski' or 'surfing' will 
    // return results String searchTerm = ics.GetVar("searchText");
    if (!Utilities.goodString(searchTerm)) searchTerm = "all";
    %>
    <ics:setvar name="serviceURL" value='<%="/search/" + searchTerm + ".json" %>' />
    <ics:callelement element="ProxyTest/GetData" />
    <%
    JSONArray list = (JSONArray)ics.GetObj("items");
    
    //
    // ...to be continued in the next section
    //
    %>
    
    </cs:ftcs>
    
  2. この時点で、listには、外部コンテンツ・ソースから取得したJSONデータが格納されています。

56.3.4.2 検索結果のプロキシ・アセットへの変換、受信検索結果のフィルタ処理、外部コンテンツの登録、および検索グリッド・ウィジェット用のデータ収集

この手順では、一連の段階を通じてコードを作成します。

  1. 新しいデータ・ストアを作成します。
    <proxy:createstore store="<storeName>" />
    

    この<storeName>は、データ・ストアを指定する任意の文字列です。

  2. その次に、受信外部コンテンツ・アセットごとに、現在のアセットをプロキシ・アセットとして登録します。
    <proxy:register
           externalid="<external_content_identifier>"
           type="<proxy_asset_type>"
           name="<proxy_asset_name>"
           varname="<variable_name>" />
    

    ここで:

    • <external_content_identifier>は、サード・パーティ・リポジトリに含まれる現在の外部コンテンツ・アイテムの識別子です。この例のProxyTestリポジトリの場合、この識別子は受信JSONデータのidフィールドで返されます。

    • <proxy_asset_type>は、プロキシ・アセット・タイプの名前です。この例では、ProxyTestです。

    • <proxy_asset_name>は、Contributorインタフェース全体で名前として使用される、判読可能な文字列です。この例では、受信JSONデータで返されるtitleです。

    • <variable_name>は、WebCenter Sitesの変数名です。この変数には、現在の外部コンテンツ・アイテムに対応するプロキシ・アセットのIDが格納されます。

  3. その次に、受信登録済プロキシ・アセットごとに、アセットをデータ・ストアに追加します。
    <proxy:addstoreitem 
           store="<storeName>"
           id="<proxy_asset_id>"
           type="<proxy_asset_type>" />
    

    ここで:

    • <storeName>は、<proxy:createstore />で定義したデータ・ストアです。

    • <id>は、プロキシ・アセットの識別子です。

    • <type>は、プロキシ・アセット・タイプです。

次に、ProxyTestプロキシ・アセット・タイプの完全なコードを示します。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%>
<%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%>
<%@ taglib prefix="proxy" uri="futuretense_cs/proxy.tld"%>
<%@ page import="org.codehaus.jettison.json.*"%>
<%@ page import="COM.FutureTense.Interfaces.Utilities"%>
<cs:ftcs>

<%
// in this ProxyTest example, only the empty search string, 'ski' or 'surfing' will
// return results
String searchTerm = ics.GetVar("searchText");
if (!Utilities.goodString(searchTerm)) searchTerm = "all";
%>
<ics:setvar name="serviceURL" value='<%="/search/" + searchTerm + ".json" %>' />
<ics:callelement element="ProxyTest/GetData" />
<%
JSONArray list = (JSONArray)ics.GetObj("items");
%>

<%-- create a new data store --%>
<proxy:createstore store="assets" />
<%
// go through each incoming item
for (int i = 0; i < list.length(); i++) {
     JSONObject item = (JSONObject)list.get(i);%>

     <%-- Register the current external content item as a proxy asset --%>
     <proxy:register externalid='<%=item.getString("id") %>'
     type="ProxyTest"
     name='<%=item.getString("title") %>'
     varname="internalid" />

<%-- Add the proxy asset to the datastore --%>
<proxy:addstoreitem store="assets"
                    id='<%=ics.GetVar("internalid") %>'
                    type="ProxyTest" />
<%
}
// put store name in request scope
request.setAttribute("store", "assets");
request.setAttribute("total", Integer.valueOf(list.length()));
%>
</cs:ftcs>

56.3.4.3 グリッド・ウィジェット用のデータ・ストアの作成

この手順では、UIウィジェットに送り返すJSONをレンダリングします。

CustomElements/ProxyTest/UI/Data/Search/SearchJson内で、次の例に示すように、proxy:tojsonユーティリティを使用してこの処理を実行します。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%>
<%@ taglib prefix="proxy" uri="futuretense_cs/proxy.tld"%>
<cs:ftcs>
<proxy:tojson store="${store}" total="${total}" />
</cs:ftcs>

56.3.4.4 カスタム検索のテスト

JSONのスクリプトを記述したら、検索機能が完全に動作することをテストします。検索をテストするには:

Contributorインタフェースで、検索ボックスから検索タイプとしてProxyTestを選択します。「検索」アイコンをクリックします。

「検索」タブが開き、関連データが表示されます。

次の図に、同じコンテンツをサムネイル表示で示します。

図56-5 サムネイル表示の検索結果

図56-5の説明が続きます
「図56-5 サムネイル表示の検索結果」の説明

「検索」タブは、ドッキング・モードでも機能します。次の図に、デフォルトのデータが入力されたツールチップを示します。

図56-6 ドッキングされたパネル内の検索結果

図56-6の説明が続きます
「図56-6 ドッキングされたパネル内の検索結果」の説明

56.3.4.5 追加のカスタマイズ

追加のカスタマイズを実装できます。ただし、これらを使用してカスタム検索を実装する必要はありません。

サムネイルのレンダリング

この例では、ProxyTestリポジトリは、各コンテンツ・アイテムのサムネイル・イメージへのURLを返します。サムネイルをレンダリングするために、ProxyTestリポジトリから送信されるサムネイルのURLを取得するように変更を加えます。これが行われるようにするには、サムネイル表示(ドッキングされている場合とドッキングされていない場合)のグリッドをカスタマイズする必要があります。つまり、次の構成エレメントをオーバーライドすることになります。

UI/Layout/CenterPane/Search/View/ThumbnailView
UI/Layout/CenterPane/Search/View/DockedThumbnailView

それぞれの構成ファイルは、次のように作成する必要があります。

CustomElements/ProxyTest/UI/Layout/CenterPane/Search/View/ThumbnailViewConfig
CustomElements/ProxyTest/UI/Layout/CenterPane/Search/View/DockedThumbnailViewConfig

ThumbnailViewConfig構成ファイルには、次のXML構成が含まれます。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld" %> 
<%@ taglib prefix="xlat" uri="futuretense_cs/xlat.tld" %>
<cs:ftcs>
  <thumbnailviewconfig>
    <formatter>fw.ui.GridFormatter.simpleThumbnailFormatter</formatter>
  </thumbnailviewconfig>
</cs:ftcs>

これにより、ProxyTestのサムネイル表示用のformatter設定をオーバーライドしていることがわかります(その他のグローバル構成エレメントの設定は維持されます)。このformatterは、サムネイル・イメージを表示する検索結果ごとのデフォルト・ビューと、名前フィールド(調査リンク)をレンダリングします。

同様に、ドッキングされたサムネイル表示の設定は、CustomElements/ProxyTest/UI/Layout/CenterPane/Search/View/に、次のXMLを含むDockedThumbnailViewConfigを作成することでオーバーライドする必要があります。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%> 
<%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%> 
<cs:ftcs>
<ics:callelement element=
"[CustomElements/ProxyTest/UI/Layout/CenterPane/Search/View/ThumbnailViewConfig]" />
</cs:ftcs>

注意:

「Contributorインタフェースの検索ビューのカスタマイズ」を参照してください。

エレメント名を囲む大カッコは、そこに指定されているエレメント名のカスタマイズ済バージョンを、ics:callelementタグで検索する必要がないことを示しています。

グリッド・コンテキスト・メニューの構成

アセット操作の一部は、プロキシ・アセットには適用されません。そのため、デフォルトのグリッド・コンテキスト・メニュー設定をオーバーライドする必要があります。エレメントUI/Config/GlobalHtmlをオーバーライドするために、新しいエレメントMyConfigUI/Configに作成します。MyConfigの作成方法の詳細は、「コンテキスト・メニューのカスタマイズ」を参照してください。

このようにすることで、グローバル設定はオーバーライドした設定にマージされないようになります。

フィールド別のプロキシ・アセットのソート

プロキシ・アセットのソートは、外部コンテンツ・ソースAPIによって行われます(WebCenter Sitesでは結果が内部でソートされません)。このため、すべてのフィールドのソートがサポートされる場合とされない場合があります。ユーザーは、「ソート」アイコンをクリックしてソート・オプションから選択することにより、プロキシ・アセットのソート検索を実行できます。

注意:

ProxyTestアセットの例はソートをサポートしていません。
この図は、フィールド別にソートされたプロキシ・アセットを示しています。

ソート・オプションは、CustomElements/ProxyTest/UI/Layout/CenterPane/Search/View/SearchTopBarConfigに設定されています。ソート・オプションに対しては次を定義する必要があります。

  • fieldname: リクエスト・オプションとともにSearchActionに渡されるsort変数の値。これは、ソート対象のフィールド(dateなど)を示す必要があります。

  • displayname: 「ソート」ドロップダウン・メニューに表示される文字列(View Count(Most-Least)など)。

  • sortorder:descendingまたはascendingdescendingの場合、fieldname値の前にマイナス記号(-)が追加されます。

YouTubeプロキシ・アセットの場合、次のコードが記述されます。

<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
%><%@ taglib prefix="xlat" uri="futuretense_cs/xlat.tld"
%><cs:ftcs>
    <!-- Here the field name is the index column on which the sort is performed.-->
    <sortconfig>
        <sortfields>          
            <sortfield id="title">
                <fieldname>title</fieldname>
                <displayname><xlat:stream key="UI/UC1/Layout/NameSort1" escape="true"/></displayname>
                <sortorder>ascending</sortorder>
            </sortfield>
            <sortfield id="updateddate_dsc">
                <fieldname>date</fieldname>
                <displayname><xlat:stream key="UI/UC1/Layout/ModifiedSort1" escape="true"/></displayname>
                <sortorder>descending</sortorder>        
            </sortfield>
            <sortfield id="viewCount">
                <fieldname>viewCount</fieldname>            
                <displayname><xlat:stream key="UI/UC1/Layout/ViewCountSort" escape="true"/></displayname>
                <sortorder>descending</sortorder>                
            </sortfield>
        </sortfields>
    </sortconfig>
</cs:ftcs>

ソート・フィールドが選択された後、新しいソート検索が開始され、SearchActionがコールされます。ソート・パラメータは、requestオブジェクト内にあります。これは、ソート基準のフィールドを提供します。たとえば、YouTubeプロキシ・アセットのSearchActionでは、ソート・パラメータは問合せパラメータ値として取得および使用されます。

...

String sort = request.getParameter("sort");
if(sort != null && StringUtils.isNotEmpty(sort)){
    // incase of descending sort, UI sends the field with a -ve sign, 
    // YouTube doesn't take as is, so remove the -ve sign if any
    sort.trim();
    if(sort.startsWith("-")){
         sort = sort.substring(1,sort.length());
    }
}else{
    sort = "relevance";
}

...

// build YouTube URL
String baseYtURL = "https://www.googleapis.com/youtube/v3/";
StringBuffer ytQuery = new StringBuffer(baseYtURL);
ytQuery.append("search?part=snippet");
ytQuery.append("&maxResults=" + maxResults); // number of results per page
ytQuery.append("&type=video"); //only return videos, no channels or playlists
ytQuery.append("&order=" + sort); // ordering
ytQuery.append("&key=" + apiKey); // add user's API public access key
ytQuery.append("&q=").append(URLEncoder.encode(searchTerm));

...

SearchTopBarConfigエレメントとContextMenuConfigエレメントは、どちらもエレメントのresdetails1 (またはresdetails2)フィールドにmerge=falseを設定しておく必要があります。

図56-7 構成ファイルのエレメントの詳細値フィールド

図56-7の説明が続きます
「図56-7 構成ファイルのエレメントの詳細値フィールド」の説明

56.3.5 カスタム・ツリーの実装

カスタム・ツリーは、ユーザーがカテゴリごとに外部コンテンツを参照することを許可するために有用です。

図56-8 カスタム・ツリー

図56-8の説明が続きます
「図56-8 カスタム・ツリー」の説明

ツリーをレンダリングするために、次の2つのエレメントを作成します。

  • ProxyTest/Tree/Root: ツリーのルート・ノードをレンダリングします。これらのノードは、コンテンツの各カテゴリになります。

  • ProxyTest/Tree/Load: 特定のカテゴリに属するコンテンツをすべてレンダリングします。

カスタム・ツリーを実装するには、最初にカスタム・ツリー・タブを登録してから、カスタム・ツリーのコードを実装する必要があります。

このトピックの内容は次のとおりです。

56.3.5.1 カスタム・ツリー・タブの登録

カスタム・ツリー・タブは、「新規ツリー・タブの追加」ページで定義します。この例で作成するタブでは、Proxy Assetsという新しいコンテンツ・ツリーを作成します。このツリーには、ProxyTest/Tree/Rootを参照する単一のカスタム・セクション(ProxyTest)を含めます。

この例のカスタム・ツリー・タブを登録するには:

  1. Adminインタフェースで、「管理」ノードを開き、「ツリー」をダブルクリックします。

    「ツリー・タブ」ページが開きます。

  2. 「ツリー・タブ」ページの下側にある、「新規ツリー・タブの追加」をクリックします。

    「新規ツリー・タブの追加」ページが開きます。

  3. 必要に応じて、各フィールドに入力します。この例では、次のようにフィールドに入力します。
    • タイトル: タブのタイトルとしてProxy Assetsを入力します。

    • サイト: リストから「プロキシ」を選択します。

    • 必須ロール: リストから「任意」を選択します。

    • タブ・コンテンツ: 「ProxyTest」を選択してから、「選択したアイテムの追加」をクリックして、その項目を「選択済」列に移動します。「選択済」列の項目は、「ProxyTest」のみにする必要があります。

    • セクション名: フィールドに、ProxyTestと入力します。

    • エレメント名: フィールドに、ProxyTest/Tree/Rootと入力します。

    図56-9 「新規ツリー・タブの追加」ページ

    図56-9の説明が続きます
    「図56-9 「新規ツリー・タブの追加」ページ」の説明
  4. 各フィールドに適切な値を入力したら、「保存」をクリックしてアセットを保存します。

56.3.5.2 ツリーのコードの実装

  1. ProxyTest/Tree/Rootでは、外部リポジトリを問い合せてツリーのルート・ノード(この例では、カテゴリのリスト)を取得します。
  2. 各カテゴリのツリー・ノードのデータを生成します。
    <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%> 
    <%@ taglib prefix="satellite" uri="futuretense_cs/satellite.tld"%>
    <%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%> 
    <%@ page import="org.codehaus.jettison.json.*"%>
    <cs:ftcs>
    
    <%-- Retrieve all categories from ProxyTest repository --%>
    <ics:setvar name="serviceURL" value="/browse/categories.json" />
    <ics:callelement element="ProxyTest/GetData" />
    
    <%
    JSONArray list = (JSONArray)ics.GetObj("items");
    for (int i = 0; i < list.length(); i++) {
         String category = (String)list.get(i);
         // 1) build a tree node id - needs to be unique
         // Note: we need to make sure that AssetType is not present in the scope
         // (BuildTreeNodeID is otherwise assuming the tree node to be an asset node)
         %>
         <ics:removevar name="AssetType" />
         <ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNodeID" >
              <ics:argument name="AdHoc" value='<%=category %>' />
         </ics:callelement>
         <%
         // 2) build the 'LoadURL' that is, the URL to call to load this node's children
         // OpenMarket/Gator/UIFramework/LoadTab is a standard element. 
         // Required input is:
         // - populate: the element rendering tree nodes to execute
         // - op: must be set to 'load'
         //
         // We're also passing 'category' which is required by our custom logic in 
         // ProxyTest/Tree/Load
         //
         %>
         <satellite:link assembler="query"
                           pagename="OpenMarket/Gator/UIFramework/LoadTab"
                           outstring="LoadURL">
         <satellite:argument name="populate" value="ProxyTest/Tree/Load"/>
         <satellite:argument name="op" value="load"/> 
         <satellite:argument name="category" value='<%=category %>' />
         </satellite:link>
    
         <ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNode">
              <ics:argument name="Label" value='<%=category %>' />
         </ics:callelement>
    <%}%>
    </cs:ftcs>
    

    この図は、このコードを使用して生成されたツリーを示しています。

    図56-10 生成されたカスタム・ツリー

    図56-10の説明が続きます
    「図56-10 生成されたカスタム・ツリー」の説明

    注意:

    OpenMarket/Gator/UIFramework/BuildTreeNodeIDエレメントとOpenMarket/Gator/UIFramework/BuildTreeNodeエレメントは、どちらもICSスコープ内の変数を利用します。<ics:callelement />タグはグローバル・スコープを持つため、<ics:removevar />を使用して、特定の変数をICSスコープから明示的に削除(永久的または一時的)することが必要になる場合があります。

  3. ProxyTest/Tree/Loadでは、外部サービスを問い合せて、特定のカテゴリに含まれるすべてのコンテンツを取得して、コンテンツ・アイテムごとにノードをレンダリングします。
    <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%> 
    <%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%> 
    <%@ taglib prefix="proxy" uri="futuretense_cs/proxy.tld"%> 
    <%@ page import="org.codehaus.jettison.json.*"%>
    <cs:ftcs>
    
    <%-- Retrieve all content for a given category --%>
    <ics:setvar name="serviceURL" value='<%="/browse/" + ics.GetVar("category") +
       ".json"%>' />
    <ics:callelement element="ProxyTest/GetData" />
    
    <%
    JSONArray list = (JSONArray)ics.GetObj("items");
    
    for (int i = 0; i < list.length(); i++) {
         JSONObject item = (JSONObject)list.get(i);%>
    
         <proxy:register externalid='<%=item.getString("id") %>'
                         type="ProxyTest"
                         name='<%=item.getString("title") %>'
                         varname="internalid" />
    
         <ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNodeID">
            <ics:argument name="AssetType" value="ProxyTest" />
            <ics:argument name="ID" value='<%=ics.GetVar("internalid") %>' />
         </ics:callelement>
    
         <ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNode">
            <ics:argument name="Label" value='<%=item.getString("title") %>' />
            <ics:argument name="Description" value='<%=item.getString("title") %>' />
            <ics:argument name="executeFunction" value="inspect" />
         </ics:callelement>
         <%
    }
    %>
    </cs:ftcs>
    

    その後、各カテゴリを参照できます。

    図56-11 カスタム・ツリーのオブジェクトの参照

    図56-11の説明が続きます
    「図56-11 カスタム・ツリーのオブジェクトの参照」の説明
  4. ノードをダブルクリックすると、そのノードについてのデフォルトのプロキシ・アセット調査ページが開きます。

56.4 YouTubeプロキシ・アセットの設定

YouTubeプロキシ・アセットにアクセスするには、APIキーを追加して、プロキシ・サーバーまたはWebLogic Server (WebCenter SitesインスタンスがWebLogic Serverにインストールされている場合)を設定する必要があります。

YouTubeプロキシ・アセットを設定するには:
  1. Google DevelopersのYouTube APIキーを取得します。
    1. Google Developers Consoleにプロジェクトを登録します。
    2. YouTube Data API v3を有効にします。
    3. パブリックAPIサーバー・キーを生成します。
  2. 生成されたキーをプロパティ・ファイルにコピーします。
    1. wcs_properties.jsonファイルを開きます。
    2. wcsites.youtube.api.keyキーを検索し、生成されたAPIキーをその値に追加します。
      {
      "key" : "wcsites.youtube.api.key",
      "value" : "AIzaSyBnYqexNhlvU6QaJ2emS829bF...",
      "valid_values" : [ "" ],
      "defaultValue" : "",
      "category" : "Core",
      "subcategory" : "",
      "global" : true,
      "localServerValues" : { },
      "hide" : false,
      "readonly" : false,
      "restart_required" : false,
      "deprecated" : false,
      "description" : "YouTube public API access key used to search Youtube videos (proxy assets). Created by registering project in the Google Developers Console, enabling YouTube Data API v3, and generating a public API server key."
      }
  3. YouTube API v3を利用するYouTubeプロキシ・アセットを検索して使用します。
    1. avisportsサイトに切り替えます。
    2. Contributorインタフェースに移動します。
    3. 検索バーで、検索タイプとしてYouTube Videoを設定します。
    4. 検索語を入力し、「検索」アイコンをクリックします。
      YouTubeビデオが表示されます。
  4. プロキシ・サーバーを使用している場合、次の手順を実行し、YouTubeプロキシ・アセット用として構成します。
    1. Sites Explorerで、「Tables」「ElementCatalog」「CustomElements」「YouTube」「UI」「Data」「Search」の順に移動します。
    2. SearchAction.jspの行を編集します。
      • resdetails1列で、プロキシ・ホストを入力します。たとえば、proxyHost=my-proxy.company.comです。

      • resdetails2列で、プロキシ・ポートを入力します。たとえば、proxyPort=80です。

  5. WebCenter SitesがインストールされているWebLogic Serverを使用している場合、次の手順を実行し、YouTubeプロキシ・アセット用としてWebLogic Serverを構成します。
    1. Adminコンソールhost:admin port/consoleを開きます。
    2. 「ドメイン構造」「環境」「サーバー」の順に開きます。
    3. WebCenter Sitesが実行されている管理対象サーバーをクリックします。
    4. 「SSL」タブの下で、「詳細」を開きます。
      • 「ホスト名の検証」の下で、「カスタム・ホスト名の検証」を選択します。

      • 「カスタム・ホスト名の検証」には、weblogic.security.utils.SSLWLSWildcardHostnameVerifierを入力します。

    5. WebLogic Serverのトラストストアがgoogleapis.comを信頼していることを確認します。WebLogicのデフォルト設定では、次が可能です。
      • 「キーストア」タブの下の「キーストア」で、「変更」をクリックし、「デモ・アイデンティティとデモ信頼」を選択します。

      • 「キーストア」の下で、「パスフレーズ」にJava標準信頼キーストアが含まれることを確認します(デフォルトはchangeit)。

  6. サーバーを再起動します。

56.5 ユーザー・インタフェースのカスタマイズ

一般的なタスクが容易になるようにContributorインタフェースをカスタマイズした場合、コントリビュータおよびマーケティング担当者がWebCenter Sitesの使用を楽しめるようにすることができます。たとえば、コンテンツの検索が速くなるように検索をカスタマイズします。

このトピックでは、サード・パーティ・ソフトウェアと同期するためのインタフェースのカスタマイズ可能な部分について説明します。

56.5.1 検索スタート・メニューのカスタマイズ

Contributorインタフェースで、ユーザーは、「検索」スタート・メニューを選択することにより、特定のアセット・タイプに制限された検索を実行します。この図は、「検索タイプ」リストを示しています。

図56-12 「検索タイプ」スタート・メニューの選択

図56-12の説明が続きます
「図56-12 「検索タイプ」スタート・メニューの選択」の説明

特定のアセット・タイプに応じて検索をカスタマイズするには、次のエレメントを作成して、コントローラ・エレメントUI/Data/Search/Searchをオーバーライドします。

CustomElements/<AssetType>/UI/Data/Search/SearchAction
CustomElements/<AssetType>/UI/Data/Search/SearchJson

コントローラ・エレメントと、エレメントのオーバーライドの詳細は、「Contributorインタフェースの検索ビューのカスタマイズ」を参照してください。

UI/Data/Search/Searchは、検索コードを実行し、グリッド・ウィジェット(ドッキングまたはドッキング解除された、リスト表示またはサムネイル表示)での利用に適したJSONデータを生成します。このJSONデータは、有効なDojoデータストアにする必要があります。実装の例については、「コンテンツ・ツリーのカスタマイズ」を参照してください。

56.5.2 コンテンツ・ツリーのカスタマイズ

コンテンツ・ツリーは、新規または既存のツリー・タブに含めるカスタムのツリー・セクションを定義することでカスタマイズできます。カスタム・ツリー・タブのセクションの詳細は、ツリーへのアクセスの管理のためのオプション(Adminインタフェースのみ)を参照してください。

カスタム・ツリー・タブのセクションは、なんらかのレンダリング・ロジック(最終的にはツリー・ウィジェットで使用される)に基づいてデータを生成するJSPエレメントを参照します。ツリー・データは、次のユーティリティ・エレメントを使用して生成されます。

  • OpenMarket/Gator/UIFramework/BuildTreeNodeId: ツリー・ノードIDを生成します。

  • OpenMarket/Gator/UIFramework/BuildTreeNode: 適切に書式設定されたツリー・ノード・データを生成します。

次の例では、ツリー・ノードがアセットを表しているかどうかに応じたツリー・ノードの作成方法を示しています(アセット・ノードと非定型ノードの比較)。Adminインタフェースのツリーのカスタマイズを参照してください。

例1: アセットを表すツリー・ノードの作成

この例は、単一のアセット・ノードを表すツリー・ノードを生成する方法を示しています。このノードは、ダブルクリックされたときにinspectアクションを実行します(executeFunctionパラメータを参照)。つまり、アセットのデフォルト調査ビューが新しいタブにレンダリングされるようになります(そのアセットがタブ内で開かれている場合は、フォーカスが移動します)。

<%--
- Generates a tree node id.
- The element expects the asset id and type to be passed in parameters
- called respectively "ID" and "AssetType".
- The generated id is stored in a WebCenter
Sites variable called "TreeNodeID"
--%>
<ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNodeID">
     <ics:argument name="AssetType" value="Article" />
     <ics:argument name="ID" value="1234567890" />
</ics:callelement>

<%-- 
- Generates a tree node for this asset.
- Note that this element implicitly consumes variables
- currently present in the ICS scope, including "TreeNodeID"
--%>
<ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNode">
     <ics:argument name="Label" value="Node Label, for example asset name or other
                   readable string" />
     <ics:argument name="Description" value="Some optional tooltip text" />
     <ics:argument name="executeFunction" value="inspect" />
</ics:callelement>

例2: 非定型ツリー・ノードの作成

ツリー・ノードには、アセットを表さないものがあります。そのようなノードを、非定型ノードと呼びます。次の例は、親ノードを表す非定型ノードの生成方法を示しています。親ノードとは、子を持つノードで、開いたり閉じたりできます。

<%--
- Generates a tree node id. 
- For adhoc nodes, the expected parameter is called "AdHoc",
- and can be any arbitrary string, which must be unique across tree nodes
--%>
<ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNodeID" >
  <ics:argument name="AdHoc" value="SomeUniqueString" />
</ics:callelement>

<%-- 
- Generates a "LoadURL", that is the URL to be called when a tree node
- is expanded. In this case, we're calling the default utility SiteCatalog entry
- (OpenMarket/Gator/UIFramework/LoadTab) which, in turn, will invoke
- a custom element ("Some/Other/Element" in our example), in charge
- of generating the child nodes, based on some custom logic.
--%>
<satellite:link
       assembler="query" 
       pagename="OpenMarket/Gator/UIFramework/LoadTab"
       outstring="LoadURL">
  <satellite:argument name="populate" value="Some/Other/Element"/>
  <satellite:argument name="op" value="load"/>
</satellite:link>

<%--
- Generates the corresponding tree node data
- Note that this element consumes the "LoadURL" variable previously generated.
- The presence of LoadURL indicates whether a node should be marked as expandable
or not.
--%>
<ics:callelement element="OpenMarket/Gator/UIFramework/BuildTreeNode">
  <ics:argument name="Label" value="Some meaningful node label" />
</ics:callelement>

56.6 Webページへのプロキシ・アセットの埋込みについて

プロキシ・アセットのテンプレートを定義して、プロキシ・アセットがWebサイトで魅力的になるようにして、プロキシ・アセットをページ内に埋め込むことができます。

トピック:

56.6.1 プロキシ・アセット用テンプレートの作成

プロキシ・アセット用のテンプレートは、その他のアセット・タイプのテンプレートと同じように定義できます。

テンプレートを使用してプロキシ・アセットをレンダリングするには:
  1. Adminインタフェースで、メニュー・バーの「新規」をクリックし、「新規テンプレート」を選択します。
    「テンプレート」フォームが表示されます。
  2. 「名前」フィールドに、ProxyTestSummaryと入力します。
  3. 「対象アセット・タイプ」ドロップダウン・リストから、「ProxyTest」を選択します。
  4. 「サブタイプに適用」ボックスで、「任意」がまだ選択されていない場合はこれを選択します。
  5. 「エレメント」タブで、次を実行します。
    • 「使用」ドロップダウン・リストから、「エレメントはレイアウトとして使用されます。」を選択します。
    • 「テンプレート・エレメントを作成しますか。」セクションで、「JSP」をクリックします。
    • 「エレメント・ロジック」ボックスで、${WCS_PROXY}\templates\ProxyTestSummary.jspから次のコードを入力します。
    <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
    %><%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"
    %><%@ taglib prefix="render" uri="futuretense_cs/render.tld"
    %><%@ taglib prefix="fragment" uri="futuretense_cs/fragment.tld"
    %><%@ page import="javax.ws.rs.client.*"
    %><%@ page import="javax.ws.rs.core.*"
    %><%@ page import="org.codehaus.jettison.json.*"
    ><%@ page import="com.fatwire.cs.ui.framework.UIException"
    %><%@ taglib prefix="asset" uri="futuretense_cs/asset.tld"%> 
    
    <cs:ftcs>
    <%-- ProxyTest/ProxyTestSummary	--%>
    
    <%-- Record dependencies for the Template --%>
    <ics:if condition='<%=ics.GetVar("tid")!=null%>'>
         <ics:then><render:logdep cid='<%=ics.GetVar("tid")%>' c="Template"/>
         </ics:then>
    </ics:if>
    
    <%-- Set the urlPath to proxy_samples --%>
    <%
    String host = request.getServerName();
    String port = Integer.toString(request.getServerPort());
    String contextPath = request.getContextPath();
    String urlPath = "http://"+host+":"+port+"/"+contextPath+"/proxy_samples/content/";
    %>
    
    <%-- first, retrieve the external id --%>
    <asset:load name="asset" type='<%=ics.GetVar("c") %>'
           objectid='<%=ics.GetVar("cid") %>' />
    <asset:get name="asset" field="name" />
    <asset:get name="asset" field="externalid" />
    
    <%
    // given the external content id, invoke the  third-party repository API
    // to retrieve content metadata
    Client client = ClientBuilder.newClient();
    Response resp = null;
    WebTarget res = null;
    
    try {
         res = client.target(urlPath + ics.GetVar("externalid") + ".json");
         resp = res.request(MediaType.APPLICATION_JSON).get();
    } catch (Exception e) {
         // propagate exception to client-side
         request.setAttribute(UIException._UI_EXCEPTION_, e);
         e.printStackTrace();
         throw e;
    }
    
    String jsonString = resp.readEntity(String.class);
    JSONObject data = new JSONObject(jsonString);
    %>
    
    <%-- finally render content --%>
    <h4><%=data.getString("title") %></h4>
    <p><%=data.getString("foo") %></p>
    <img src="<%=data.getString("image") %>" alt="<%=data.getString("title") %>" />
    
    </cs:ftcs>
    
  6. Contributorインタフェースで、「検索」フィールドは空白のままにして、ProxyTestアセットを検索します。
  7. アセットの詳細が含まれるProxyTestアセットをクリックします(YellowSkierなど)。
  8. 「プレビュー」をクリックし、ProxyTestSummaryレイアウトを選択し、「適用」をクリックします。
ProxyTestアセットのタイトル、メタデータおよびイメージが表示されます。この図は、YellowSkierと呼ばれるサンプル・グラフィックを示しています。

56.6.2 プロキシ・アセットのスロットでの使用

プロキシ・アセットは、標準アセットに適用されるものとまったく同じタグと原則を使用して、ページ内に埋込みできます。

  1. ページ属性を作成します。
    1. 「名前」フィールドに、ProxyTestAttributeと入力します。
    2. 「属性タイプ」ドロップダウン・リストから、「アセット」を選択します。
    3. 「対象アセット・タイプ」ドロップダウン・リストから、「ProxyTest」を選択します。
    4. 「Save」アイコンをクリックします。
  2. ページ定義を作成します。
    1. 「名前」フィールドに、ProxyTestPageDefと入力します。
    2. 「属性」セクションで、ProxyTest属性を選択し、「オプション」をクリックします。
    3. 「保存」アイコンをクリックします。
  3. ページ・アセットのテンプレートを作成します。
    1. 「名前」フィールドに、ProxyTestSlotTemplateと入力します。
    2. 「対象アセット・タイプ」ドロップダウン・リストから、「ページ」を選択します。
    3. 「サブタイプに適用」ボックスで、「任意」がまだ選択されていない場合はこれを選択します。
    4. 「エレメント」タブで、次を実行します。
      • 「使用」ドロップダウン・リストから、「エレメントはレイアウトとして使用されます。」を選択します。

      • 「テンプレート・エレメントを作成しますか。」セクションで、「JSP」をクリックします。

      • 「エレメント・ロジック」ボックスで、${WCS_PROXY}\templates\ProxyTestSlotTemplate.jspから次のコードを入力します
        <%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"%>
        <%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"%>
        <%@ taglib prefix="render" uri="futuretense_cs/render.tld"%>
        <%@ taglib prefix="insite" uri="futuretense_cs/insite.tld"%>
        <%@ taglib prefix="assetset" uri="futuretense_cs/assetset.tld"%>
        <cs:ftcs><render:logdep cid='<%=ics.GetVar("tid")%>' c="Template"/>
        <html>
        <head>
             <title>ProxyTest Slots Example</title>
        </head>
        <body>
             <assetset:setasset name="page" id='<%=ics.GetVar("cid") %>'
                                type='<%=ics.GetVar("c") %>' />
             <assetset:getattributevalues attribute="ProxyTestAttribute" listvarname="ProxyTest"
                                name="page" typename="PageAttribute" />
             <ics:listget listname="ProxyTest" fieldname="value" output="id" />
             <h3>ProxyTest Slots Example</h3>
             <insite:calltemplate field="ProxyTestAttribute" c='ProxyTest'
                                cid='<%=ics.GetVar("id") %>' tname="ProxyTestSummary" />
        </body>
        </html>
        </cs:ftcs>
  4. ページ・アセットを作成します。
    1. Contributorインタフェースで、メニュー・バーから、「コンテンツ」「新規」「ページ (セクション)」の順に選択します。
    2. 「追加」フィールドに、ProxyTestPageと入力します。
    3. 「ページ定義」ドロップダウン・リストから、「ProxyTestPageDef」を選択します。
    4. 「テンプレート」ドロップダウン・リストから、「ProxyTestSlotTemplate」を選択します。
    5. フォーム・モードおよびWebモードで、ProxyTestアセットをProxyTestAttributeスロットにドラッグ・アンド・ドロップします。
      Webモードでは、ProxyTestアセットはProxyTestSummaryテンプレートを使用してレンダリングされます。
この図はProxyTestスロットの例を示しています。

56.6.3 プロキシ・アセットのキャッシングについて

レンダリング済のコンテンツは独立したリポジトリで保管および管理されるため、コンテンツが変更されたときに(コンテンツが変更された後でも)、その変更をWebCenter Sitesが認識する方法がありません。プロキシ・アセットをレンダリングするテンプレート(「プロキシ・アセット用テンプレートの作成」で定義したSummaryテンプレートなど)には、期間が限られたキャッシュ有効期限を設定するようにしてください。