Ext.grid.EditorGridで表形式編集_3
編集したデータを保存します。
表の中のデータは、Ext.data.Storeの中の「data」プロパティに存在します。
.getModifiedRecords()メソッドで、更新されたレコードのみを得ることができます。
この中の各レコードををjqueryの$.eachでループしながら$.postを使って非同期にアップデートします。
ツールバーを作成して、追加、保存、再読込みのボタンと関数を定義します。
ds.load();の前に次のコードを記述します。
// ツールバー追加
var gridHead = grid.getView().getHeaderPanel(true);
var tb = new Ext.Toolbar(gridHead,
[
{text: '商品追加',
handler : function(){
var itm = new Item({
id: '',
title: '',
comment: '',
categorye_id: '1',
(中略、、、)
minimum: 0,
visible: 0
});
grid.stopEditing();
ds.insert(0, itm);
grid.startEditing(0, 0);
}},
{text: '保存する',
handler : function(){
displayInfoClear();
//更新データのみ取得する
var mrs = ds.getModifiedRecords();
$.each(mrs, function(i) {
//AJAXでPOSTする
$.post("/items/ajaxpost/", {
'data[Item][id]': this.data.id,
'data[Item][title]': this.data.title,
'data[Item][comment]': this.data.comment,
'data[Item][categorye_id]': this.data.categorye_id,
(中略、、、)
'data[Item][minimum]': this.data.minimum,
'data[Item][visible]': this.data.visible
},
displayInfo);
});
ds.reload();
}},
{text: '再読込み',
handler : function(){
ds.reload();
}}
]
);
javascriptで以下の関数を追加します。
//更新ステータスを表示する
function displayInfo(data) {
$("#postinfo").html($("#postinfo").html() + "<br />" + data);
}
//更新ステータス表示を消去する
function displayInfoClear() {
$("#postinfo").html("");
}
cakePHP側のコントローラーに以下のメソッドを作成します。
//表形式編集保存 -----------------------------------------------
function ajaxpost() {
if(!empty($this->data)) {
if ($this->Item->save($this->data)) {
print("Id=".$this->data["Item"]["id"]."保存しました");
exit();
} else {
print("Id=".$this->data["Item"]["id"]."保存できませんでした");
exit();
}
}
exit();
}
'data[Item][title]': this.data.title,
がフォーム部品のname属性とvalue属性に相当します。
cakePHPではこのnameフォーマットで送ると、
$this->Item->save($this->data)
だけで更新とバリデーション(データ検証)を行ってくれます。
新規追加されたレコードにはidがないので、自動的にInsetをしてくれます。
成功したら「保存しました」と返されるので、displayInfo(data)関数で表示します。
この一連の更新作業は各レコードごとに非同期で行われます。
再読込みするには、Ext.data.Store.reload()とするだけです。

