Posted by wataru.kato on April 9, 2013 at 11:22am
現在Drupal7.22をWinサーバに導入し、社内情報共有サイトを構築中です。
サイトの利用率を上げる為に、利用者のPCから定期的に最新記事の有無を探して、見つけたら告知してくれるWindowsクライアントソフトの開発を検討しています。
デフォルトでXML-RPCが使えることが判りましたが、listMethodsで呼び出せる数個のメソッド以上は無いようです。
私が今回欲しい機能は、
・指定コンテンツタイプに対して
・前回チェック時から、新たに更新されたコンテンツの有無をチェック
・見つかれば、指定上限個のコンテンツ内容をXMLで返す
という感じで、これを実現するには地道に自分で sites/all/modules/custom の下にモジュールを追加する方法しかないでしょうか。
何かモジュール一発でそれなりの機能が使えるようになって欲しいのですが、配布元の検索でもよくわかりませんでした。
申し訳ありませんが、入り口のヒントだけでも結構ですので、お知恵をお貸しください。
Comments
簡単に実現できそうなモジュールが見つからなかったので実現方
簡単に実現できそうなモジュールが見つからなかったので実現方法だけ。
historyテーブルにuser id, node id, timestampが格納されていますので、これとnodeかnode_revisionをテーブルをjoinすればデータは取得出来ます。
あとは、適当なURLに対するCALLBACKをモジュールで登録し、上記で取得したデータをxmlで返せば実現できそうです。コンテンツタイプ、前回のチェック時間、個数等はURLでパラメータとして渡せば良いと思います。
調査ありがとうございます
やはり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だけのほうが、シンプルそうですけど。
なんとなくできました
書籍や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;
}
未検証品ですが。
http://drupal.org/project/nodeviewcount
試していませんが、機能説明的にはこれで済みそうです。
情報有難う御座います。
いったん私なりの仮実装モジュールができていますが、アプローチが違うかもしれませんのであとでテストさせていただきます。