CakePHPでAjaxを使う方法をご紹介していきます。
Ajax処理を書くとき、CakePHPでは色々な手法があるので簡単にまとめていきます。
また、下記の記事でも改めて解説していますので御覧ください。
CakePHPでJSONを返すAPIを作る
初めてCakePHPでajaxを使った時にMissingViewでハマり、
CakePHP×Ajaxを解説しているサイトが見当たらず苦戦した思い出があります。
非常に便利なAjaxですが、CakePHPで使用する場合はAction側で一手間加えてやる必要があるのです。
ということで今回はCakePHPでAjaxを使う方法について解説します。
注:
CakePHPにはAjaxHelper(JsHelper)が用意されていますが、今回は使いません。
というのも、個人的に使い勝手があまり良くない印象があるので。
(そもそもjavascriptはjsファイルにまとめてしまいたい。)
ajaxの準備をする
まずはjavascript。
function ajaxMethod() {
$.ajax({
url: "/CakeProj/Test/ajaxTest",
type: "POST",
data: { name : "tanaka" },
dataType: "text",
success : function(response){
//通信成功時の処理
alert(response);
},
error: function(){
//通信失敗時の処理
alert('通信失敗');
}
});
}jsファイルじゃなくてヘッダータグにscriptを書く人は
是非HtmlHelperのurl関数を使ってください。動作環境に合ったURLを出力してくれます。
echo $this->Html->url(array('controller' =>'Test','action' => 'ajaxTest'));次にHtml。シンプルに。
<button onclick="ajaxMethod();">ajaxTest</button>
手抜きでonclick属性使ってみたけど非推奨?
知っている方がいればご教示くださいm(__)m
基本的にHTML上で書くのは好ましくないみたいです。
HTMLは構造だけを示すので、こういうイベントとかはjsに分離したほうがいいとのこと。
仕上げにCakePHPのアクション側。
class TestController extends AppController {
function index() {
//初期表示処理
}
/**
* Ajax用関数
*/
function ajaxTest() {
$this->autoRender = FALSE;
if($this->request->is('ajax')) {
return $this->data['name']."さん、こんにちは"; //echoでもOK
}
}
}ポイントがこのajaxTestアクション。
$this->request->is(‘ajax’);でAjaxによる通信かどうかを判定します。
アドレス直打ちでアクセスされるとあまりよろしくないので、Ajax判定は極力行いましょう。
そして一番大事なのが10行目の$this->autoRenderという変数。
これはCakePHPのレンダー機能を無効化することができます。
どういうことかというと、CakePHPではアクション名と紐づくViewのctpファイルを自動で出力(レンダー)します。
この機能が有効化のままだと、処理がアクション関数を通った後にアクション名「ajax_test.ctp」を探しに行ってしまい、MissingViewが返ってきます。
それを防ぐため、$this->autoRender = FALSE;とすることでレンダー機能を無効化し、適切な値だけをreturnやechoで返すことができます。
CakePHPでAjaxを使う時のまとめ
- is(‘ajax’)を使ってAjax判定をする。
- autoRenderにFALSEを代入し、レンダーを無効化する。
こんな感じです。
僕はautoRenderをしっかり理解していなかったので、
始めてCakePHPでAjaxを使った時はハマりました。。。

コメント