2009年12月28日月曜日

cakePHPでDBからjson経由でデータ更新

MySQLのデータベースにあるcurrentvaluesテーブルのnameとstatusフィールドを読み出して、idがnameのところをimageタグで書き換えることにより、状態を表示する処理です。
現状はremoteTimerで3秒毎に更新しています。

◇controllersの記述
debugモードを0にしないと不要なメッセージが付加されてdecode出来なくなるので、一時的にdebugモードを変更するところがミソですね。
function getAjax() {
 $this->autoRender = false;
 $this->uses = 'currentvalue';
 $this->layout = 'ajax';
 Configure::write('debug',0);

 $data = $this->currentvalue->find('all');
 echo json_encode($data);
}
◇viewsの記述(prototype.js使用)
OnCompleteでレスポンスを解析するのですが、firebugで確認するまでJSONデータにテーブル名が付加されるとは思っていなかったので、嵌ってしまいました。
function response_json(request,json) {
 var str = request.responseText;
 var obj = str.evalJSON();
 for ( var i = 0; i < obj.length; i++) {
  if ( eval(obj[i].currentvalue.status)) {
   $(obj[i].currentvalue.name).innerHTML = "<img src='../images/green.gif' />";
  } else {
   $(obj[i].currentvalue.name).innerHTML = "<mg src='../images/red.gif' />";
  }
 }
}

<?php echo $ajax->remoteTimer(array(
 'url' => 'getAjax',
 'update' => null,
 'complete' => 'response_json(request,json);',
 'frequency' => 3));
?>

但し、リアルタイムな更新が必要な瞬時値の受け渡しについて、データ収集処理とWEBサーバー間をデータベース経由にするとデータベースのアクセス頻度が高くなるので、メモリ渡しかオンメモリデータベースでインプリメントすべきですね

0 件のコメント:

コメントを投稿