人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

●質問者: jinchangz
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Ajax CakePHP PHP view Web
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● medusajap
●23ポイント

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

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

こんなで。

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

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

◎質問者からの返答

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

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

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

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


2 ● medusajap
●22ポイント

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

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

◎質問者からの返答

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

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

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

う?ん・・・困った。


3 ● t_shiono
●23ポイント

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

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)として、空っぽのファイルを置いておけば、レスポンスは空になります。


何かの参考になれば。

◎質問者からの返答

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

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

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

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


4 ● t_shiono
●22ポイント

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

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

制御をできるだけ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のラッパーなので、その仕組みから考えないといけないですね。

◎質問者からの返答

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ