How does one get a JSONDataModel for the grid? I see JsonReader, but how do I use that with the grid? Do I need to create a Ext.data.Store?

#2
![]() |
![]() Take a look at the page grid example, it uses a JsonReader.
![]() |
#3
![]() | |
![]() Quote:
![]() ![]() |
#4
![]() |
![]() If you are only doing "in-house" queries, it may be sufficient to use HttpProxy instead of ScriptTagProxy, but as my JS experience is limited I can't say what is better and/or faster
![]() What I can say is that it works nice, here's my Store: this.store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({ url:'get-grid.php' }), reader: this.reader, remoteSort: true }); ![]() |
#5
![]() |
![]() Yeah the data api has changed quite a bit. There are shortcuts though (not being used there). This code:
// define the "Topic" record, mapping json data to record fields var Topic = Ext.data.Record.create([ {name: 'title', mapping: 'topic_title'}, {name: 'author', mapping: 'username'}, {name: 'totalPosts', mapping: 'topic_replies', type: 'int'}, {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'}, {name: 'lastPoster', mapping: 'user2'}, {name: 'excerpt', mapping: 'post_text'} ]); // create reader that reads into Topic records var reader = new Ext.data.JsonReader({ root: 'topics', totalProperty: 'totalCount', id: 'topic_id' }, Topic); // create reader that reads into Topic records var reader = new Ext.data.JsonReader({ root: 'topics', totalProperty: 'totalCount', id: 'topic_id' }, [ {name: 'title', mapping: 'topic_title'}, {name: 'author', mapping: 'username'}, {name: 'totalPosts', mapping: 'topic_replies', type: 'int'}, {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'}, {name: 'lastPoster', mapping: 'user2'}, {name: 'excerpt', mapping: 'post_text'} ]); Although it looks complex, in the end it can be made to look much easier by combining everything in one statement if you wanted to: // create the Data Store var ds = new Ext.data.Store({ // load using script tags for cross domain proxy: new Ext.data.ScriptTagProxy({ url: 'http://www.yui-ext.com/forum2/topics-remote.php' }), // let it know about the reader reader: new Ext.data.JsonReader({ root: 'topics', totalProperty: 'totalCount', id: 'topic_id' }, [ {name: 'title', mapping: 'topic_title'}, {name: 'author', mapping: 'username'}, {name: 'totalPosts', mapping: 'topic_replies', type: 'int'}, {name: 'lastPost', mapping: 'post_time', type: 'date', dateFormat: 'timestamp'}, {name: 'lastPoster', mapping: 'user2'}, {name: 'excerpt', mapping: 'post_text'} ]), // turn on remote sorting remoteSort: true }); ![]() |
#6
![]() |
![]() I'm getting an error I haven't gotten before with grid 1.0. It says invalid label in firebug and it points to my return result php page.
My resultset is: {"ResultSet":[{"index":1,"Subject":" network key","Sender":"James Asher <jasher@scalix.xteconline.com>","Recipient":"Kevin Jordan <kevin.jordan@xteconline.com>","Date":"Tue, 30 May 2006 15:23:09 -0500"}],"totalCount":311} var Grid1 = { init: function() { this.mbox = "INBOX"; this.Mail = Ext.data.Record.create([ {name:"Subject",mapping:"mySubject"}, {name:"Sender",mapping:"mySender"}, {name:"Recipient",mapping:"myRecipient"}, {name:"Date",mapping:"myDate"} ]); this.reader = new Ext.data.JsonReader({ root: 'ResultSet', totalProperty: 'totalCount', id: 'index' },this.Mail); this.ds = new Ext.data.Store({ proxy: new Ext.data.ScriptTagProxy({ url: 'mailquery.php' }), reader:this.reader, remoteSort:true }); this.ds.setDefaultSort('Date', 'desc'); this.cm = new Ext.grid.ColumnModel([ {id:"mySubject",header:"Subject",width:400}, {id:"mySender",header:"Sender",width:100}, {id:"myRecipient",header:"Recipient",width:100}, {id:"myDate",header:"Date",width:100} ]); this.grid = new Ext.grid.Grid('mailgrid',{ds:this.ds,cm:this.cm,selModel: new Ext.grid.RowSelectionModel({singleSelect:true}),enableColLock:false}); // make the grid resizable, do before render for better performance this.rz = new Ext.Resizable('mailgrid', { wrap:true, minHeight:100, pinned:true, handles: 's' }); this.rz.on('resize', this.grid.autoSize, this.grid); // render it this.grid.render(); this.gridFoot = this.grid.getView().getFooterPanel(true); // add a paging toolbar to the grid's footer this.paging = new Ext.PagingToolbar(this.gridFoot, this.ds, {pageSize: 25}); this.ds.load({params:{page:1, pageSize:25,mailbox:this.mbox}}); }, onLoad: function() { this.loaded = true; } } ![]() |
#7
![]() |
![]() Like Belgabor said, you want to lose the ScriptTagProxy unless you are set up for it an calling cross domain. Switch to HttpProxy and see what happens.
![]() |
#8
![]() | |
![]() Quote:
Removing the nested layout for now, my grid also doesn't seem to be getting populated and the page number is NaN of 13. ![]() |
#9
![]() |
![]() The eval'd responseText seems to be an object with objects underneath it with my values inside.
![]() |
#10
![]() |
![]() Got it sorted out for the most part, but I still get weird page numbering, like instead of page 1 of 16, I get page 1.05 of 16. Is there any reason page and pageSize aren't getting passed automatically anymore and we're forced to use start and limit as params?
Edit: Apparently the PagingToolbar is supposed to take care of that. ![]() |