このエントリーが役に立ったらシェアをお願いします!

[CakePHP]CakePHPでjQueryのAjaxを使う方法

このエントリーが役に立ったらシェアをお願いします!

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を使った時はハマりました。。。

スポンサーリンク

このエントリーが役に立ったらシェアをお願いします!

1この記事を書いた人
ShoheiTai
フロントエンド志向のWebエンジニア。
HTML5やWeb高速化、SEO等のフロントエンド開発が大好物。
バックエンドではCakePHP,Wordpress開発を主戦場としています。
Web開発のスパイスファクトリー株式会社創業メンバー。

[CakePHP]CakePHPでjQueryのAjaxを使う方法
イケてないコード - Webエンジニアのブログの
最新情報をいいねしてチェックしよう!