CakePHP2 で Jsヘルパーを使用して、Ajax転送を行う次のソフトを作成しました。
webブラウザよりURL「http://localhost/kanas/ajax_request」を入力すると、次の画面が表示されます。Title欄に設定した文字列を、「Add Title」ボタンを押すと「updating…」の下に表示します。「updating…」は、「Add Title」ボタンを押すと消され、Ajax転送が成功すると再表示されます。
開発環境
- cakephp-2.5.2
- jQuery-2.1.1
Controller
app\Controller\KanasController.php
<?php class KanasController extends AppController { public $helpers = array('Js' => array('Jquery')); // リクエストを送る側のページ public function ajax_request() { } // リクエストを受け取るページ public function ajax_event_return() { if ($this->Kana->save($this->data)) { } // 画面に何も表示されない $this->autoLayout = false; // View/Layouts にあるレイアウトを使用しない $this->autoRender = false; echo $this->data['Kana']['title'] ; } }
Title欄の文字列の取得方法
ajax_request.ctpで示す「$this->Form->input(‘title’)」でTitle欄の文字列が設定されます。フォームからのデータは、Ajax転送すると、CakePHPが自動的に変数$data[‘テーブル名’][‘フィールド名’]に格納してくれます。Controllerでは「this->Kana->save()」を用いて、フォームからのデータ$dataをデータベースのテーブル「kanas 」に保存しています。
Model
app\Model\Kana.php
<?php class Kana extends AppModel { } ?>
MySQLのテーブル「kanas」の生成用のSQLを次に示します。
DROP TABLE IF EXISTS kanas; CREATE TABLE kanas ( id int(11) unsigned NOT NULL auto_increment, title varchar(255), created datetime NOT NULL, modified datetime NOT NULL, PRIMARY KEY (id), KEY created (created), KEY modified (modified) );
View
app\View\Kanas\ajax_request.ctp
<?php echo $this->Form->create( 'Kana', array( 'type'=>'post')); echo $this->Form->input('title'); echo $this->Js->submit('Post Your Message', array( 'before' => $this->Js->get( '#sending-js-submit')->effect( 'hide'), 'success' => $this->Js->get( '#sending-js-submit')->effect( 'show'), 'url' => array( 'action' => 'ajax_event_return' ), 'update' => '#result-js-submit' )); echo $this->Form->end(); echo $this->Js->writeBuffer(); ?> <div id="sending-js-submit">updaing...</div> <div id="result-js-submit"></div> <script>
コールバックに関する属性項目として次のようなものがあります。
- before
- AJAXリクエストが送信される前に呼び出されます。必要であれば、XMLHttpRequestオブジェクトを操作して追加のheaderを付与してやるなどの処理が行えます。
- success
- 通信が成功した際に呼び出されます。サーバエラーやデータエラーが発生した場合には呼ばれません。
- url
- Ajax処理で呼び出すURL(controller/action)
- update
- ajax更新の結果を出力する要素
Js HelperによりjQueryを作成しますが、「$this->Js->writeBuffer()」でJs Helperで作られたすべてのスクリプトが出力され、Ajaxで送信されたデータがブラウザに表示される。
app\View\Layouts\default.ctp
webroot\kana\jsにjQuery-2.1.1を保存します。jQueryの呼び出しは、デフォルトテンプレートのヘッダに記述しました。
echo $this->Html->script('jquery-2.1.1.min.js');
CakePHPのログ取得
Object クラスのメソッドとして、log() が用意されているため、コントローラ、モデル、ビュー、ヘルパーなど Object クラスを継承しているクラスで、次のように使用できます。第一引数が配列の場合は、print_r() の出力形式と同じように出力されます。
- 使用方法
- $this->log(‘エラー’)
ログの出力先:/app/tmp/logs/error.log - $this->log(‘デバッグ’, LOG_DEBUG)
ログの出力先:/app/tmp/logs/debug.log