記事更新チェック用のクライアントソフトの開発

Events happening in the community are now at Drupal community events on www.drupal.org.
wataru.kato's picture

現在Drupal7.22をWinサーバに導入し、社内情報共有サイトを構築中です。

サイトの利用率を上げる為に、利用者のPCから定期的に最新記事の有無を探して、見つけたら告知してくれるWindowsクライアントソフトの開発を検討しています。

デフォルトでXML-RPCが使えることが判りましたが、listMethodsで呼び出せる数個のメソッド以上は無いようです。

私が今回欲しい機能は、

・指定コンテンツタイプに対して
・前回チェック時から、新たに更新されたコンテンツの有無をチェック
・見つかれば、指定上限個のコンテンツ内容をXMLで返す

という感じで、これを実現するには地道に自分で sites/all/modules/custom の下にモジュールを追加する方法しかないでしょうか。

何かモジュール一発でそれなりの機能が使えるようになって欲しいのですが、配布元の検索でもよくわかりませんでした。

申し訳ありませんが、入り口のヒントだけでも結構ですので、お知恵をお貸しください。

Comments

blauerberg's picture

簡単に実現できそうなモジュールが見つからなかったので実現方法だけ。

historyテーブルにuser id, node id, timestampが格納されていますので、これとnodeかnode_revisionをテーブルをjoinすればデータは取得出来ます。

あとは、適当なURLに対するCALLBACKをモジュールで登録し、上記で取得したデータをxmlで返せば実現できそうです。コンテンツタイプ、前回のチェック時間、個数等はURLでパラメータとして渡せば良いと思います。

調査ありがとうございます

wataru.kato's picture

やはりCALLBACKモジュールを作る方向ですか。
勉強がてら、試してみたいと思います。

historyテーブルをベースにデータ取得する方針、参考情報ありがとうございます。

脱線ですが、ためしにViewsで確認用の一覧が作れないか試してみました。
が、historyの情報はFIELDSでもリレーションシップでも追加できないようで、あきらめました。

・・・などと調べているうちに、Viewsだと

Updated/commented date

を表示できるのを思い出しました。
この条件で更新コンテンツを絞り込めるのが理想ですね。

だたそうすると、内部のテーブル名で考えると、

node > field_data_body

node > node_comment_statistics > field_data_comment_body

とを順番に呼び出して戻り値にすることになる?

node と node_comment_statistics に 更新日付らしきタイムスタンプがあるので、
historyを使わなくてもこれで結果が得られるのでしょうか?

historyからやるべきか、若干迷っております。
historyだけのほうが、シンプルそうですけど。

なんとなくできました

wataru.kato's picture

書籍やDrupal APIを眺めながらモジュールを自作し、なんとか結果を取得できるようになりました。
書籍で情報を探すとDrupal6ベースのコードで db_query と db_result で取得する例ばかりでした。
でもテストすると db_result で毎回失敗。
変だなあとAPIを検索すると、今回使っているDrupal7では既に db_result が無いようで、
db_select で取得するのが正しいようですね。

selectQueryクラスはずいぶん大掛かりですね・・・

以下関数部分だけ参考までに公開してみます。

// XML-RPCのメソッドを追加
function (モジュール名)_xmlrpc() {
  $methods['(モジュール名).getActivities'] = 'xmls_getactivities';
  $methods['(モジュール名).getContents'] = 'xmls_getcontents';
  return $methods;
}

// 直近10件の更新ノードのノード情報を取得
function xmls_getactivities() {
  $query = db_select('node', 'n');
  $query->leftJoin('node_comment_statistics', 's', 'n.nid = s.nid');
  $query->fields('n',array('nid','type','changed'))
    ->fields('s',array('cid','last_comment_timestamp'))
    ->orderBy('n.changed', 'DESC')
    ->orderBy('s.last_comment_timestamp', 'DESC')
    ->range(0,10);
  $result = $query->execute();
  $rows = array();
  while ($row = $result->fetchAssoc()) {
    $rows[] = $row;
  }
  return $rows;
}

// 指定ノードIDの投稿者、タイトル、本文、最新コメント投稿者、最新コメント本文、を取得
function xmls_getcontents($nid) {
  $query = db_select('node', 'n');
  $query->leftJoin('field_data_field_realname', 'r', 'n.uid = r.entity_id');
  $query->leftJoin('field_data_body', 'b', 'n.nid = b.entity_id');
  $query->leftJoin('node_comment_statistics', 's', 'n.nid = s.nid');
  $query->leftJoin('field_data_field_realname', 'cr', 's.last_comment_uid = cr.entity_id');
  $query->leftJoin('field_data_comment_body', 'c', 's.cid = c.entity_id');
  $query->fields('n',array('nid','title'))
    ->condition('n.nid',$nid,'=')
    ->fields('r',array('field_realname_value'))
    ->fields('b',array('body_value'))
    ->fields('s',array('cid'))
    ->fields('cr',array('field_realname_value'))
    ->fields('c',array('comment_body_value'));
  $result = $query->execute();
  $rows = array();
  while ($row = $result->fetchAssoc()) {
    $rows[] = $row;
  }
  return $rows;
}

未検証品ですが。

Seiji's picture

http://drupal.org/project/nodeviewcount

試していませんが、機能説明的にはこれで済みそうです。

情報有難う御座います。

wataru.kato's picture

いったん私なりの仮実装モジュールができていますが、アプローチが違うかもしれませんのであとでテストさせていただきます。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds: