Jsヘルパーを使用してAjax更新
更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。デモ
head
<?php // jQuery echo $this->Html->script( 'jquery.min.js', array( 'inline' => 'false')); // Jsヘルパーが生成するJSを出力させる echo $this->Js->writeBuffer( array( 'inline' => 'true')); ?>
ビュー (Views)
// App/Views/Ajaxs/js_submit_form.ctp <?php echo $this->Form->create( 'Testtable', array( 'type'=>'post')); echo $this->Form->text( 'data'); echo $this->Js->submit( 'Update', array( 'before' => $this->Js->get( '#sending-js-submit')->effect( 'fadeIn'), // => beforeSend (Local Event) 'success' => $this->Js->get( '#sending-js-submit')->effect( 'fadeOut'), // => success (Local Event) // 'error' => // => error (Local Event) // 'complete' => // => complete (Local Event) 'url' => '/js_submit', // Ajax処理で呼び出すURL(controller/action) 'update' => '#result-js-submit', // ajax更新の結果を出力する要素 )); echo $this->Form->end(); ?> <div id="sending-js-submit">updaing...</div> <div id="result-js-submit"></div>
beforeSend (Local Event)
AJAXリクエストが送信される前に呼び出されます。必要であれば、XMLHttpRequestオブジェクトを操作して追加のheaderを付与してやるなどの処理が行えます。
success (Local Event)
通信が成功した際に呼び出されます。サーバエラーやデータエラーが発生した場合には呼ばれません。
error (Local Event)
通信が失敗した際に呼び出されます。successとerrorが同じ通信で同時に呼ばれることは、決してありません。
complete (Local Event)
通信が完了した際に、成功/失敗にかかわらず呼び出されるものです。よしんば通信が非同期であっても、この関数は実行されます。
Ajax Events
コントローラ (Controllers)
// App/Controllers/AjaxsController.php <?php class AjaxsController extends AppController { var $name = 'Ajaxs'; var $uses = array( 'Testtable'); var $helpers = array( 'Js'); var $components = array( 'RequestHandler'); function js_submit_form(){} function js_submit(){ // Ajax or not // if (!$this->RequestHandler->isAjax()){ // 非推奨 if (!$this->request->is('ajax')){ $this->redirect( '/js_submit_form'); } // save OK if ($this->Testtable->save($this->data)) { $this->render( '/Elements/Ajaxs/ajaxupdated','ajax'); // save NG } else { $this->set('valerror', $this->Testtable->validationErrors); $this->render( '/Elements/Ajaxs/ajaxupdated','ajax'); } } } ?>
$this->request->is('ajax')でリクエストがAjaxかどうかを判定します。urlに'js_submit'と手入力してアクセスした場合は、'js_submit_form'へリダイレクトされます。Inspecting the request
** コントローラ内でdataに値を入れたときに"Indirect modification of overloaded property"と怒られた場合は、このへんを参照して下さい。
エレメント (Ajax処理の結果を返す)
// App/Views/Elements/Ajaxs/ajaxupdated.ctp <?php if (!empty( $valerror['data'])){ for($i=0; $i<count( $valerror['data']); $i++){ echo $valerror['data'][$i]; } } else { echo h( $this->data['Testtable']['data']); }
バリデーションエラーメッセージの取得
モデル (Models)
// App/Models/Testtable.php <?php class Testtable extends AppModel { var $name = 'Testtable'; var $useTable = 'testtables'; var $validate = array( 'data' => array( 'maxlength' => array( 'rule' => array( 'maxlength',255), 'message' => 'text is too long' ), 'notempty' => array( 'rule' => array( 'notempty'), 'message' => 'Enter text' ), ), ); } ?>
関連記事
-
CakePHP 2.x インストール
現在まで私が商用・非商用にリリースしているCakePHPアプリケーションは全て1.3.xベースで作成しています。 まだまだロードマップ的には大丈夫そうですが、お客さん向けに納品しているアプリケーショ
-
FormヘルパーのMagicOption (マジックオプション)
Formヘルパーでは、「フィールド名」,「テーブルカラムのデータ型」もしくはモデルの「バリデーション設定」によりフォーム要素を決定したり、自動で属性を付与する「マジックオプション」と呼ばれるものがある
-
FullCalendarを使用してカレンダーアプリケーション
カレンダーアプリケーションを作成するため、カレンダー表示できるプラグインを探索して出会ったFullcalendarを試してみました。シンプルに使用できる上に、オプションがかなり豊富です。ダウンロード
-
バリデーションエラーメッセージの取得
CakePHP 2.xになってバリデーションエラー時に返却されるメッセージのデータ形式が変更になったようです。1.3系では、ひとつのフィールドに対して返却されるメッセージは一つのルールのみですが、2.
-
ネストしたリストを出力「nestedList」
DBやJSONからデータを取得して、そのデータをもとにメニュー表示などネストしたリストを出力させたい場合に「nestedList」が便利です。 ヘルパーに渡すデータは連想配列である必要があります。(
-
selectボックスを実装
今まで、selectボックスのgroupを作成するのにSet::Combineを使用していましたが、意外と簡単にできることに気付いてしまったので、ご紹介。(自分だけ知らなかったことに気付いた と言った
-
ハッシュ関数の選択とハッシュ化処理
CakePHPでは、ログイン時にはpasswordを自動的にハッシュ化して認証を行ってくれますが、そのパスワードを登録する際は、明示的にハッシュ化する必要があります。 ハッシュ関数の選択 ハッ
-
HttpSocketを使用してリクエスト送信
CakePHPには、Webサービスへのリクエスト送信のためのHttpSocketクラスが用意されています。 HttpSocket get HTTP GETリクエストを発行します。デモ H
-
DebugKitを導入
定番のブログチュートリアルをこなして、定番のDebugKitを導入してみました。 2.3からはCakePHPインストール直後に以下のように導入を推奨するような警告メッセージが表示されるようになりまし
-
CakePHP インストール時エラーの対処
CakePHPインストール時に出くわすであろうエラーの原因と対処方法についてまとめてみました。前提として、WebサーバはApache、データベースはMySQLとしています。 Timezone未設
Comment
[…] CakePHP 2.x – Jsヘルパーを使用してAjax更新 […]
Jsヘルパーを使用してAjax更新 http://t.co/9hHaR0LAHs
Jsヘルパーを使用して #Ajax 更新 http://t.co/BXsKY6cUX0
#cakephp #trick876
cakephp2 ajax JSヘルパーを使用
[...] http://kwski.net/cakephp-2-x/1057/ [...]