CakePHP2 で Jsヘルパーを使用して、Ajax転送を行う次のソフトを作成しました。

webブラウザよりURL「http://localhost/kanas/ajax_request」を入力すると、次の画面が表示されます。Title欄に設定した文字列を、「Add Title」ボタンを押すと「updating…」の下に表示します。「updating…」は、「Add Title」ボタンを押すと消され、Ajax転送が成功すると再表示されます。

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