[SOLUCIONADO] problema con grid y json!!
Primero quiero agradecer por el espacio para preguntar y poder ayudar a otras personas que usen ExtJs <!-- s;) --><!-- s;) --> ahora la consulta!...
Bueno basicamente.. estoy usando un JsonStore con REST... anda todo bien.. solamente que cuando agrego un registro (lo hago mediante un prompt y de ahi a un store.add() ) ... necesito que se dispare el evento "write" ... el server me responde con codigo 200 pero no se porque no se ejecuta tal evento.. les dejo mi codigo.
var Record = Ext.data.Record.create([ {name: 'idGrupo'}, {name: 'nombreGrupo', allowBlank: false}, {name: 'cantidadUsuarios'} ]); var reader = new Ext.data.JsonReader( { totalProperty: 'total', idProperty: 'idGrupo', root: 'datos' },Record); var writer = new Ext.data.JsonWriter({ encode: true, writeAllFields: false }); var store = new Ext.data.Store({ id : 'grupos-store', autoLoad : false, autoSave : true, restful : true, proxy : new Ext.data.HttpProxy({ url :'index.php/grupos_rest/grupos/format/json', }), reader : reader, writer : writer, listeners : { add : function(store,record,index){ }, write : function(store, action, result, response, rs) { alert(response.message); } } }); var grid = new Ext.grid.EditorGridPanel({ id : 'grupos-grid', store : store, viewConfig : {forceFit: true}, columns : [ new Ext.grid.RowNumberer(), {header: 'Nombre del Grupo',dataIndex:'nombreGrupo'}, {header: 'Cantidad de Usuarios',dataIndex:'cantidadUsuarios'} ], height : 300, sm : new Ext.grid.RowSelectionModel({singleSelect:true}), tbar : [{ text : 'Agregar Grupo', iconCls : 'silk-group-add', scope : this, handler : function(){ Ext.Msg.prompt('Grupo','Ingrese el nombre del nuevo grupo:',function(btn,texto){ if (btn=="ok"){ if (Ext.util.Format.trim(texto) == ""){ alert("no puede estar vacio.") } else { //CREATE RECORD var grid = Ext.getCmp('grupos-grid'); var g = new Record({"nombreGrupo" : texto}); grid.store.add(g); } } }) } },'-',{ text : 'Eliminar Grupo', iconCls : 'silk-group-delete', scope : this, handler : function(){ var grid = Ext.getCmp('grupos-grid'); var rec = grid.getSelectionModel().getSelected(); if (!rec) { return false; } grid.store.remove(rec); } },'-',{ text : 'Refrescar Datos', iconCls : 'silk-arrow-refresh', scope : this, handler : function(){ Ext.getCmp('grupos-grid').store.reload(); } },], bbar : [{ text: 'autoGuardar', enableToggle: true, pressed : true, scope : this, tooltip: 'Cuando esta habilitado, los cambios se guardaran automaticamente.', toggleHandler: function(btn, pressed) { this.store.autoSave = pressed; if (pressed == true){ Ext.getCmp('boton-guardar').disable(); } else { Ext.getCmp('boton-guardar').enable(); } } },'-',{ id : 'boton-guardar', text : 'Guardar', scope : this, disabled: true, iconCls : 'icon-save', handler : function(){ this.store.save(); } }] }); grid.relayEvents(this.store, ['destroy', 'save', 'update']);Cualquier idea por favor haganmela saber <!-- s:) --><!-- s:) -->
Hola.
¿Has probado de pasar en la respuesta JSON una [i]successProperty[/i]?
Por defecto puedes incluir en el JSON de respuesta un atributo booleano con el nombre [b]success[/b], y valor [b]true[/b].
Ya nos contarás si te ha servido de algo el consejo. Un saludo
sisi el php me responde {"success":true,"message":"algun mensaje")
pero es como si el reader ignorara la respuesta...
en lugar de configurar la propiedad "url" del proxy:
proxy : new Ext.data.HttpProxy({ url :'index.php/grupos_rest/grupos/format/json', }),configura la propiedad "api":
proxy : new Ext.data.HttpProxy({ api: { read: 'index.php/grupos_rest/grupos/format/json', create:'index.php/grupos_rest/grupos/format/json', update:'index.php/grupos_rest/grupos/format/json', destroy:'index.php/grupos_rest/grupos/format/json' } }),y recuerda agregarle al store la propiedad "successProeperty" que ya te han mencionado, en tu código no la veo:
var store = new Ext.data.Store({ //.... successProperty : 'success', //.... });Bueno, a ver si en algo te pude ayudar, luego nos cuentas Suerte!!
probe cambiar el url por el api y agregar el successProperty y tampoco <!-- s:( --><!-- s:( -->
estoy empezando a pensar que es un bug en ExtJs... voy a revisar el codigo fuente aver si encuentro algo
ya esta solucionado!
antes la respuesta del server era:
{"success":true,"message":"Agregado Correctamente"}pero me di cuenta de que tengo que incluir el registro que se agrego.. quedaria asi:
{"success":true,"message":"Agregado Correctamente","datos":[{"idGrupo":2,"nombreGrupo":"AlgunNombre"}]y voala! pero para poder descubrir esto.... hice un debug.. incluyendo el archivo ext-all-debug.js... buscando y buscando (dolor de cabeza mediante.. y coca cola!) llegue a la linea 33018 que dice:
try { res = reader.readResponse(action, response); } catch (e) { alert(e); // ESTO LO AGREGUE YO!!! this.fireEvent('exception', this, 'response', action, o, response, e); o.request.callback.call(o.request.scope, null, o.request.arg, false); return; }por si no vieron ese alert lo agregue yo... basicamente lo que hace es que me da un mensaje de alerta si el JsonReader no puede leer la respuesta correctamente.. al principio me decia que no podia leer el successProperty.. y despues me tiro un mensaje que decia que no encontraba el "root" ahi me di cuenta que tenia que incluir los campos que declare en el reader... y listo! Muchas gracias igual por su ayuda! espero que esto le sirva a alguien!
Que bien que lo resolviste!!
[quote="strato1986"]
...pero me di cuenta de que tengo que incluir el registro que se agrego.. quedaria asi:
{"success":true,"message":"Agregado Correctamente","datos":[{"idGrupo":2,"nombreGrupo":"AlgunNombre"}][/quote] realmente solo es necesario el ID del nuevo registro, ( <!-- m -->http://extjs.com/deploy/dev/docs/?class ... .DataProxy<!-- m --> ), ahi en la documentación se menciona <!-- s:o --><!-- s:o --> pero no dice que tiene que venir en un arreglo. en fin... que bien que lo solucionaste. saludos
¿Conoces a alguien que pueda responder esta pregunta? Comparte el link en Twitter o Facebook
Es necesario registrarse para poder participar en el foro! Si ya tienes una cuenta puedes entrar y comentar en este foro.