Message

Message モジュールを使って、サイト上の様々なイベントや、ユーザーのアクション(アクティビティー)を記録、表示することができます。

ここで扱う Message はひとつのエンティティ(※1)として実装されます。ノード、ユーザー等と同様に任意のフィールドを持たせることが可能で、用途ごとにメッセージタイプとしてバンドル(※2)を構成します。このために大きな柔軟性、拡張性を持ち、様々な用途に利用できます。

たとえばSNS(ソーシャルネットワーキングサービス)のような機能を持つサイトでは、ユーザーの様々なアクション(アクティビティ)を表示する機能として使えます。具体的な例としては

  • ユーザーA がコンテンツb に投票(評価)した。
  • ユーザーB がコンテンツc にコメントした。
  • ユーザーC がブログ記事d を投稿した。
  • ユーザーA がユーザーC に投票(評価)した。
  • ユーザーC がコンテンツc にフラグを立てた。

といったものです。誰がどのコンテンツ、あるいはユーザーに対してどんなアクションをしたかを記録し、コンテンツごとに関連付けされたメッセージを表示したり、ユーザーごとにプロフィールページにその人のこれまでのアクティビティーを表示したりすることも出来ます。Views に対応しているので、一覧表示を作る際の条件の設定も簡単です。

この他に ECサイトの構築では、ユーザー毎、または商品ごとの注文履歴の管理にも使えるでしょう。また一般的なウェブサイトでは、トップページにシステム化された新着情報のブロックを置きたい場合にも使えると思います。

ログを記録するという意味では、Drupal コアの Database logging モジュールが提供するものがありますが、これはサイトの状態を監視するという明確な目的のためのもので、それ以外で使用するような汎用性、拡張性はありません。「ユーザーのアクティビティログを表示したい」といったように、自由に様々な目的のために簡単に設定でき、管理しようとすると、ノードでもない、コメントでもない、ユーザーでもない独立した新たなエンティティとして実装することは正しい(※3)と思います。またこれは独自にテーブルを作成し、独自にコードを追加する形で実装するよりもはるかに簡単です。

使い方

Message モジュールと、これに必要な Entity API モジュールをインストールしてください。
また、TokenEntity TokensEntity ReferenceChaos Tools がまだインストールしていない場合は、
これらのモジュールもインストールしておきます。

管理画面の「サイト構築」(/admin/structure)にアクセスすると、Message types のリンクがあるのでクリック。

メッセージタイプの管理画面です。Add message type のリンクをクリック。

システム内部名称に「create_node」、説明に「nodeの新規投稿」と入力します。メッセージテキストには「記事を投稿しました。」と入力して、ひとまず保存します。

次に、今作成した「ノードの新規投稿」メッセージタイプの「フィールドの管理」をクリック。

図のように、「ノード参照」(フィールドタイプは Entity Reference)と「掲載」(フィールドタイプは真偽値)のフィールドを追加します。追加したら再び編集画面に戻ります。

今追加した「ノード参照」フィールドのノードタイトルのトークンが指定できるようになっているので、メッセージテキストに挿入します。メッセージテキストを『記事「[message:field-node-ref:title]」を投稿しました。』のように編集すると、表示の際 [message:field-node-ref:title] の部分が実際のノードタイトルに置き換えられます。

これで「ノードの新規投稿」メッセージタイプの設定は完了ですので、次にこれを、実際にノードが新規投稿されたときに連動して作成されるようにします。カスタムモジュールに以下のコードを追加してください。

/**
 * hook_node_insert() の実装
 */
function custom_node_insert($node) {
  // 「ノードの新規投稿」メッセージの作成
  // カレントユーザーとノードの投稿者が別の場合もあるので、'uid'にノードのuidを指定しておく。
  $message = message_create('create_node', array('uid' => $node->uid));
  // 「ノード参照」フィールド、および「掲載」フィールドをセットする。
  $wrapper = entity_metadata_wrapper('message', $message);
  $wrapper->field_node_ref->set($node);
  $wrapper->field_published->set($node->status);
  $wrapper->save();
}

hook_node_insert() はノードが新規投稿されデータベースに格納された直後にコールされますので、ここでメッセージを追加するように記述すれば、連動して処理されます。(※ コードの記述についてはこちらの記事も参考になると思います。また、コードを一切記述することなく、Rules モジュールを使用してメッセージを生成する方法もあります。)

ノードを投稿した後、メッセージ一覧のページ(/admin/content/message)にアクセスすると、メッセージが追加されているのが確認出来ると思います。

実はこのページも Views で作成されています。このビューの設定を参考にして、様々なメッセージ(ログ)の一覧をいろいろな場所で表示することが出来ます。

ユーザーで絞り込み、ユーザープロフィールページでアクティビティーログを表示させたところです。 「ノードの新規投稿」のほか、同じ要領で「コンテンツの評価」(追加でファイブスターモジュールを使用)、「コメントの投稿」、ユーザープロフィールの更新」のメッセージタイプを追加しています。


※1: Drupal のノード、コメント、ユーザーのような「実体」を表す概念

※2: あるエンティティについて、いくつかの種類に分け、それぞれ別々にフィールドを設定することが出来ます。Drupal ではこれをバンドルと呼びます。

※3: Drupal流の正攻法といいますか。まさに独自のエンティティを追加するというのは、こういうことなのでしょう。

コア: 
Drupal7