EditorGridに入力された値をまとめてSubmitする

FormPanelの中にEditorGridPanelを入れ、Grid上で編集した内容をFormPanelのsubmit時にまとめてサーバに送信する、ということがしたかったのですが、正式な方法がわからなかったので次のように対応してみました。

// セルのrender時にhiddenフィールドを追加する
var hiddenRenderer = function(value, metadata, rec, row, col){
	// パラメータ名がitems[i].param1のようになる
	return value + '<input type=hidden name="items['+row+'].' + rec.fields.get(col).name + '" value="'+value+'">';
}

var grid = new Ext.grid.EditorGridPanel({
	columns: [
	    {header:'id', renderer: hiddenRenderer},
	    {header:'パラメータ1', renderer: hiddenRenderer, editor: new Ext.form.TextField({...})},
	    {header:'パラメータ2', renderer: hiddenRenderer, editor: new Ext.form.TextField({...})}
	],
	store: new Ext.data.JsonStore({
	    	root: 'items',
	        fields: [
	            {name: 'id'},
	            {name: 'param1'},
	            {name: 'param2'}],
	        data: ...
	})
});

各セルの値を描画する際に、一緒にhiddenフィールドを生成するrendererを作成して、これをColumnModel(columns)で指定しています。とりあえずこれで望みどおりのデータが送信されるようになりました。

ColumnModelのeditorで指定しているテキストフィールドはcolumnごとに共通なようで、各columnで最後に編集した値もいっしょに送信されていました。不要なデータではありますが、特に悪影響はないのでこれについては無視することにしました。

これとは別に、submitする際にstoreを読込んでそれを送信する送信パラメータに追加するという方法もあると思います。