例えば、「入金済み」「未入金」みたいなフラグがあったとして、
jQueryを使って画面変遷無しで変更する方法のメモ。
※あくまで自分用のメモです。読んで頂いた方に理解できるように書く自信がありません。ごめんなさい。
やりたいこと
変更操作する一覧形式のビュー
【サンプル】
一覧形式のビューの一番上に下記コードを記述
一覧表の入金ボタン(入切)には、onclickでchangePayFlag(id);return false;を記述 *1
<?PHP
echo $javascript->codeBlock(
'
// 入金ステータス変更
function changePayFlag(id) {
$.ajax({
url: "'.$html->url("change_pay_flag").'", // ここで変更処理するアクションを指定($html->urlを使用)
type: "POST", // メソッドを指定(GETでもいい)
data: {id:id}, // POSTの場合はデータをセット(コントローラでの受け取り方にコツあり)
dataType: "html",
timeout: 10000,
error: function(XMLHttpRequest, textStatus, errorThrown){
// 変更が失敗したときの処理
alert("入金ステータスを変更できませんでした");
},
success: function (data) {
// 変更が成功したときの処理
var info = eval("("+data+")");
imgSrc = $("#paidImg"+id).attr("src");
if (info.paid == "paid") {
imgSrc = "'.$html->url("/img/icons/money_add.gif").'";
imgAlt = "入金済み";
} else {
imgSrc = "'.$html->url("/img/icons/coins_delete.gif").'";
imgAlt = "未入金";
}
$("#paidImg"+id).attr("src", imgSrc).attr("alt", imgAlt); // 対象の画像とAltを差し替え
}
});
}
',
array("inline" => false)
);
?>
入金フラグ変更処理
【サンプル】
// 入金状態変更
function change_pay_flag() {
$this->layout = "ajax";
Configure::write("debug", 0);
$params = $this->params['form']; // ajaxでPOSTしたデータは$this->params['form']で取得
if (!isset($params['id'])) {
$this->flash("引数の指定がありません", "index", 2);
return;
}
$order = $this->Order->read(null, $params['id']);
if ($order['Order']['pay_flag'] > 0) {
// 入金済みだった場合は未入金に
$changeFlag = "0";
$results['paid'] = "unpaid";
} else {
// 未入金だった場合は入金済みに
$changeFlag = "1";
$results['paid'] = "paid";
}
$this->Order->id = $order['Order']['id'];
$this->Order->saveField("pay_flag", $changeFlag);
$this->set(compact("results")); // ここでセットしたresultsは$.ajaxのコールバックに使用する
}
入金フラグ変更処理のビュー
【サンプル】
<?PHP echo $javascript->object($results); // 配列をJSON形式に変換 ?>
補足
一覧形式のビューに追加したjavascriptコードの$.ajax({success:~~});に書いたvar info = eval(“(“+data+”)”);部分は、入金フラグ変更処理のビューで取得したJSON形式のデータをjavascriptの変数に展開?するために書いています。*2

