// Application instance for showing user-feedback messages. var App = new Ext.App({}); // Create a standard HttpProxy instance. var proxy = new Ext.data.HttpProxy({ url: 'app.php/users' }); // Typical JsonReader. Notice additional meta-data params for defining the core attributes of your json-response var reader = new Ext.data.JsonReader({ totalProperty: 'total', successProperty: 'success', idProperty: 'id', root: 'data' }, [ {name: 'id'}, {name: 'email', allowBlank: false}, {name: 'first', allowBlank: false}, {name: 'last', allowBlank: false} ]); // The new DataWriter component. var writer = new Ext.data.JsonWriter(); // Typical Store collecting the Proxy, Reader and Writer together. var store = new Ext.data.Store({ id: 'user', restful: true, // <-- This Store is RESTful proxy: proxy, reader: reader, writer: writer, // <-- plug a DataWriter into the store just as you would a Reader listeners: { write : function(store, action, result, response, rs) { App.setAlert(response.success, response.message); } } }); // Let's pretend we rendered our grid-columns with meta-data from our ORM framework. var userColumns = [ {header: "ID", width: 40, sortable: true, dataIndex: 'id'}, {header: "Email", width: 100, sortable: true, dataIndex: 'email', editor: new Ext.form.TextField({})}, {header: "First", width: 50, sortable: true, dataIndex: 'first', editor: new Ext.form.TextField({})}, {header: "Last", width: 50, sortable: true, dataIndex: 'last', editor: new Ext.form.TextField({})} ]; // load the store immeditately store.load(); Ext.onReady(function() { Ext.QuickTips.init(); // use RowEditor for editing var editor = new Ext.ux.grid.RowEditor({ saveText: 'Update' }); // Create a typical GridPanel with RowEditor plugin var userGrid = new Ext.grid.GridPanel({ renderTo: 'user-grid', iconCls: 'icon-grid', frame: true, title: 'Users', autoScroll: true, height: 300, store: store, plugins: [editor], columns : userColumns, tbar: [{ text: 'Add', iconCls: 'silk-add', handler: onAdd }, '-', { text: 'Delete', iconCls: 'silk-delete', handler: onDelete }, '-'], viewConfig: { forceFit: true } }); /** * onAdd */ function onAdd(btn, ev) { var u = new userGrid.store.recordType({ first : '', last: '', email : '' }); editor.stopEditing(); userGrid.store.insert(0, u); editor.startEditing(0); } /** * onDelete */ function onDelete() { var rec = userGrid.getSelectionModel().getSelected(); if (!rec) { return false; } userGrid.store.remove(rec); } });