// 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);
   
}

});