PHPフレームワークのCakePHPでwebアプリを作成しているんですがわからないことがあるので質問させてください。

AJAXの機能を取り入れて簡易的なチャットを作っているんですが $ajax->remoteTimer() のヘルパーで一定時間ごとにコントローラーのメソッドにアクセスしているんですがこのときにGETパラメータとして1つのページのコメントのカウント数を送信して、データベースのそのページのコメント数とを比較してGETの値が上回っていたらAJAXでコメント欄を更新しています。
この時に更新が確認できない場合処理を中断したいのですが、フレームワークが自動でViewテンプレートに書き出してしまうのを何とかできないかと悩んでいます。ただ処理を中断したいだけです。
フレームワークの内部を変更しないといけないでしょうか?または他にいい方法はあるでしょうか?どなたか詳しい方、助言をお願いします。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/02/27 08:01:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:medusajap No.1

回答回数13ベストアンサー獲得回数0

ポイント23pt

if文で分岐してるのであれば、

get_now = 現在のコメント数
get_ex = 既存のコメント数 // dbからカウントしたコメント数
if (get_now > get_ex) {
     Viewテンプレートに書き出し()
} elseif (get_now == get_ex) {
     die() // または何もしない
} else {
     echo "例外処理"
}

こんなで。

フレームワークの中で処理したいなら、そのメソッドに引数を追加してget_nowを渡し、上の処理を追加してやれば良いかと。

Cake使ってないので詳細は分かりませんが、参考になればと。

id:jinchangz

回答ありがとうございます。

なるほどdie()関数というのがありましたねw

die()関数はエラー処理するものと思ってました。

調べてみると他にも exit()関数とか使えそうですね

2008/02/25 16:54:46
id:medusajap No.2

回答回数13ベストアンサー獲得回数0

ポイント22pt

die()はexit()のエイリアスですから、どちらを使っても同じ処理が行われます。

スクリプトはその場で終了してしまうので、それ以降の処理に気をつけて下さい。

id:jinchangz

問題が発生して嵌ってしまいました。

どうもアクションメソッドをdie()関数で終了させても

ビューテンプレートは更新をやめてくれないみたいです。

う~ん・・・困った。

2008/02/26 23:56:14
id:t_shiono No.3

回答回数256ベストアンサー獲得回数22

ポイント23pt

未読の回答と重なったらすいません。

CakePHPでのビューの作成は、Controllerのアクションが実行された後に、Viewクラスが処理を行います。

そのため、ビューとして何も表示させたくない(Ajaxでの呼び出しの結果を空とする)には、次の2つの方法があります。

1.アクションの途中で処理を打ち切る

medusajapさんの方法です。

個人的にはいつもは、exit()を利用しますが、die()でもよいと思います。

多くの場合はこちらでも問題ないと思います。

こちらで問題が生じるとすると、afterRenderなどで何らかの終了処理をさせている場合は、不都合生じる可能性はありますので、次の方法を採用してください。

2.空のレスポンスを返す

layoutとテンプレートを空にしてしまいます。

具体的には、コントローラの更新がなかった場合の処理で、

$this->layout = null;
$this->render('empty');
return;

などとしておけばよいです。

この上で、app/views/XXXXXX/empty.ctp (1.1系列なら app/views/XXXXXX/empty.thtml)として、空っぽのファイルを置いておけば、レスポンスは空になります。


何かの参考になれば。

id:jinchangz

上の2つの方法だとレスポンスが空になるのはわかるんですが

$ajax->remoteTimer() ヘルパーのオプションでupdateに更新する要素のidを

指定してるので(例えばid="comment")ここが空の値になってしまいます。

javascriptを自作しないと駄目そうかも・・・

2008/02/27 00:24:23
id:t_shiono No.4

回答回数256ベストアンサー獲得回数22

ポイント22pt

処理を勘違いしていました。すいません。

未確認ですが、こんなのはいかがでしょう?

制御をできるだけCakePHP側でやるか、JavaScript側でやるかで2種類方法があるかと思います。

JavaScript側でやるのであれば、次のような感じで、Ajax.UpdaterのonCompleteを書き換えて、もし更新した結果を返してきたら、updateContentを呼び出し内容を更新するという感じです。

動作未確認なので、あくまでイメージです。

<?php
echo $ajax->remoteTimer(
        array('requestHeaders' => array("onComplete: function(response, param) {if (更新あり?) { this.updateContent(); }")));
?>

なるべくCakePHP側でやる方法ですが、CakePHP側でやるといっても、最終的にはprototype.jsが動くので、その仕様の範囲でしかできません。そこで、evalScriptをONにしておき、ビューが返す内容に処理を埋め込んでおくということも可能かと思います。


いかにHelperで抽象化されていたとしても、中身はprototype.jsのラッパーなので、その仕組みから考えないといけないですね。

id:jinchangz

回答ありがとうございます。

javascriptについては勉強不足でしていろいろ試行錯誤しながら

上記の方法を参考にしてやってみたいと思います。

ありがとうございました。

2008/02/27 08:00:04

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません