Jsヘルパーを使用してAjax更新

更新処理でページ遷移を伴う場合、ページ全体をレスポンスするのに対して、Ajax処理ではページの一部のレスポンスが可能となるためサーバからの通信量を抑えることが可能となります。
Jsヘルパーを使用して、簡単なサンプルを作成しました。(デモ)
[追] 2.2版でも作成しましたので参照ください。(こちら)

head

JQuery本体をロードして下さい。

<?php 
    // jQuery
    echo $html->script( 'jquery.min.js', array( 'inline' => 'false'));
    // Jsヘルパーが生成するJSを出力させる
    echo $this->Js->writeBuffer( array( 'inline' => 'true'));
?>

ビュー (View)

// app/views/ajax/dispajaxupdate.ctp
<?php 
    echo $form->create( 'Testtable', array( 'type'=>'post'));
    echo $form->text( 'data');
    echo $this->Js->submit( 'Update', array( 'url'=>'ajax/ajaxupdate', 'update'=>'#result-ajaxupdate')); 
    echo $form->end();
?>
<div id="result-ajaxupdate"></div>

'url' ... Ajax処理で呼び出すURL(controller/action)
'update' ... ajax更新の結果を出力する要素

コントローラ (Controller)

// [app/controllers/ajax_controller.php]
<?php
class AjaxController extends AppController {
    var $name = 'Ajax';
    var $uses = array( 'Testtable');
    var $helpers = array( 'Js');

function dispajaxupdate(){}

function ajaxupdate(){
    // Ajax or not
    if (!$this->RequestHandler->isAjax()){
        $this->redirect( 'ajax/dispajaxupdate');
    }
    // save OK
    if ($this->Testtable->save( $this->data)) {
        $this->render( '/elements/ajax/ajaxupdated', 'ajax');
    // save NG
    } else {
        $this->set( 'valerror', $this->Testtable->validationErrors);
        $this->render( '/elements/ajax/ajaxupdated', 'ajax');
    }
}
}
?>

(Ajaxという名前でなくてもいいです。)
$this->RequestHandler->isAjax()
Ajaxかどうかを判定します。urlに'ajax/ajaxupdate'と手入力してアクセスした場合は、'ajax/dispajaxupdate'へリダイレクトされます。

エレメント (Ajax処理の結果を返す)

// app/views/elements/ajax/ajaxupdated.ctp
<?php 
if (!empty( $valerror['data'])){
    echo $valerror['data'];
} else {
    echo h( $this->data['Testtable']['data']);
}
?>

モデル (Model)

// 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'),
        ),
    );
}
?>
  • このエントリーをはてなブックマークに追加

関連記事

no image

ログローテーション

CakePHP1.3では標準ではログはタイプごとに出力されるだけで、定期的なローテーションを行ってくれません。放っておくとひたすら1つのファイルにアペンドされていきます。app/tmp/logs以下に

no image

WYSIWYGエディタを実装

WYSIWYGエディタをCakePHPにいくつか試してみました。 CKEditor 実装 // head // View(~.ctp) 解凍してwebroot/jsフ

no image

シンプルに設置できる数字Captcha「MathCaptcha」

スパム防止などで利用されているCaptchaですが、数字版で使えるものがないか探してみました。 この「MathCapthca」は非常にシンプルに設置できるのはいいですが、やっぱりクエスチョンの部分は

Textヘルパー

Textヘルパーには、テキスト処理に関する便利な機能があります。リンク付与やテキストの抜粋・ハイライトや切り取り処理など。ソース:/cake/libs/view/helpers/text.php

Cookieログイン

今回は、「keep me logged in」などログイン画面でよくみかけるクッキーログインの機能を使ってみます。 CakePHPには、Cookieコンポーネントがあります。(PHPのsetcook

no image

ユーザ登録(仮登録・メール・本登録)

ここ最近は、メールアドレスだけでなく、SNSのアカウントと連携してユーザ登録することもできるWebサービスが増えてきましたね。ユーザは割合としてどちらを選んでるのか気になるところですが。私はできるだけ

no image

ビルトインされたバリデーションルール

CakePHP標準で多くのバリデーションルールが搭載されています。 ソース:/cake/libs/validation.php email / maxLength / minLength /

no image

Debugkitをインストール

CakePHPのデバッグツールとしてはデファクトスタンダードといってもいいDebugkitをインストールしました。 ダウンロード CakePHP 1.3用 https://github.com

CakePHP 1.3 インストール

使い古されている手ではありますが、表題の件とレンタルサーバへの配置方法などにも使えますので参考にしていただけたらと思います。 まずはレンタルサーバでCakePHPを動作させる CakePHPア

no image

recursive設定によるfind()性能改善

CakePHPでは、モデルにアソシエーションを設定している場合、recursive(=>joinする階層)はデフォルトで0に設定されています。「recursiveゼロ」の意味するところとは、「1跨ぎま

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

    PAGE TOP ↑