Community-Gadgets Webアプリケーションは、CSS、テンプレート、検索エンジン最適化(SEO)などの多数のカスタマイズ可能な拡張ポイントを提供しています。これらを使用して、Community-Gadgetsウィジェットの外観と機能性を変更できます。ただし、カスタマイズ可能な拡張ポイントを使用しても、特定のWebサイト設計や使用戦略がウィジェットに適用されていることが原因で、特定の顧客のプロジェクト要件を常に満たせるとはかぎりません。このようなシナリオでは、WebCenter Sitesデータ構造を直接操作し、それらをページ・テンプレートでカスタム手法を使用して個別にレンダリングすることを検討してください。
この章では、WebCenter Sitesデータ構造について詳しく説明します。次の項で構成されます。
Community-Gadgetsは、WebCenter Sitesをデータ・リポジトリとして利用し、Webエクスペリエンス管理(WEM)フレームワークによって提供されるREST APIを通じてそのWebCenter Sitesと通信します。Community-Gadgetsのデータ構造をWebCenter Sitesリポジトリに格納することによって、WebCenter Sitesのアセット・モデルやキャッシング・システムを活用できます。
Community-Gadgets Webアプリケーションのオブジェクト・データ・モデルは、次のカテゴリとオブジェクトによって構成されます。
オブジェクト: CommentFeed
オブジェクト: CommentRecord
オブジェクト: ReviewFeed
オブジェクト: ReviewRecord
オブジェクト: RatingFeed
オブジェクト: RatingRecord
オブジェクト: User
オブジェクト: UserIdentity
オブジェクト: UserLink
オブジェクト: Gadget
オブジェクト: OpenSocialDescriptor
オブジェクト: SingleGadgetData
オブジェクト: GadgetSet
図81-1は、これらのカテゴリとオブジェクトを図式化したものです。ユーザー生成コンテンツ・セクションでは、ビジネス・オブジェクトがコメントやレビューなどのCommunityウィジェットに関連付けられている様子が示されています。ユーザー生成コンテンツ(UGC)の各エントリには、それが登録済ユーザーによって投稿された場合、ユーザー・オブジェクトのセットが関連付けられます(訪問者セクション)。
図81-1に表示されているオブジェクトは、表81-1に示すように、WebCenter Sitesのデータベース表に格納されます。
表81-1 オブジェクトのデータベース表名
オブジェクト | データベース表名 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
コメントには、次の種類のプライマリ・オブジェクトが関連付けられます。
このオブジェクトは、ウィジェットがデプロイされているWebページの計算された概要情報を表します。CommentFeedオブジェクトは、「コメント」ウィジェットがデプロイされているページが最初にアクセスされたときにデータベースに作成されます。
コメントとそのコメントが表示されるページの間の関係を決定するために、Community-Gadgets Webアプリケーションは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがCommentFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがCommentFeedオブジェクト内に記録されます。CommentFeedオブジェクトは複数のコメントを保持し、コメントを表すCommentRecordオブジェクトと1対多のアソシエーションを持ちます。
CommentFeedオブジェクトは、WebCenter Sites内ではcg_comment_feed
ベーシック・アセットとして格納され、それに対応してデータベース内ではcg_comment_feed
表として格納されます。表81-2は、このアセットの構造の説明です。
表81-2 "cg_comment_feed" AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
一意のアセット識別子またはAssetTypeの主キー。 |
|
VARCHAR(256) |
ディスカッションの識別子。これは、Community-Gadgetsが、訪問者がコメントを投稿したページとコメントのリストを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内の |
|
VARCHAR(256) |
コメント・ディスカッション・スレッドをホストするURL。 |
|
DATE |
フィード・オブジェクトが作成された日付。 |
|
DATE |
フィードの最新の変更日。 |
|
VARCHAR(256) |
フィードを最後に変更したユーザーのID。 |
|
VARCHAR(256) |
フィード・オブジェクトを作成したユーザーのID。(フィード・オブジェクトは、最初のページ・ロード時にウィジェットがデプロイされた直後に作成されます。通常、これはゲスト・セッションを使用して実行されるため、 |
|
BIGINT |
モデレーションを正常にパスし、訪問者に対して表示されるコメントの数。 |
|
BIGINT |
モデレーションをまだパスしていないコメントの数。 |
|
VARCHAR(256) |
コンテンツ・カテゴリのID。ファイル、記事、ブログなど、コメントの添付先コンテンツのタイプを示します。(デプロイメント・ページの |
|
VARCHAR(256) |
「コメント」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ここにはウィンドウ・タイトルの値が記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内の |
|
VARCHAR(256) |
Adminインタフェースを通じてトピック・ページによって定義される投稿ステータスの状態。可能な値: |
このオブジェクトは、サイト・ページの訪問者によって投稿されたコメントを表します。これは、cos_root_id
フィールドを介して多対1でCommentFeedオブジェクトに論理的にリンクされます。つまり、多数のCommentRecordオブジェクトを1つのCommentFeedオブジェクトにリンクできます。
表81-3 cg_comment_record assetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
コメントの識別子。 |
|
VARCHAR(4000) |
投稿されたコメントの内容。VARCHAR(4000)データ型は、WebCenter Sitesがインストールされているデータベースに対する、最も効率的な記憶域タイプ(CLOBなど)に変換されます。 |
|
BIGINT |
会話が行われているページを表すCommentFeedオブジェクトへのアソシエーション。ここには、対応する この列を使用して、1つのページに投稿されたすべてのコメントを問い合せることができます。 |
|
VARCHAR(450) |
コメントの状態。コメントのモデレーションのステージを表します。 手動モデレーションが有効な場合、次の値になることがあります。
コメントがモデレーションをパスしたか、または自動パブリッシュされた場合、値は次のようになります。
コメントが自動フィルタまたはモデレータによってパスにならなかった場合、値は次のようになります。
モデレータのナビゲーションを簡素化するため、Communityインタフェースにはこれらのカテゴリに基づくフィルタが含まれています。 |
|
BIGINT |
コメントを投稿した訪問者のID。ゲストによるエントリである場合は |
|
VARCHAR(256) |
コメントの投稿元のクライアントのIPアドレス。 |
|
VARCHAR(450) |
コメント・エントリを投稿した登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなくコメントを作成者名でソートして表示できます。 |
|
VARCHAR(450) |
コメントの権限設定によってゲスト(未認証の訪問者)による投稿が可能になっており、訪問者に対して電子メールIDの指定が求められる場合、この列に電子メールIDが保存されます。 |
|
BIGINT |
コメントに対する返信が有効になっている場合の、コメント・スレッド内でのコメントのレベル。この数字が大きいほど、ツリーのより深い場所にコメントが投稿されています。 初期値は |
|
BIGINT |
返信が投稿された直接の親コメントのID。 |
|
BIGINT |
階層内でのコメントの親のチェーン。リーフからルートへのパスです。 |
|
VARCHAR(32) |
|
|
BIGINT |
コメントにフラグが付けられた回数。 |
|
VARCHAR(450) |
コメントに対する有用性レポート(「はい」および「いいえ」)の数。カンマで区切られ、0から始まります。初期値は |
|
INTEGER |
他の訪問者によって報告された有用性に基づいて事前計算されたコメントのランク。「はい」の数から「いいえ」の数を減算することによって計算されます。 |
|
DATE |
コメントが投稿された日付。 |
|
DATE |
コメントの最新の変更日付(登録済ユーザーは自分のコメントを変更できます。モデレータがコメントを変更する場合もあります)。 |
|
BIGINT |
ディスカッション・スレッドが有効になっており、コメントに返信を投稿できる場合、現在のコメントに対する返信数がここに記録されます。 この数は再帰的ではないため、直接の子コメントのみが考慮されます(子の子は除外される)。 |
|
VARCHAR(450) |
特定の書式で生成される文字列。単純なWEM REST問合せとアルファベット順の順序付けを使用するスレッド階層によるコメントの順序付けを有効にします。生成戦略は次のとおりです。
|
レビューには、次の種類のプライマリ・オブジェクトが関連付けられます。これらのオブジェクトは、コメントのオブジェクトと似ています。
このオブジェクトは、サイト・ページに投稿されたレビューのリストを表します。ReviewFeedオブジェクトは、第81.1.1.1項「CommentFeed」で説明したCommentFeedオブジェクトに非常に似ています。Community-Gadgetsは、同じコード・インフラストラクチャを使用して、これらのオブジェクトを処理します。ただし、データベース・スキーマ・レベルのメンテナンスを簡易化するために、CommentFeedおよびReviewFeedのデータは2つの個別の表に格納されます。CommentFeedとReviewFeedの唯一の相違は、ReviewFeedにはすべての投稿されたレビューを対象に計算された平均ランクに関する追加情報が含まれる点です。
ReviewFeedオブジェクトは、「レビュー」ウィジェットがデプロイされているページが最初にアクセスされたときにデータベースに作成されます。
レビューとそのレビューが表示されるページの間の関係を決定するために、Community-Gadgetsは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがReviewFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがReviewFeedオブジェクト内に記録されます。ReviewFeedオブジェクトは複数のレビューを保持し、レビューを表すReviewRecordオブジェクトと1対多のアソシエーションを持ちます。
レビュー・フィード・オブジェクトは、WebCenter Sites内ではcg_review_feed
ベーシック・アセットとして格納され、それに対応してデータベース内ではcg_review_feed
表として格納されます。表81-4は、このアセットの構造の説明です。
表81-4 cg_review_feed AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
一意のアセット識別子またはAssetTypeの主キー。 |
|
VARCHAR(256) |
ディスカッションの識別子。これは、Community-Gadgetsが、レビューされたトピックが投稿されたページとレビューのリストを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内の |
|
VARCHAR(256) |
レビューが投稿されたディスカッションをホストするURL。 |
|
DATE |
フィード・オブジェクトが作成された日付。 |
|
DATE |
フィードの最新の変更日。 |
|
VARCHAR(256) |
フィードを最後に変更したユーザーのID。 |
|
VARCHAR(256) |
フィード・オブジェクトを作成したユーザーのID。(フィード・オブジェクトは、最初のページ・ロード時にウィジェットがデプロイされた直後に作成されます。通常、これはゲスト・セッションを使用して実行されるため、 |
|
BIGINT |
モデレーションを正常にパスし、訪問者に対して表示されるレビューの数。 |
|
BIGINT |
モデレーションをまだパスしていないレビューの数。 |
|
FLOAT |
ページに投稿されたレビューに付けられたすべてのランクの平均(算術平均として計算される)。たとえば、ページに2つのレビューが投稿され、1つには星3つが、もう1つには星5つが与えられた場合、このフィールドの値は3+5/2 = 4となります。 |
|
VARCHAR(450) |
投稿されたランクの数のカンマ区切りリスト。このリストには全部で5つの項目が格納されます。リストのそれぞれの位置(索引)には、レビューに与えられたそれぞれの星の数のカウント数が格納されます。たとえば、3つのレビューがあり、1つのレビューに星3つが与えられ、他の2つのレビューに星5つが与えられた場合、残りの位置には0が置かれ、このリストには |
|
VARCHAR(450) |
レビューのタイプがサムズ・アップ/ダウンに設定されている場合は、このフィールドに投票が記録されます。これは非正規化されたフィールドであり、サムズ・アップとサムズ・ダウンの数がカンマに区切られて格納されます。たとえば、レビューが3つあり、そのうち2つにサムズ・アップが付けられ、1つにサムズ・ダウンが付けられた場合、このフィールドの値は |
|
VARCHAR(256) |
ファイル、記事、ブログなど、レビューが付加されるコンテンツの種類を表す、コンテンツ・カテゴリのID。(デプロイメント・ページの |
|
VARCHAR(256) |
「レビュー」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ここにはウィンドウ・タイトルの値が記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内の |
|
VARCHAR(256) |
adminインタフェースを通じてトピック・ページによって定義される投稿ステータスの状態。可能な値: open、closed |
このオブジェクトは、サイト・ページの訪問者によって投稿されたレビューを表します。これは、cos_root_id
フィールドを介して多対1でReviewFeedオブジェクトに論理的にリンクされます。
表81-5 cg_review_record AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
レビューの識別子。 |
|
VARCHAR(4000) |
投稿されたレビューの内容。VARCHAR(4000)データ型は、WebCenter Sitesがインストールされているデータベースに対する、最も効率的な記憶域タイプ(CLOBなど)に変換されます。 |
|
VARCHAR(450) |
投稿されたレビューのタイトル。 |
|
FLOAT |
訪問者によってレビューに与えられた星の数(ランク)。評価タイプがサムズ・アップ/ダウンの場合、 |
|
INTEGER |
評価タイプがサムズ・アップ/ダウンに構成されている場合、ここにランク値が格納されます。 |
|
INTEGER |
与えられたレビュー・ランクのタイプ。可能な値コードは次のとおりです。 0: 星 1: サムズ・アップ/ダウン |
|
BIGINT |
レビューが送信されたページを表すReviewFeedオブジェクトへのアソシエーション。 ここには、対応する |
|
VARCHAR(450) |
レビューの状態。コンテンツのモデレーションのステージを表します。手動モデレーションが有効な場合、次の値になることがあります。
レビューがモデレーションをパスしたか、または自動パブリッシュされた場合、値は次のようになります。
レビューが自動フィルタまたはモデレータによってパスにならなかった場合、値は次のようになります。
モデレータのナビゲーションを簡素化するため、Communityインタフェースにはこれらのカテゴリに基づくフィルタが含まれています。 |
|
BIGINT |
レビューを投稿した訪問者のID。ゲストによるエントリである場合は |
|
VARCHAR(256) |
レビューの投稿元のクライアントのIPアドレス。 |
|
VARCHAR(450) |
レビュー・エントリを投稿した登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなくレビューを作成者名でソートして表示できます。 |
|
VARCHAR(450) |
レビューの権限設定によってゲスト(未認証の訪問者)による投稿が可能になっており、訪問者に対して電子メールIDの指定が求められる場合、この列に電子メールIDの値が保存されます。 |
|
VARCHAR(32) |
|
|
BIGINT |
他の訪問者がレビューにフラグを付けた回数。 |
|
VARCHAR(450) |
レビューに対する有用性レポート(「はい」および「いいえ」)の数。カンマで区切られ、0から始まります。初期値は |
|
INTEGER |
他の訪問者によって報告された有用性に基づいて事前計算されたレビューのランク。「はい」の数から「いいえ」の数を減算した値です。 |
|
DATE |
レビューが投稿された日付。 |
|
DATE |
レビューの最新の変更日。(登録済ユーザーのみが自分のレビューを変更できます。必要に応じてモデレータがレビューを変更することも可能です。) |
このオブジェクトには、トピックまたはページ上の投稿に対して訪問者が与えた評価のリストが格納されます。これはReviewFeedオブジェクトに酷似しています。
Ratingsオブジェクトは、「評価」ウィジェットがWebサイトにデプロイされた後、Webページが最初にアクセスされたときにデータベースに作成されます。
評価とその評価が表示されるページの間の関係を決定するために、Community-Gadgetsは、WebページのURL(ウィジェットのデプロイメント・タグ内にあるアプリケーション生成キー)、またはリソースID(ウィジェットのデプロイ時に管理者が指定可能)を使用します。WebページのURLがキーとして利用可能である場合は、そのページURLから生成されたハッシュがRatingFeedオブジェクト内に記録されます。リソースIDが指定されている場合は、そのリソースIDがRatingFeedオブジェクト内に記録されます。RatingFeedオブジェクトは複数の評価を保持し、評価を表すRatingRecordオブジェクトと1対多のアソシエーションを持ちます。
評価フィード・オブジェクトは、WebCenter Sites内ではcg_rating_feedベーシック・アセットとして格納され、それに対応してデータベース内ではcg_rating_feed表として格納されます。
評価には、次の種類のプライマリ・オブジェクトが関連付けられます。
表81-6および表81-7は、cg_rating_feed
assetTypeの構造の説明です。
表81-6 cg_rating_feed AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
ページに投稿された評価のリストを保持するオブジェクトの識別子。 |
|
VARCHAR(256) |
特定のWebページ上における評価の識別子。 これは、Community-Gadgetsが評価のリストと該当するページを関連付けることができるようにするための論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内の
|
|
VARCHAR(256) |
訪問者が評価を設定したWebページのURL。 |
|
DATE |
フィード・オブジェクトが作成された日付。 |
|
DATE |
フィードの最終変更日。 |
|
VARCHAR(256) |
最初にフィード・オブジェクトを作成したユーザーのID。(これは最初のページ・ロード時にウィジェットがデプロイされた直後に発生します。通常、フィード・オブジェクトはゲスト・セッションを通じて作成されるため、 |
|
BIGINT |
モデレーションを正常にパスし、一般的な評価計算でカウントされる評価の数。 |
|
BIGINT |
モデレーションをまだパスしていない評価の数。 |
|
FLOAT |
訪問者によって投稿されたすべての星タイプの評価の平均(算術平均)。たとえば、2つの評価があり、1つは星3つのランク、もう1つは星5つのランクである場合、この値は3+5/2 = 4と計算されます。 |
|
VARCHAR(450) |
評価の数のカンマ区切りリスト。このリストには全部で5つの項目が格納されます。リストのそれぞれの位置(索引)には、与えられたそれぞれの星の数のカウント数が格納されます。たとえば評価が3つあり、そのうち1つに星3つが与えられ、他の2つに星5つが与えられた場合、このリストの0は欠落している位置を示します。そのため、リストは0,0,1,0,2となります。対応する位置の評価の数に注意してください。具体的な位置から、投票数/星の数を知ることができます。 |
|
VARCHAR(450) |
評価のタイプがサムズ・アップ/ダウンに設定されている場合は、このフィールドに評価が記録されます。これは非正規化されたフィールドであり、サムズ・アップとサムズ・ダウンの数がカンマに区切られて格納されます。たとえば評価が3つあり、そのうち2つがサムズ・アップで、1つがサムズ・ダウンである場合、格納される値は |
|
BIGINT |
|
|
BIGINT |
|
|
VARCHAR(256) |
コンテンツ・カテゴリのID。ファイル、記事、ブログなど、評価の添付先コンテンツのタイプを示します。デプロイメント・ページのResource Typeパラメータの値として、またはウィジェット・デプロイメント・コード・スニペットの |
|
VARCHAR(256) |
「評価」ウィジェットがデプロイされるページのタイトル。デフォルトでは、ウィンドウ・タイトルの値がページ・タイトルとして記録されます。ページ・デザイナは、デプロイメント・コード・スニペット内の |
このオブジェクトは、サイト・ページの訪問者によって投稿された評価を表します。これは、「cos_root_id」フィールドを介してRatingFeedオブジェクトに論理的にリンクされます。このオブジェクトは、多対1関係モデルに基づいています。
表81-7 cg_rating_record AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
評価の識別子。 |
|
INTEGER |
評価のタイプがサムズ・アップ/ダウンに構成されている場合、ここにランク値が記録されます。1がサムズ・アップの値であり、 |
|
INTEGER |
評価ランクのタイプ。 可能な値コードは次のとおりです。
|
|
BIGINT |
評価が送信されたページを表すRatingFeedオブジェクトへのアソシエーション。ここには、対応する |
|
VARCHAR(450) |
評価の状態。内容のモデレーションのステージを表します。 手動モデレーションが有効な場合、値は 評価がモデレーションをパスしたか、または自動パブリッシュされた場合、値は 評価が自動フィルタまたはモデレータによってパスにならなかった場合、値は モデレータのナビゲーションを簡素化するため、Communityインタフェースの右側のパネルにはこれらのカテゴリのフィルタが用意されています。 |
|
BIGINT |
評価を投稿した訪問者のID。ゲストによるエントリの場合は |
|
VARCHAR(256) |
評価の投稿元のクライアントのIPアドレス。 |
|
VARCHAR(450) |
評価を与えた登録済ユーザーまたはゲストの表示名。Communityインタフェース内では、このフィールドを使用して、データベースに追加リクエストをすることなく評価を作成者名でソートして表示できます。 |
投票機能はデータベース内の1つの表によって表されます。管理者が投票を作成するときに、対応する行がこの表に追加されます(表81-8)。
表81-8 cg_poll AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
投票インスタンスの識別子。 |
|
VARCHAR(256) |
投票インスタンスの一意の文字列による識別子。これは通常のIDとともにデプロイメント・コード・スニペットに埋め込まれます。データ移行時に整数のIDが失われた場合は、システムはUIDによってこの投票を見つけることができます。これにより、既存のデプロイメントの破損を防止できます。 |
|
INTEGER |
投票結果を表示するグラフのタイプ。 可能な値は次のとおりです。
|
|
INTEGER |
Webサイト上で投票に適用されるテーマのID。可能な値は次のとおりです。
|
|
DATE |
投票が開始される日付。投票キャンペーンの開始日です。 |
|
DATE |
投票が終了し、これ以上投票できなくなる日付。投票キャンペーンの終了日です。 |
|
VARCHAR(32) |
投票後に結果を表示するかどうかを指定するブール値( |
|
INTEGER |
投票結果をどのように表示するかを指定します。
|
|
INTEGER |
投票結果のコンテキスト・メニューの幅(ピクセル単位)。 |
|
VARCHAR(450) |
投票のタイトル。 |
|
VARCHAR(450) |
投票の主な質問。 |
|
VARCHAR(4000) |
JSON形式による投票で選択可能な投票オプションのリスト。メタデータには、Community-Gadgetsが内部で使用する投票のID、オプション・タイトル、色および残りの投票数が含まれます。例:
|
|
VARCHAR(450) |
訪問者に対して投票後に表示されるメッセージ。 |
|
VARCHAR(32) |
投票の免責事項テキストを表示するかどうかを指定するブール値( |
|
VARCHAR(450) |
投票ウィジェットの下部に表示される免責事項テキスト。 |
|
INTEGER |
現在の投票キャンペーンの合計投票数。 |
トピック機能によって、「コミュニティ」ウィジェットのレビュー数、評価値などの統計を収集し事前に計算できるため、後から収集された情報をより簡単かつ効率的に問い合せることができます。訪問者のフィードバックの事前計算と最適化は重要です。このタイプのコンテンツは、サイトのホーム・ページや、最もディスカッションされている/最もレビューされている/最も評価が高い記事をリストする訪問者のダッシュボードに表示されることがあるためです。
CommunityウィジェットがデプロイされたWebページや、それらのページで実行されたアクティビティは、トピック機能の主要な関心事になります。したがって統計は、CommentFeed、ReviewFeed、RatingFeedなどの複数の表にわたって集計されます。
表81-9 cg_topic AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
トピック・インスタンスの識別子。 |
|
VARCHAR(450) |
ウィジェットがデプロイされるページのURL。 |
|
VARCHAR(450) |
トピックが関連付けられたページのHTMLタイトル。 |
|
VARCHAR(450) |
UGCコンテンツをウィジェットのデプロイ先ページにリンクするための、ページのリソースID。 |
|
DATE |
トピックが作成された日付。ウィジェットのデプロイ先ページが、ブラウザで最初にアクセスされた日付です。 |
|
BIGINT |
対応するCommentFeedオブジェクトと |
|
BIGINT |
特定のトピックが関連付けられたページで投稿されたコメント数。 |
|
VARCHAR(450) |
ページにデプロイされた「コメント」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリ値の場合もあれば、「外観」設定ページにアップロードされたカスタマイズされたカテゴリの場合もあります。 |
|
DATE |
CommentFeedオブジェクトが統計値(投稿されたコメント数など)で最後に更新された日付。 |
|
BIGINT |
トピックが関連付けられたReviewFeedオブジェクトとの関係。 |
|
BIGINT |
トピックが関連付けられたページで投稿されたレビュー数。 |
|
VARCHAR(450) |
ページにデプロイされた「レビュー」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリの場合もあれば、「外観」設定ページにアップロードされてカスタマイズされたカテゴリの場合もあります。 |
|
DATE |
ReviewFeedオブジェクトが統計値(投稿されたレビュー数、ランクなど)で最後に更新された日付。 |
|
BIGINT |
特定のトピックが関連付けられたRatingFeedオブジェクトとの関係。 |
|
BIGINT |
このトピックが関連付けられたページに投稿された評価数。 |
|
VARCHAR(450) |
ページにデプロイされた「評価」ウィジェットに割り当てられたコンテンツ・カテゴリ(ブログ、記事など)。デフォルトのカテゴリの場合もあれば、「外観」設定ページにアップロードされてカスタマイズされたカテゴリの場合もあります。 |
|
DATE |
RatingFeedオブジェクトが統計値(投稿された評価数、ランクなど)で最後に更新された日付。 |
|
FLOAT |
他のトピックと比較した場合の現在のトピックのランク。現在のランキングのスキーマは頻度の統計に基づいており、次のフィールドの合計として計算されます。 |
訪問者には、次の種類のプライマリ・オブジェクトが関連付けられます。
User表は、Community-Gadgetsによって保持される訪問者プロファイルを表します。この表には、表示名、電子メール、アバターの画像など、訪問者の個人情報データが含まれます。
表81-10 cg_user AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
ユーザー・プロファイルの識別子。 |
|
VARCHAR(450) |
Webサイトの訪問者の電子メール。訪問者がFacebook、Twitter、Googleを使用して、またはJanrainを通じてログインした場合、この情報は入力されない可能性があります。ローカルに登録した訪問者は、この情報を使用することで、必要に応じてパスワードを復元できます。 |
|
VARCHAR(450) |
ユーザーの表示名。訪問者が登録時に入力するか、またはユーザーがログインで使用したソーシャル・ネットワーキング・サービスから取得されます。 |
|
INTEGER |
ユーザー・プロファイルのタイプ。 可能な値は次のとおりです。
|
|
VARCHAR(4000) |
JSON形式による、訪問者のアイデンティティの非正規化されたリスト。これらのアイデンティティは認証時に使用されるため、このプロファイルにリンクされます。 例: [{"username":"john"}] usernameフィールドは、対応するUserIdentityエントリに
|
|
BINARY |
ソーシャル・ネットワーキング・サービスを使用せずにローカルで登録したローカル・ユーザーのプロファイルでは、このフィールドにカスタマイズされたアバターが格納されます。 |
|
VARCHAR(450) |
ソーシャル・ネットワーキング・サービスを使用してログインしたユーザーのプロファイルでは、ここにアバター画像のURLが格納されます。 |
訪問者の資格証明を保存する2つのオプションとして、LDAPとWebCenter Sitesデータベースがあります。デフォルトでは、データベース・オプションが設定されます。
データベースが使用される場合、ユーザーの資格証明はUserIdentity表に格納され、対応する訪問者プロファイルにはUserLink表を使用して関連付けられます。
表81-11 cg_user_id AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
ユーザーの資格証明の識別子。 |
|
VARCHAR(256) |
認証で使用されるユーザー名。 |
|
VARCHAR(256) |
ユーザーの電子メール。必要に応じてユーザーのパスワードを復元する目的で使用されます。 |
|
VARCHAR(256) |
訪問者の認証で使用されるアイデンティティ・プロバイダのタイプ。 可能な値は次のとおりです。
|
|
VARCHAR(256) |
ユーザー・アイデンティティのパスワードを保護するために適用される暗号化アルゴリズム。システムの現在のバージョンで使用されるアルゴリズムは |
|
VARCHAR(256) |
認証で使用されるパスワードの暗号化された値。 |
表81-12では、訪問者のアイデンティティ(認証の資格証明を保持する)と訪問者のユーザー・プロファイルを適切に関連付けるために、UserIdentityをUserにリンクします。これは非正規化された表であるため、UserIdentity表のいくつかのフィールドもここにキャッシュされます。
表81-12 cg_user_link AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
ユーザー・リンクの識別子。 |
|
VARCHAR(256) |
UserIdentityオブジェクトのユーザー名。このリンクによってUserオブジェクトが関連付けられます。 |
|
VARCHAR(256) |
UserIdentityオブジェクトの電子メール。このリンクによってUserオブジェクトが関連付けられます。 |
|
VARCHAR(256) |
UserIdentityオブジェクトのアイデンティティ・プロバイダ・コード。このリンクによってUserオブジェクトが関連付けられます。 可能な値は次のとおりです。
|
|
BIGINT |
Userオブジェクトの識別子。このリンクによってUserIdentityオブジェクトが関連付けられます。 |
ガジェットとダッシュボードの機能には、次の種類のプライマリ・オブジェクトが関連付けられます。
Gadget表は、Community-Gadgetsによって保持されるガジェット・ユーザー設定を表します。
表81-13 cg_gadget AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
ガジェットの識別子。 |
|
BIGINT |
特定のガジェットの継承元であるGadgetオブジェクトとの関係。 |
|
VARCHAR(256) |
ガジェットのタイトル。 |
|
BIGINT |
特定のGadgetが関連付けられたUserオブジェクトとの関係。 |
|
VARCHAR(256) |
Gadgetオブジェクトのタイプ。 可能な値:
|
|
VARCHAR(4000) |
Gadgetsインタフェースでガジェットが登録された際の登録元のOpenSocial XML記述子のURL。 |
|
BIGINT |
特定のGadgetが関連付けられたGadgetSetオブジェクトとの関係。 |
|
VARCHAR(4000) |
特定のGadgetオブジェクトのCommunity-Gadgets固有のガジェット属性(JSON形式)。 |
|
VARCHAR(4000) |
特定のGadgetオブジェクトに割り当てられたカテゴリの空白区切りリスト。 |
|
VARCHAR(4000) |
特定のGadgetオブジェクトの設定(JSON形式)。 |
|
BIGINT |
ガジェットのアイコンが格納されているBLOBオブジェクトとの関係。 |
|
BIGINT |
ガジェットのプレビューが格納されているBLOBオブジェクトとの関係。 |
|
BIGINT |
ガジェットのサムネイルが格納されているBLOBオブジェクトとの関係。 |
OpenSocialDescriptor
表は、Gadgetsインタフェースでガジェットを登録する際に使用されるOpenSocial
ガジェットXML記述子を表します。
表81-14 cg_open_social_descriptor AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
|
|
BIGINT |
特定の |
|
BIGINT |
記述子が作成されたサイトの名前。 |
|
VARCHAR(4000) |
特定の |
|
VARCHAR(4000) |
ガジェット記述子の設定の非正規化されたリスト(JSON形式)。この設定は、ガジェットXML記述子から読み取られます。 |
SingleGadgetData表は、個別にデプロイされたガジェットに対する、認可されたユーザーの設定を表します。
表81-15 cg_single_gadget_data AssetTypeの構造
プロパティ | 型 | 説明 |
---|---|---|
|
BIGINT |
|
|
BIGINT |
特定のデータが関連付けられたGadgetオブジェクトとの関係。 |
|
BIGINT |
特定のデータが関連付けられた |
|
BIGINT |
ガジェットの識別子。これは、Community-Gadgetsが、訪問者がコメントを投稿したページとデプロイされたガジェットを関連付けるために使用する論理リンクです。このリンクは、ウィジェットのデプロイ時に、デプロイメント・ページの「リソースID」フィールドの値、またはウィジェット・コード・スニペット内の |
|
VARCHAR(4000) |
ガジェット記述子の設定の非正規化されたリスト(JSON形式)。この設定は、ガジェットXML記述子から読み取られます。 |
GadgetSet
表は、ダッシュボードの設定を表します。
Communityウィジェットは、次の方法でカスタマイズできます。
CSSを通じたカラー・スキーマとスキニング。ウィジェットがデプロイされるWebサイトにウィジェットのルック・アンド・フィールをマッチさせる必要がある場合、CSSをカスタマイズします。
ウィジェット・テンプレートを通じた再設計。新しいレイアウトや機能拡張など、ウィジェットを大きく変更する必要がある場合は、ウィジェット・テンプレートをカスタマイズします。
次の項で、これらのカスタマイズを実行する方法について説明します。
CSSをカスタマイズする一般的な手順は次のとおりです。
ウィジェットの標準のCSSスキンをダウンロードします。
カスタマイズが必要なインタフェース・エレメントのCSSスタイルを変更します。
カスタマイズしたCSSを適用します。
全体的なプロセスは同じですが、「コメント」ウィジェットおよび「レビュー」ウィジェットのCSSスタイルのカスタマイズは、他のウィジェットのカスタマイズとは異なります。
この項は、次のトピックで構成されています。
「コメント」および「レビュー」の場合、Communityインタフェースのウィジェットの「外観」ページからデフォルトのCSSをダウンロードし、それを変更してアップロードしなおします。Community-Gadgetsは、CSSがカスタマイズされている間もそのCSSをホストし続けるので、いつでも好きなときにCSSを変更できます。
CommentsのCSSをカスタマイズするには:
Communityインタフェースに管理者としてログインします。
「コメント」メニューから「構成」→「外観」を選択し、「コメントの外観」ページを表示します。
「一般」セクションで、「カスタムCSSのアップロード」フィールドの隣にある「現在のCSSのダウンロード」をクリックします。
ダウンロードしたCSSを編集するためにFireFoxで開きます。
「表示」メニューから「Firebug」を選択します。
FireBugメニューから「要素を調査」を選択します。CSSが図81-3のように表示されます。
Commentsコード全体を含むDIVエレメントには、wsdk-records-record
クラスが含まれます。このクラスを検索するには、以前にダウンロードしたデフォルトのCSSで次を見つけます。
.wsdk-records .wsdk-records-record { border-top: 1px dashed #666; clear: both; overflow: hidden; margin: 5px 0px; } Now, let's apply some customizations, for example change the default text color and size, and border: .wsdk-records .wsdk-records-record { border-top: 2px solid orange; color: #359AD3; font-size:15px; clear: both; overflow: hidden; margin: 10px 0px; } We can also find that background color is defined in the next div inside this container div, marked with CSS class "wsdk-state-default". Let's also define a custom background color: .wsdk-state-default { background: silver; }
必要に応じてwsdk-records-record
クラスをカスタマイズし(図81-4)、変更内容を保存します。
カスタマイズしたCSSをアップロードするために、Communityインタフェースに戻ります。
「コメント」メニューから「構成」→「外観」を選択し、「コメントの外観」ページを表示します。
「一般」セクションで、スキンをデフォルトからカスタムに変更し、「カスタムCSSのアップロード」フィールドの隣にある「参照」をクリックして、カスタマイズしたCSSファイルを選択します。
「保存」をクリックします。
Webページをリフレッシュしてウィジェットをリフレッシュし、CSSに加えた変更がウィジェットのインタフェースに反映されるかどうかを確認します。
「レビュー」ウィジェットのCSSをカスタマイズするには、「レビュー」に移動し、「構成」→「外観」を選択します。次に、前述の手順を実行します(手順3から手順12)。
「コメント」と「レビュー」以外のウィジェットをカスタマイズするには、この項で説明する一般的なアプローチを使用できます。状況によっては、ここで説明するアプローチを使用して「コメント」ウィジェットや「レビュー」ウィジェットをカスタマイズすることもできます。
この項で説明するアプローチと、「コメント」ウィジェットや「レビュー」ウィジェットで説明した内容の主な違いは、他のウィジェット用のカスタマイズされたCSSは、Community-Gadgets Webアプリケーションでホストされなくなるという点です。通常、カスタマイズされたCSSは、コメントがデプロイされるWebサイトでホストされます。
次の手順を実行して、レビュー機能のアドオンである「上位ランクのトピック」ウィジェットをカスタマイズします。
ページ・テンプレートへのデプロイメント・タグとCSSタグのコピー
Community-Gadgetsに管理者としてログインします。
「レビュー」メニューから、「デプロイ」→「上位ランクのトピック」を選択します。
「上位ランクのレビューのデプロイメント」フォームが表示されます(図81-5)。
「リソース・タイプ」、「評価」、「トピック数」および「次以降を含む」の各フィールドに必要な情報を入力します。「次以降を含む」フィールドを選択すると、最初の日付を選択するためのカレンダが表示されます。
「タグ」フィールドと「CSSタグ」フィールドの内容をコピーし、Webページ・テンプレートに貼り付けます。CSSは、前述のフィールドに追加された情報に基づいて更新されます。「タグ」フィールドの内容をテンプレートの<body>
セクションに挿入します。「CSSタグ」フィールドの内容をページ・テンプレートの<head>
セクションに挿入します。
コード・スニペットをデプロイします。
ページがレンダリングされると、上位ランクのトピックのデフォルトのルック・アンド・フィールは図81-6のようになります。
CSSのカスタマイズ
最初に、デプロイした「CSSタグ」フィールドの内容に含まれているID属性およびHREF属性を確認します。ID属性の値は、カスタマイズ時に変更しないようにする必要があります。この項の手順で示すとおり、HREFの値は変更します。
<link id="cos_css" type="text/css" rel="stylesheet" href="http://localhost:8280/cg/wsdk/skin/wsdk.topics.css?site_id=FirstSiteII&gateway=true" />
CSSをカスタマイズする前に、インターネット・ブラウザでHREFの場所にアクセスし、そのコンテンツをダウンロードします。
ダウンロードされたCSSの中で、トピック・リンクのCSSクラスを見つけます。ウィジェットの構造を調べます。
トピックのヘッドラインとトピックのリンクの色をカスタマイズするには、それぞれのコード・スニペットを見つけます。.fw_topics .headline
および.fw_topics .topic
を検索します。Webサイトの設計仕様に基づいて、次のコードを変更します。
.fw_topics .headline h1 { color: #359AD3; font-size: 16px; } .fw_topics .topic { font-size: 14px; padding: 5px; font-weight: bold; text-decoration: none; } .fw_topics .topic a { color: orange; font-size: 12px; text-decoration: none; }
CSSをWebサイトに適用するには:
Webサイトのスタイルが格納されているフォルダにCSSをコピーします。
以前にページ・テンプレートにコピーしたCSSの中で、デフォルトの場所を、カスタマイズしたCSSにアクセス可能な新しいURLに置き換えます。たとえば、CSSをskins
フォルダにコピーした場合は、HREFエレメントは次のようになります。
<link id="cos_css" type="text/css" rel="stylesheet" href="http://localhost:8180/cs/skins/wsdk.topics.css" />
注意: Community-Gadgets Webアプリケーションはウィジェットをロードするときに、 |
変更したばかりのCSSを含むウィジェットを使用しているページを再ロードし、カスタマイズが適用されていることを確認します(図81-7)。
ヒント: 同じページに複数のCommunityウィジェットをデプロイする場合、すべてのウィジェットのCSSファイルを1回のネットワーク・コールでロードすることによって、ネットワーク・コールの回数を最適化してください。Community-Gadgetsでは、 <link id="cos_css" type="text/css" rel="stylesheet" href=" http://localhost:8280/cg/wsdk/skin/<widget name #1>:<widget name #2>:<widget name #3>.css?site_id=FirstSiteII&gateway=true " /> ウィジェット名の例は、 |
大きな変更(「コメント」ウィジェットのアクションのリンクを、そのウィジェットの下部から上部に変更するなど)を行う場合は、プロジェクトの要件に応じてウィジェット・テンプレートをカスタマイズできます。
ウィジェット・テンプレートは、ブラウザ側でJavaScriptを使用して動的にレンダリングされます。これらのテンプレートは、Google Closure Templatesテクノロジに基づいています。
カスタマイズで利用可能な一連のテンプレート・ディレクティブが用意されています。詳細は、GoogleドキュメントのWebサイト(http://code.google.com/closure/templates/docs/commands.html
)を参照してください。
この項で説明されている情報を適用する前に、Googleドキュメントのprint
、if/else
、for
およびforeach
の各文の説明を必ず読み、内容を理解しておいてください。
この項は、次のトピックで構成されています。
この項では、ウィジェット・テンプレート・テクノロジと構文について説明します。Community-Gadgetsテンプレート内で宣言されたテンプレートを対応するWebCenter Sitesテンプレート名に変換することで、どのようにアタッチ・ポイントをオーバーライドできるかを説明します。この項では、Community-Gadgetsでのカスタマイズに使用できるアタッチ・ポイントについて説明し、さらに、テンプレートのカスタマイズ時にウィジェット構造をナビゲートして必要なアタッチ・ポイントを見つける方法を説明します。
この項は、次のトピックで構成されています。
テンプレートを変更する場合、開発者は訪問者の権限(Communityインタフェースで構成)および変数を扱う必要があります。Community-Gadgetsの各テンプレートには標準の$stack
変数が含まれており、これらのコンテキスト変数や権限を見つけるのに利用できます。たとえば、次のタグを使用して、ローカライズ可能なリソースをテンプレートに挿入できます。
<h1>Welcome to {$stack.resources.get('label.comments')} Widget </h1>
$stack.resources
変数は、cg.war/WEB-INF/classes/i18n_resources/widgets/cos.commons
およびcg.war/WEB-INF/classes/i18n_resources/widgets/<widget name>
で宣言されているすべてのリソースのアクセス・ポイントです。
JavaScriptの{script}
ディレクティブを使用して、テンプレート内に動的なロジックを構築できます。
{script} var lastIndex = 10; {/script}
{script}
の中で定義した変数は、$$
マークを使用することで他のクロージャ・ディレクティブ内でも利用可能です。たとえば、$$lastIndex
があります。
{for $index in range($$lastIndex)} For loop: Iteration #{$index + 1} of {$$lastIndex} in total <br /> {/for}
Googleのクロージャ・テンプレートの変数を{script}
タグ内でアクセスする必要があるシナリオでは、通常の{$var}
構文を使用できます。
{for $index in range(2)} {script} alert({$index}); {/script} {/for}
{script}
内で生成されたデータは、次の方法でWebページに表示できます。
{script}
タグを閉じ、以前に宣言したデータを{$$variable}}
構文を使用して出力する。
Community-Gadgetsが提供するシステム出力変数を使用し、{script}
文内でoutput.append(variable)
を使用してJavaScriptから直接結果を出力する。
{script} var message= "Hello World!"; output.append(message); {/script}
cg.war/js/widgets
ディレクトリには、Community-Gadgets Webアプリケーションに同梱されているウィジェット・ソースのリストがあります。たとえば、Comments-Gadgetsウィジェットのコードは、cg.war/js/widgets/wsdk.comments
ディレクトリに格納されています。それぞれのウィジェットのディレクトリには、.shtml
ファイル、ウィジェット・レイアウト定義およびウィジェット・インタフェースのレンダリング・プロセスのメイン・エントリ・ポイントが含まれています。たとえば、comments_layout_view.shtml
ファイルは、「コメント」ウィジェットのメイン・エントリ・ポイントです。
ウィジェットのインタフェースを構築するために、Community-GadgetsではModel-View-Controller (MVC)パターンを使用します。したがって、それぞれのインタフェースのリージョンには、Model、ViewおよびControllerに対応する3つのアイテムが含まれています。例:
comments_layout_action.js (Controller) comments_layout_model.js (Model) comments_layout_view.shtml (View)
ウィジェットのインタフェースを構築するために、Community-Gadgetsではテンプレート(.shtml
)の定義ではなく、MVCの定義を扱います。
たとえば、CommentsのレイアウトのMVCリージョンは、cg.war/js/widgets/<WidgetName>/...
ディレクトリ内の/comments_layout
のIDによって特定できます。特殊文字の/
は、ウィジェット・フォルダの相対パスを表します。対応する他のMVCエンティティを参照および検出するには、comments_layout
MVC接頭辞と、_view.shtml
(view
には、バインディング付きのHTMLページが含まれる)などの接尾辞を組み合せて使用します。したがって、特定のインタフェース・リージョンのMVC定義は、そのウィジェット・フォルダ内の相対パス、および特定のモデル、ビューまたはコントローラの検出に使用されるMVCエンティティの接頭辞によって特定されます。
これらのMVC IDはテンプレート全体で頻繁に使用されるため、これらのMVC IDの理解は、ウィジェットのインタフェースを構築する上で不可欠な要素です。
MVCのエンティティが処理され、そのテンプレートがレンダリングされるときに、別のMVCエンティティをテンプレート内に再帰的に含めることができます。これにより、小さなインタフェースの部品を組み合せながら複雑なインタフェースを構築できます。
テンプレートのネストを可能にするには、他のテンプレートをネストするテンプレートに次のタグを追加します。たとえば、「レビュー」ウィジェットの中に「ログイン・バー」ウィジェットをネストできます。
<div attachPoint="/sample"></div>
テンプレートにこのタグを含めると、Community-Gadgetsはウィジェットのルート・フォルダcg.war/js/widgets/<WidgetName>/
から、sample_action.js
およびsample_view.shtml
を検索します。
attachPoint=""
構文以外に、bindMvc=""
ディレクティブには、ネストされたテンプレート(たとえば、bindMvc="wsdk.ui.input"
)も含まれます。ただし、このディレクティブは特定のウィジェット・フォルダ階層の外部にあるテンプレートをコールするため、現在のウィジェット・フォルダ階層のテンプレートは含みません。これにより、Community-Gadgets内の複数のウィジェット間でコンポーネントを再利用できます。
前の項では、アタッチ・ポイントを使用してテンプレートをネストする方法について説明しました。この項では、テンプレートを通じてアタッチ・ポイントをカスタマイズまたはオーバーライドする方法について説明します。
Community-GadgetsがウィジェットのJavaScriptバンドルをコンパイルする場合は、WebCenter Sitesから、WebCenter Sitesテンプレートとして定義された任意のウィジェット・テンプレート・カスタマイズをダウンロードし、それらをJavaScriptにコンパイルして、ウィジェットに適用します。Community-GadgetsとWebCenter Sites間の対応付けを作成できるテンプレート名の規定は、http://{host}:{port}/cs/ContentServer?pagename={site name}/cg/{widget}/{attach point}_view.shtml&ft_ss=true
で指定されます。また、Community-Gadgetsで特定のテンプレートが検出可能になります。
(/sample
テンプレートなどの)テンプレートをカスタマイズするには、最初に、Community-Gadgetsが構成された本番のWebCenter Sitesシステム上でWebCenter Sitesテンプレート・アセットを作成する必要があります。
アタッチ・ポイントをWebCenter Sitesのテンプレート名に変換するには、次のフォーマットを使用します。
http://{host}:{port}/cs/ContentServer ?pagename={site name}/cg/{widget}/{attach point}_view.shtml &ft_ss=true
たとえば、「hello-world」ウィジェットのいずれかのテンプレートの中にattachPoint="/sample"
というアタッチ・ポイントがある場合、次のようなWebCenter Sitesに対するHTTPリクエストに変換されます。
http://{host}:{port}/cs/ContentServer ?pagename={site name}/cg/hello-world/sample_view.shtml &ft_ss=true
カスタムのCommunity-Gadgetsテンプレートの場合は、cos/hello-world/sample_view.shtml
というWebCenter Sitesのネーミング規則に従って、WebCenter Sites内に対応するテンプレートを作成する必要があります。
bindMvc
は、事前定義されたアタッチ・ポイントのセットであり、ネストされたテンプレートで使用できます。表81-3には、作成したテンプレート内でbindMvc=""
属性構文を使用してネストできる、テンプレートのリストが記載されています。再利用可能なウィジェット・コードが格納されているcg.war/js/widgets.commons
ディレクトリの対応するサブディレクトリ内に、デフォルトのテンプレートがあります。
コンポーネントをオーバーライドするには、マッピング(表81-17)を使用してMVCの名前を、WebCenter Sites内で作成するテンプレートの名前にバインドします。
表81-17 MVCの名前をテンプレートの名前にバインドするためのマッピング
バインドされるMVC | オーバーライドするテンプレートの名前 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
Communityウィジェットのインタフェースと機能は、特定の方法で構造化されたテンプレートを利用して構築されます。図81-8は、「コメント」ウィジェットの構造を示しています。カスタマイズの際は、この構造をナビゲーション・マップとして利用できます。
訪問者のアクションに応じて動的に呼び出されレンダリングされるアタッチ・ポイントは、テンプレート内で直接参照されることはありません。たとえば、訪問者がコメントの「編集」または「削除」のリンクをクリックすると呼び出されるアタッチ・ポイントがあります。これらのイベントのダイアログ・ボックスは、ウィジェットの初期ロード・フェーズではレンダリングできず、後でプログラムでロードされます。
そのような動的なダイアログ・ボックスのアタッチ・ポイントの例をいくつか示します。
訪問者がコメントの「削除」リンクをクリックすると、「削除」ダイアログ・ボックス(図81-9)が表示されます。
コメントにフラグが付けられると、「コンテンツのフラグ付け」ダイアログ・ボックス(図81-10)が表示されます。
「レビュー」ウィジェットのテンプレートとアタッチ・ポイントの構造を、図81-11に示します。レビューへのフラグ設定、レビューの編集および削除のアタッチ・ポイントはコメントの場合と同じであり、それぞれ/record_list/record/flag/flag
、/record_list/record/edit/form
および/record_list/record/remove/remove
になります。
コメントやレビューの投稿フォームには、「プレビュー」ボタンが含まれています。このボタンをクリックすると、コンテキスト・メニューとともにレンダリングされたコメントまたはプレビュー(図81-12)が表示されます。
コメントおよびレビューのいずれでも、/record_list/record/preview/preview
というアタッチ・ポイントによってこのポップアップ機能が作成されます。
ヒント: Community-Gadgets Webアプリケーションは、本番のWebCenter Sitesのインスタンスから、カスタマイズされたテンプレートをロードします。ただし、本番のインスタンスには、これらのテンプレートを管理するための編集用のインタフェースがない場合があります。したがって、最初は開発環境からスタートし、本番用および管理用のCommunity-Gadgetsサーバー・インスタンスから、編集用のインタフェースを備えたWebCenter Sitesの単一インスタンスをポイントすることをお薦めします。このアプローチを使用すると、テンプレートを作成して、Community-Gadgets内でルック・アンド・フィールを確認できます。テンプレートを作成してテストしたら、それらを開発環境からエクスポートして本番環境にインポートしたり、カスタム・テンプレートを目的の場所にパブリッシュすることができます。 |
WebCenter SitesのAdvancedインタフェースを使用してサンプル・テンプレートを作成するには:
本番環境および管理環境のものを含め、すべてのCommunity-Gadgetsサーバーを停止します。
本番環境のWebCenter Sitesインスタンスを起動します。
以降の手順では、サーバーはローカル・ホストのポート8080で実行されていると想定します。
http://localhost:8080/cs/login
にアクセスしてWebCenter Sitesにログインし、テンプレートのカスタマイズが必要なサイトを選択します。
そのサイトのAdvancedインタフェース・アプリケーションを起動します。
カスタマイズ可能なテンプレートを作成するには、「新規」をクリックします。
右側の表で、「テンプレート」の隣にある「新規テンプレート」リンクをクリックします。
「割当て先」を任意の値に設定します(この値はここでは適切でないため)。「続行」をクリックします。
「名前」フィールドに、オーバーライドされるアタッチ・ポイントをcg/{widget}/{attach point}_view.shtml
の形式で指定します。
「対象アセット・タイプ」フィールドで「様々なアセット・タイプに適用可能」を選択し、「続行」をクリックします。
「使用」フィールドで、「エレメントはHTMLページ全体を定義するため、外部から呼び出すことができます。」を選択します。
「テンプレート・エレメントを作成しますか。」フィールドで、「JSP」をクリックします。
「エレメント・ロジック」フィールドで、終了タグ</cs:ftcs>
の直前にテンプレート・コンテンツを入力します。テンプレート・コンテンツには、次の文、およびCommunity-Gadgets内にキャッシュされたテンプレートを無効にするための必須エレメントを含める必要があります。
<%-- 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>
テンプレートのコンテンツについては、Community-Gadgetsのファイル・システムに移動し、cg.war/js/widgets/{widget}/{attach point}_view.shtml
にあるデフォルトのコンテンツをコピーします。
「続行」をクリックします。
「サイト・エントリ」ページで、「保存」をクリックします。
新しく作成したテンプレートがHTTPを通じてCommunity-Gadgetsで利用できることを確認するには、ブラウザに次の形式でテンプレートのURLを入力します。
http://{host}:{port}/cs/ContentServer?pagename={site}/cg{attach point}_view.shtml&ft_ss=true
Community-Gadgetsサーバーを起動し、デプロイされているウィジェットにカスタマイズ内容が適用されていることを確認します。
シナリオによっては、既存のテンプレート内のカスタマイズされたプロジェクト固有のデータをロードする必要があります。これを行うには、Community-Gadgetsに対してデータをRESTサービスとして公開します(JSONP形式)。
RESTサービスを作成したら、システム・ローダー変数を使用してテンプレートからそのサービスを呼び出します。テンプレートがレンダリングされる前にカスタム・データがロードされるようにするには、ページの先頭の{script.preload}
セクションにこの起動を含める必要があります。
{script.preload} loader.loadData(url, params, key); {/script.preload}
url
: データを提供するJSONPエンドポイントのURLアドレス。
params
: 問合せをパラメータ化する必要がある場合に、JSONPエンドポイントに対してGETのパラメータとして渡されるパラメータ。
key
: この変数には返された結果セットとデータが格納され、$stack.key
でアクセスできます。
例として、JSONP RESTサービス・エンドポイントとして使用するdata.jsp
ファイルを作成します。このファイルには次のコンテンツを含めます。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <% out.write(request.getParameter("cosrestcallback")); %>({ responseCode : "OK", data : ["foo","bar"]});
この例では、応答はJSON形式で提供され、そこにはレスポンス・コードとデータ配列によるサンプル・データが格納されます。JSONのレスポンスは、Community-Gadgetsで使用されるJSONPプロトコルに従って、コールバックの名前によってラップされます。
data.jsp
ファイルを、Community-Gadgetsのwebapp
フォルダにデプロイします。
Community-Gadgetsにはサンプル・ウィジェットが用意されており、ウィジェット・テクノロジを試すためのサンドボックスとして利用できます。そのソースは、cg.war/js/widget/sample.widget
コード内にあります。cg/sample.widget/layout_view.shtml
という名前のWebCenter Sitesのカスタム・テンプレートを作成するには、第81.2.2.2項「サンプル・テンプレートの作成」で説明している手順に従います。
カスタマイズされたテンプレート内のscript.preload
セクションで指定されたデータをダウンロードし、それをページに出力します。
Community-GadgetsのURLを自分の場所に置き換えます。
図81-1は、ロードされた後のサンプル・データ・コードを示しています。
例81-1 ロードされたサンプル・データ
<%@ taglib prefix="cs" uri="futuretense_cs/ftcs1_0.tld"
%><%@ taglib prefix="asset" uri="futuretense_cs/asset.tld"
%><%@ taglib prefix="assetset" uri="futuretense_cs/assetset.tld"
%><%@ taglib prefix="commercecontext" uri="futuretense_cs/commercecontext.tld"
%><%@ taglib prefix="ics" uri="futuretense_cs/ics.tld"
%><%@ taglib prefix="listobject" uri="futuretense_cs/listobject.tld"
%><%@ taglib prefix="render" uri="futuretense_cs/render.tld"
%><%@ taglib prefix="siteplan" uri="futuretense_cs/siteplan.tld"
%><%@ taglib prefix="searchstate" uri="futuretense_cs/searchstate.tld"
%><%@ page import="COM.FutureTense.Interfaces.*,
COM.FutureTense.Util.ftMessage,
COM.FutureTense.Util.ftErrors"
%><cs:ftcs><%-- /cos/sample.widget/layout_view.shtml
--%>
<%-- 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>
{script.preload}
loader.loadData("http://localhost:8280/cg/data.jsp",{}, "customData");
{/script.preload}
<div>
<h1>Welcome to Sample Widget. Data Load Demo</h1>
<br />
Data loaded with response code = "{$stack.customData.responseCode} "
<br />
Custom data loaded:
{script}
var data = {$stack.customData.data};
for(var dataIdx in data)
{
var item = data[dataIdx];
{/script}
{$$item},
{script}
}
{/script}
</cs:ftcs>
Community-Gadgetsでは、CommunityウィジェットがデプロイされたWebサイトに訪問者がフィードバックを投稿できます。不適切な内容、スパムまたはなんらかの不正な情報がWebサイト上にパブリッシュされる事態を防ぐために、Community-Gadgetsには、コンテンツをフィルタリングするためのユーザー生成コンテンツ(UGC)フィルタリング・サブシステムが用意されています。
フィルタリング・システムのデフォルトの構成は、ワード・フィルタ・ファイル(制限付きワードのリスト)に依存します。このファイルは、Communityインタフェースで「設定」、「制限付きワード」の順に選択することでアップロードできます。制限付きワードのリストをアップロードし、Communityインタフェースで「設定」、「モデレート」の順に選択して自動モデレートを有効にすると、Community-Gadgetsは、訪問者が投稿したコンテンツが調べ、各ワードをリスト内のワードと比較します。投稿されたコメントまたはレビューに制限付きワードが含まれる場合は、「不適切」とマークされ、Webサイトで公開されません。
デフォルトのコンテンツ・フィルタの動作をカスタマイズする必要が生じることがあります。たとえば、スパムの検出と防御のための統計的推測と高度な手法の機能を提供するサード・パーティ・ライブラリと統合するために、Community-Gadgetsはプラッガブル・ワード・フィルタ・モデルを備えています。これにより、カスタム・ワード・フィルタをゼロから作成できます。
カスタム・ワード・フィルタを作成するには、最初にワード・フィルタのロジックが含まれたJavaクラスを作成する必要があります。次に、このクラスをコンパイルし、JARファイルとしてアセンブルして、Community-Gadgetsのデプロイメントにプラグインできるようにします。
IDEで新規Javaプロジェクトを作成します。
プロジェクトのクラスパスに、com.fatwire.cos.moderation.filter.WordFilter
インタフェースが格納されたJARライブラリを追加します。このライブラリのJARは、cg.war/WEB-INF/lib/cos-api-11.1.1.8.0.jar
にあるCommunity-Gadgets Webアプリケーションからコピーできます。
例81-2に、WordFilterインタフェースを示します。
例81-2 新規Javaプロジェクト
package com.fatwire.cos.moderation.filter; import java.util.Set; /** * The word filter interface that needs to be implemented * when developing and plugging-in a custom word filter * to Community-Gadgets Server. * The content is assigned to "Inappropriate" category and isn't * shown on web site once any of the filters registered in the system * reports an abuse. * @author e_shevchenko * * May 16, 2011 */ public interface WordFilter { /** * The filter method makes a decision whether content * specified can be shown on web site or not * @param text the content submitted by visitor * @param profanityWords the list of prohibited words uploaded on * "Moderation" page in the Community interface * @return true if an abuse detected and false if content * can be shown on web site */ boolean filter(StringBuffer text, Set<String> profanityWords); }
プロジェクト内に新規Javaクラス(例: cos.demo.DemoFilter
)を作成します。
このクラスが次のWordFilterインタフェースを実装することを宣言します。
package cos.demo; import java.util.Set; import com.fatwire.cos.moderation.filter.WordFilter; public class DemoFilter implements WordFilter { @Override public boolean filter(StringBuffer text, Set<String> profanityWords) { // Add filter logic here return false; } }
filter
メソッド本体にカスタムの実装を追加します。
filter
メソッドは2つのパラメータをとります。1つは訪問者が送信したソース・テキストで、もう1つはCommunityインタフェースを通じてテキスト・ファイルとしてアップロードされた制限付きワードのリストです。要件に基づいて、既存の制限付きワードのリストを使用するか、またはサード・パーティの制限付きワードのデータベースを使用するかを選択できます。
次の例は、ユーザー生成コンテンツにdemoという単語が含まれているかどうかを確認する方法を示しています。
package cos.demo; import java.util.Set; import com.fatwire.cos.moderation.filter.WordFilter; public class DemoFilter implements WordFilter { @Override public boolean filter(StringBuffer text, Set<String> profanityWords) { boolean result = false; if(null != text ) { result = text.toString().contains("demo"); } return result; } }
フィルタ・クラスの内容を実装し、コンパイルします。
コンパイルしたクラスをfilter-demo.jar
というJARファイルにパッケージ化します。
Community-Gadgets Webアプリケーションのクラス・ローダーがこのカスタム・フィルタを利用できるようにするには、管理環境と本番環境の両方のcg.war/WEB-INF/lib
ディレクトリにfilter-demo.jar
ファイルをコピーします。
Community-Gadgets Webアプリケーションがカスタム・フィルタを検出できるようにするには、cg.war/WEB-INF/classes
ディレクトリにあるcos_word_filters.xml
構成ファイルにこのフィルタをプラグインします。
<?xml version="1.0" encoding="UTF-8" ?> <word-filters> <word-filter className="com.fatwire.cos.records.moderation.filter.DefaultWordFilter" /> </word-filters>
デフォルトのワード・フィルタを置き換えます。管理環境と本番環境の両方で、cos word filters.xml
ファイルから既存の<word-filter/>
エレメントを削除し、作成したクラスへの参照が含まれる新しいエレメントを追加します。新しいcos word filters.xml
ファイルの内容は次のようになります。
<?xml version="1.0" encoding="UTF-8" ?> <word-filters> <word-filter className="cos.demo.DemoFilter"/> </word-filters>
管理システムと本番システムの両方で、Community-Gadgetsサーバーを再起動します。
自動ワード・フィルタリングを有効にするには、Communityインタフェースにアクセスし、「設定」→「モデレート」を選択し、「自動モデレート」セクションで「制限付きワードに対する自動モデレート」を選択します(図81-15)。
Webサイトで、demoという単語を含んだコメントまたはレビューを投稿します。投稿が「不適切」カテゴリに割り当てられ、パブリッシュされないことを確認します。
CAPTCHAテクノロジは、Webサイトを攻撃する可能性のある自動スパム・システムのロボットを特定するのに役立ちます。Community-Gadgetsには、CAPTCHAのカスタム実装用のプラグイン・モデルが備わっています。
この項では、単純なCAPTCHAジェネレータを作成し、それをCommunity-Gadgetsにプラグインする方法について説明します。この手順は、カスタム・ワード・フィルタの作成手順と似ています。CAPTCHAジェネレータを作成するには、必要なインタフェースを実装する新しいクラスを作成し、このクラスをコンパイルしてJARファイルとしてパッケージ化し、Community-Gadgetsサーバーにデプロイします。
IDEで新規Javaプロジェクトdemo-captchaを作成します。
プロジェクトのクラスパスに、プロジェクト用のJARライブラリを追加します。必要なJARは、Community Webアプリケーションのディレクトリからコピーできます(cg.war/WEB-INF/lib/cos-api-11.1.1.8.0.jar
にある)。
cos-api-11.1.1.8.0.jar
ファイルから、実装対象のインタフェースcom.fatwire.cos.captcha.CaptchaGenerator
を抽出します。例81-3に、このインタフェースの内容を示します。
例81-3 com.fatwire.cos.captcha.CaptchaGeneratorインタフェース
package com.fatwire.cos.captcha; /** * The interface that needs to be implemented when * creating plug-in that generates CAPTCHA to be shown to * visitors when UGC is submitted. * * It's a factory that generates complex Captcha objects that are managed * by Community-Gadgets Server and utilized when CAPTCHA is rendered for visitors * and when it's validated on content submission * * @author alex * * Oct 17, 2011 */ public interface CaptchaGenerator { /** * Factory method that creates a new captcha object * that consists of challenge text * and challenge image to shown to visitors * @return */ public Captcha generate(); }
demo-captchaプロジェクト内に、cos.demo.DemoGenerator
という名前の新規Javaクラスを作成します(例81-4)。
CaptchaGenerator
インタフェースを実装します。
例81-5に示すように、generate
メソッドを実装します。
最初にチャレンジ・テキストを生成してから、生成されたテキストを表示するイメージを作成します。テキストとイメージの準備が整ったら、CaptchaFactory
クラスを利用して、それらをCaptchaオブジェクトにパッケージします。Captchaオブジェクトのカスタム実装を作成するかわりに、このファクトリを使用することを強くお薦めします。これは、ファクトリによって構築されているCaptchaオブジェクトがすでにシリアライズ可能で、クラスタ・メンバー間で安全に共有できるからです。カスタム実装を作成することを選択した場合は、Captchaオブジェクトをシリアライズ可能にしてください。
例81-5 generateメソッド
package cos.demo; import com.fatwire.cos.captcha.Captcha; import com.fatwire.cos.captcha.CaptchaFactory; import com.fatwire.cos.captcha.CaptchaGenerator; public class DemoGenerator implements CaptchaGenerator { @Override public Captcha generate() { String challenge = "foo_bar";// Add generation byte[] image = generateImage(challenge); // Generate image return CaptchaFactory.create(challenge, image); } }
コンパイルしたクラスをcaptcha-demo.jar
というJARファイルにパッケージ化します。
Community-Gadgetsのクラス・ローダーがこのジェネレータを利用できるようにするには、管理環境と本番環境の両方のcg.war/WEB-INF/lib
ディレクトリにcaptcha-demo.jar
ファイルをコピーします。
Community-Gadgetsがジェネレータを検出できるようにするには、ジェネレータを構成ファイルにプラグインします。cg.war/WEB-INF/classes
ディレクトリ内に、次の内容のcos_captcha.xml
ファイルを作成します。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <captcha-generator className="cos.demo.DemoGenerator"/>
管理システムと本番システムの両方で、Community-Gadgetsサーバーを再起動します。
コメントでCAPTCHAを有効にするには、Communityインタフェースにアクセスし、「コメント」→「構成」→「権限」を選択し、「コメントできるユーザー」セクションで「ユーザーは検証コードを入力する必要がある」を選択します(図81-16)。
前述の手順を繰り返して、レビューでもCAPTCHAを有効にします。
「コメント」ウィジェットまたは「レビュー」ウィジェットを、ログイン・バーのサポートありでデプロイします。
CAPTCHAチャレンジのフィールドが表示され、CAPTCHAの画像がレンダリングされることを確認するには、Webサイトの「登録」リンクをクリックします。また、コメントまたはレビューをゲストとして投稿してみます。フォーム内にCAPTCHAが表示されます。
管理者はCSSファイルを使用して、ダッシュボード内の既存のテーマを変更できます。
ダッシュボード・テーマをカスタマイズするには:
Gadgetsインタフェースを開きます。
「設定」メニューから「外観設定」を選択します(図81-17)。
「外観設定」ページの「一般」セクションで、「カスタムCSSのアップロード」フィールドの隣にある「現在のCSSのダウンロード」リンクをクリックし、gadgets_dashboard.css
ファイルを自分のコンピュータに保存します。
このダウンロードしたCSSファイル内のダッシュボード・テーマのCSSスタイルを変更します。たとえば、Blueテーマを変更するには、次の行を見つけ、必要に応じてそれらを変更します。
共通のダッシュボード背景色:
.gas.gas_blue{ background-color: #d7e9f2; }
ガジェットのヘッダーの左、右およびコンテンツの画像:
.gas.gas_blue .gas_gadgetHeader_left { background-image: url(../../admin-gadgets/images/BlueLeftTop.png); } .gas.gas_blue .gas_gadgetHeader_right { background-image: url(../../admin-gadgets/images/BlueTopRight.png); } .gas.gas_blue .gas_gadgetHeader { background-image: url(../../admin-gadgets/images/BlueStrip.png); }
ガジェットのヘッダーのアクションの背景:
.gas.gas_blue .gas_gadgetActions { background-image: url(../../admin-gadgets/images/BlueStrip.png); }
ガジェットのヘッダーのアクション・ボタン:
.gas.gas_blue .gas_gadgetHeader_content a.gas_close { background-image: url(../../admin-gadgets/images/BlueDeleteOff.png); } .gas.gas_blue .gas_gadgetHeader_content a.gas_expand { background-image: url(../../admin-gadgets/images/BlueWSOpenOff.png); } .gas.gas_blue .gas_gadgetHeader_content a.gas_collapse { background-image: url(../../admin-gadgets/images/BlueWSCollapsedOff.png); } User toolbar collors (gadget settings) .gas.gas_blue .gas_UserPrefs_content { background-color: #d7e9f2; color: #ffffff; }
パネル・テーマのアイコン:
.gas .gas_setup .gas_setupIcon_theme_blue { background-image: url(../../admin-gadgets/images/gasThemeBlue.png); } * html .gas .gas_setup .gas_setupIcon_theme_blue { background-image: url(../../admin-gadgets/images/gasThemeBlue.gif); }
変更したファイルを保存します。
「スキン」ドロップダウン・リストから「カスタム」を選択します。
これにより、カスタマイズしたgadgets_dashboard.css
ファイルをアップロードするためのフィールドが有効になります(図81-17を参照)。
「カスタムCSSのアップロード」フィールドの隣にある「参照」をクリックします。
「ファイルのアップロード」ダイアログ・ボックスで、変更したgadgets_dashboard.css
ファイルを選択し、「開く」をクリックします。
「外観設定」ページで、「保存」をクリックします。
Community-Gadgetsでは、すべてのイベントはCoSEvent
クラスから継承されます。顧客監視で使用されるイベントの例として、CommentEvent
、ReviewEvent
、RatingEvent
およびExternalAuthEvent
があります。
すべてのイベントには、メジャー・タイプとマイナー・タイプがあります。これらのタイプはイベントを特定するのに役立ちます。メジャー・タイプは、各イベントが属するシステムの部分を表します。これは、CoSEventMajorType
によって表されます。可能な値は、ALL
、COMMENT
、REVIEW
およびRATING
です。ALL
は、すべての可能なメジャー・タイプを指します。
イベント・マイナー・タイプは実行されたアクションを示し、CoSEventMinorType
でイベントが表示されます。指定可能な値は、ALL
、CREATED
、MODIFIED
、DELETED
およびREPORTED
です。REPORTED
は、コメントおよびレビューにフラグが付くと表示されます。ALL
は、すべての可能なマイナー・タイプを指しています。
イベントは、リスナーによって処理されます。すべてのリスナーは、CoSEventListener
クラスから継承されます。リスナーは、どのイベント(たとえば、CommentEvent
またはReviewEvent
)を処理するかを知っている必要があります。
この項の内容は、次のとおりです。
すべてのイベント・エンティティの親クラスはCoSEvent
です。完全なクラス名は、com.fatwire.cos.events.CoSEvent
です。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jar
ライブラリにあります。
この項の内容は、次のとおりです。
CommunityEventエンティティは、コメントの作成、変更および削除で使用されます。フル・クラス名はcom.fatwire.cos.records.events.CommentEvent
です。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jar
ライブラリにあります。
サポートされるメジャー・タイプ: ALL
、COMMENT
サポートされるマイナー・タイプ: ALL
、CREATED
、MODIFIED
、DELETED
、REPORTED
表81-18 CommunityEventのメソッド
メソッド宣言 | メソッド定義 |
---|---|
|
CommentsFeedオブジェクトへのリンク |
|
イベントが発生したサイトの名前 |
|
モデレーションの状態を示します。可能な値:
|
ReviewEventエンティティは、レビューの作成、変更および削除で発生します。フル・クラス名はcom.fatwire.cos.records.events.ReviewEvent
です。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jar
ライブラリにあります。
サポートされるメジャー・タイプ: ALL
、COMMENT
サポートされるマイナー・タイプ: ALL
、CREATED
、MODIFIED
、DELETED
、REPORTED
表81-19 ReviewEventのメソッド
メソッド宣言 | メソッド定義 |
---|---|
|
ReviewsFeedオブジェクトへのリンク |
|
イベントが発生したサイトの名前 |
|
モデレーションの状態を示します。可能な値:
|
RatingEventエンティティは、評価の作成および削除で発生します。フル・クラス名はcom.fatwire.cos.records.events.RatingEvent
です。このクラスは、cg.war/WEB-INF/libs/cos-shared-11.1.1.8.0.jar
ライブラリにあります。
サポートされるメジャー・タイプ: ALL
、RATING
サポートされるマイナー・タイプ: ALL
、CREATED
、DELETED
ExternalAuthEventエンティティは、外部の認証プロバイダによって正常に認証された場合に発生します。フル・クラス名はcom.fatwire.cos.events.api.ExternalAuthEvent
です。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jar
ライブラリにあります。
サポートされるメジャー・タイプ: ALL
サポートされるマイナー・タイプ: ALL
イベントのリスナーは、すべてのイベントのリスニングおよびアクティビティのログ記録で使用されます。すべてのリスナーは、CoSEventListener
クラスから継承されます。リスナーは、どのイベント(たとえば、CommentEvent
またはReviewEvent
)を処理するかを知っている必要があります。
フル・クラス名はcom.fatwire.cos.events.CoSEventListener
です。このクラスは、cg.war/WEB-INF/libs/cos-api-11.1.1.8.0.jar
ライブラリにあります。
この項の内容は、次のとおりです。
この例では、すべてのイベントのログを記録するリスナーの作成方法を示します。cos-api-11.1.1.8.0.jar
ライブラリが必要です。
単純なリスナーを作成するには
抽象クラスCoSEventListener
を拡張して、SampleListener
クラスを作成します。
public class SampleListener extends com.fatwire.cos.events.CoSEventListener
リスナーが記録するメジャー・タイプとマイナー・タイプを選択し(この例ではALL
)、クラスのコンストラクタでそれらのタイプを設定します。
public SampleListener () { setMajorType(CoSEventMajorType.ALL); setMinorType(CoSEventMinorType.ALL); }
void process (CoSEvent event)
およびint getTaskCount()
という、2つの関数を実装します。これらは親の抽象クラスでは実装されていません。
private final static Logger LOG = Logger.getLogger(SampleListener.class); private AtomicInteger counter = new AtomicInteger(); @Override public void process(CoSEvent event) { counter.incrementAndGet(); try{ LOG.info("Process event: " + event.getClass() + ": " + event); } finally { counter.decrementAndGet(); } } @Override public int getTaskCount(){ return counter.get(); }
完了すると、完全なクラス・ファイルは次のようになります。
package com.example.listeners; import java.util.concurrent.atomic.AtomicInteger; import org.apache.log4j.Logger; import com.fatwire.cos.events.CoSEvent; import com.fatwire.cos.events.CoSEventListener; import com.fatwire.cos.events.CoSEventMajorType import com.fatwire.cos.events.CoSEventMinorType public class SampleListener extends CoSEventListener { private final static Logger LOG = Logger.getLogger(SampleListener.class); private AtomicInteger counter = new AtomicInteger(); public SampleListener () { setMajorType(CoSEventMajorType.ALL ); setMinorType(CoSEventMinorType.ALL ); } @Override public void process(CoSEvent event) { counter.incrementAndGet(); try{ LOG.info("Process event: " + event.getClass() + ": " + event); } finally { counter.decrementAndGet(); } } @Override public int getTaskCount(){ return counter.get(); } }
Community-Gadgetsの構成にこのリスナーを追加します。
cg.war/WEB-INF/classes
フォルダにあるlisteners.xml
ファイルを開き、リスナー・クラスのBeanを追加します。
<bean id="sampleListener" class="com.example.listeners.SampleListener" />
processメソッドは、イベントのタイプがALL
に設定されている場合にイベントをフィルタリングできます。
@Override public void process(CoSEvent event) { if(event instanceof CommentEvent) { sendCommentNotification(event); } else if (event instanceof ReviewEvent) { sendReviewsNotification(event); } }
このリスナーは、アドレスまたはアドレス・グループに対して通知テキスト付きのMIME電子メールを送信できます。そのための1つの方法として、JavaMail APIを使用した送信機能の開発があります。また、Community-Gadgetsの電子メール機能を使用すると、クラス・ファイル(クラスパスにcos-core-11.1.1.8.0.jar
が必要)内に2行のコードを追加することによって電子メールの送信が可能になります。
... import com.fatwire.cos.core.CoS; ... CoS.instance().getEmailFacility().send(mimeMessage); ...
mimeMessage
を生成するには、次のようなコードが使用されます。
private MimeMessage generateEmail(CoSEvent event, String emails) throws AddressException, MessagingException { Session session = null; MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("noreply@samplenotify.example.com")); msg.setSentDate(new java.util.Date()); msg.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(emails)); msg.setSubject("==Notification subject=="); Multipart multipart = new MimeMultipart("alternative"); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent("<SOME NOTIFY TEXT>", "text/plain;charset=\"UTF-8\""); multipart.addBodyPart(messageBodyPart); msg.setContent(multipart); msg.saveChanges(); return msg; }
注意: メッセージ本文の内容を生成するには、Velocityライブラリや他のテンプレート・エンジンを使用できます。前述の |
リスナーの作成が完了すると、完全なクラス・ファイルは次の例のようになります。このクラス・ファイルは、cos-api-11.1.1.8.0.jar
、cos-core-11.1.1.8.0.jar
およびcos-shared-11.1.1.8.0.jar
を必要とします。
package com.fatwire.cos.shared; import java.util.concurrent.atomic.AtomicInteger; import javax.mail.BodyPart; import javax.mail.MessagingException; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.internet.AddressException; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import com.fatwire.cos.core.CoS; import com.fatwire.cos.events.CoSEvent; import com.fatwire.cos.events.CoSEventListener; import com.fatwire.cos.events.CoSEventMajorType; import com.fatwire.cos.events.CoSEventMinorType; import com.fatwire.cos.records.events.CommentEvent; import com.fatwire.cos.records.events.ReviewEvent; public class NotificationListener extends CoSEventListener { private AtomicInteger counter = new AtomicInteger(); public NotificationListener () { setMajorType(CoSEventMajorType.ALL ); setMinorType(CoSEventMinorType.ALL ); } @Override public void process(CoSEvent event) { counter.incrementAndGet(); try { if(event instanceof CommentEvent) { sendCommentNotification((CommentEvent)event); } else if (event instanceof ReviewEvent) { sendReviewsNotification((ReviewEvent)event); } } finally { counter.decrementAndGet(); } } @Override public int getTaskCount() { return 0; } private void sendCommentNotification(CommentEvent event) { MimeMessage mimeMessage = null; String site = event.getSiteId(); try { mimeMessage = generateEmail(event, site , "moderator_comments@samplenotify.example.com"); } catch (Throwable e) { e.printStackTrace(); } sendEmail(mimeMessage); } private void sendReviewsNotification(ReviewEvent event) { // send notification only for creating review event if (event.getMinorType().equals(CoSEventMinorType.CREATED)) { MimeMessage mimeMessage = null; String site = event.getSiteId(); try { mimeMessage = generateEmail(event, site, "moderator_reviews@samplenotify.example.com"); } catch (Throwable e) { e.printStackTrace(); } sendEmail(mimeMessage); } } private void sendEmail(MimeMessage mimeMessage) { CoS.instance().getEmailFacility().send(mimeMessage); } private MimeMessage generateEmail(CoSEvent event, String site, String emails) throws AddressException, MessagingException { Session session = null; MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress("noreply@samplenotify.example.com")); msg.setSentDate(new java.util.Date()); msg.setRecipients(javax.mail.Message.RecipientType.TO, InternetAddress.parse(emails)); msg.setSubject("==Notification subject== from " + site + " site"); Multipart multipart = new MimeMultipart("alternative"); BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setContent("<SOME NOTIFY TEXT>", "text/plain;charset=\"UTF-8\""); multipart.addBodyPart(messageBodyPart); msg.setContent(multipart); msg.saveChanges(); return msg; } }
ファイルを作成したら、次のBeanをlistentes.xml
に追加します。
<bean id="sampleListener" class="com.example.listeners.NotificationListener" />