[solucionado] lo tipico: problema con un combo
Hola, abusando de la buena voluntad (y ya con un incipiente dolorcillo en medio de la frente) me dirijo a Ud solicitando una vez más su ayuda <!-- s;) --><!-- s;) -->
¿como cargo un combo adecuadamente para que envié los parametros adecuado?
me explico: tengo un form en una ventana que se carga con informacion desde una grilla cuando seleccionas una de sus filas y le das al botoncito de "editar", hasta ahi todo bien.
En la grilla tengo un ComboBox cargado remotamente con la sgte configuracion:
modulosStore = new Ext.data.JsonStore({ url : '../php/modulos.php', root : 'data', fields : ['id_interno', 'modulo'], autoLoad : true }); var cmbModulo = new Ext.form.ComboBox({ store : modulosStore, name : 'id_modulo', id : 'modulo', valueField : 'id_interno', hiddenName : 'id_modulo', displayField : 'modulo', triggerAction : 'all', mode : 'local', emptyText : 'Seleccione un modulo', fieldLabel : 'Modulo', width : 200, editable : false, forceSelection : true });al cargar la ventana uso lo sgte apra darle los valores al form:
Ext.getCmp('modulo').setValue(s[0].data.modulo);pero cuando envio el form en vez de enviarme el [b]id_modulo[/b], me envia el texto, sin embargo si despliego el combo y selecciono otro elemento de la lista desplegable entonces si envia el [b]id_modulo[/b]. Alguien podria iluminarme e indicarme que estoy haciendo mal? gracias de antebrazo
he probado el setValue, con un tiempo asi:
Ext.getCmp('modulo').setValue(s[0].data.modulo,500);
incluso he probado con setRawValue, pero sigue sin seleccionar el correspondiente valor oculto. alguna idea?
mira, he probado diferentes metodos pero ninguno me resulta. copio mi codigo aqui para ver si algun alma caritativa <!-- s:) --><!-- s:) --> me echa una manito y me dice que estoy haciendo mal:
Ext.ns('app'); Ext.QuickTips.init(); Ext.BLANK_IMAGE_URL = '../extjs/resources/images/default/s.gif'; app.Grilla = { init : function(){ var primaryKey = 'id'; //los registros del almacen de datos var Record = Ext.data.Record.create([ {name : primaryKey, type : 'int'}, {name : 'id_interno', type : 'int'}, {name : 'usuario'}, {name : 'clave'}, {name : 'nombre'}, {name : 'apellido'}, {name : 'correo'}, {name : 'codigo'}, {name : 'razon'}, {name : 'id_empresa', type : 'int'} ]); //el lector de los datos en formato json var reader = new Ext.data.JsonReader({ root : "datos", id : primaryKey }, Record); //de donde va a leer los datos var store = new Ext.data.Store({ url : '../php/leer_usuarios.php', reader : reader }); //cargo mi almacen store.load(); var pager = new Ext.PagingToolbar({ store : store, // <--grilla y PagingToolbar using same store displayInfo : true, displayMsg : '{0} - {1} de {2} Usuarios', emptyMsg : 'No hay usuarios que mostrar', pageSize : 5 }); var tbBarra = new Ext.Toolbar({ items : [ {xtype : 'button', iconCls : 'agregar', tooltip : 'Agregar un usuario',handler : this.acciones}, {xtype : 'button', iconCls : 'editar', tooltip : 'Editar el usuario seleccionado', handler : this.acciones}, {xtype : 'button', iconCls : 'eliminar', tooltip : 'Eliminar el usuario seleccionado', handler : this.acciones}, '->', {xtype : 'button', iconCls : 'restablecer', tooltip : 'Restablecer', handler : this.acciones} ] }); var grid = new Ext.grid.GridPanel({ id : 'grilla', store: store, // <--grid y PagingToolbar usan el mismo store columns : [ new Ext.grid.RowNumberer(), new Ext.grid.CheckboxSelectionModel(), {header : 'id_interno', dataIndex : 'id_interno', hidden : true}, {header : 'clave', dataIndex : 'clave', hidden : true}, {header : 'Usuario', dataIndex : 'usuario', width : 100, sortable : true}, {header : 'Nombre', dataIndex : 'nombre', width : 100, sortable : true}, {header : 'Apellido', dataIndex : 'apellido', width : 150, sortable : true}, {header : 'Correo Electronico', dataIndex : 'correo', width : 200, sortable : true}, {header : 'codigo', dataIndex : 'codigo', width : 200, sortable : true, hidden : true}, {header : 'razon', dataIndex : 'razon', width : 200, sortable : true, hidden : true}, {header : 'id_empresa', dataIndex : 'id_empresa', width : 200, sortable : true, hidden : true} ], bbar : pager, // <--agregando el pagingtoolbar a la grilla border : false, stripeRows : true, tbar : tbBarra }); //definicion de la ventana var win = new Ext.Window({ layout : 'fit', closable : false, border : false, draggable : false, maximized : true, minimizable : false, plain : true, resizable : false, items : grid }); win.show(); }, //funciones de los botones acciones : function(btn){ switch (btn.iconCls){ case 'agregar' : var titulo = 'Agregar usuario'; var pagina_url = '../php/agregar_usuario.php'; var ruta = '../php/generar_usuario.php'; break; case 'editar' : var registro = Ext.getCmp('grilla').getSelectionModel().getSelected(); var nombre = registro.get('nombre'); var apellido = registro.get('apellido'); var correo = registro.get('correo'); var usuario = registro.get('usuario'); var clave = registro.get('clave'); var empresa = registro.get('razon'); var titulo = 'Editar usuario'; var pagina_url = '../php/editar_usuario.php'; var ruta = '../php/regenerar_usuario.php'; break; case 'eliminar' : alert('eliminar'); exit; break; }; //definicion de los campos var textNombre = new Ext.form.TextField({ fieldLabel : 'Nombre', id : 'nombre', name : 'nombre', allowBlank : false, autoCreate : {tag : "input", type : "text", autocomplete : "off", maxlength : 20, size : 35 }, value : nombre, listeners : { specialkey : function(field, e) { if (e.getKey() == e.ENTER){ Ext.getCmp('apellido').focus(true); } }, 'render': function(c) { c.getEl().on('keyup', function() { console.log('aqui'); generarUsuario(); }, c); } } }); var textApellido = new Ext.form.TextField({ fieldLabel : 'Apellido', id : 'apellido', name : 'apellido', allowBlank : false, autoCreate : {tag : "input", type : "text", autocomplete : "off", maxlength : 20, size : 35 }, value : apellido, listeners : { specialkey : function(field, e) { if (e.getKey() == e.ENTER){ Ext.getCmp('correo').focus(true); } }, 'render': function(c) { c.getEl().on('keyup', function() { generarUsuario(); }, c); } } }); var textCorreo = new Ext.form.TextField({ fieldLabel : 'Correo', id : 'correo', name : 'correo', allowBlank : false, autoCreate : {tag : "input", type : "text", autocomplete : "off", maxlength : 50, size :35 }, value : correo, listeners : { specialkey : function(field, e) { if (e.getKey() == e.ENTER){ Ext.getCmp('empresa').focus(true); } } } }); empresasStore = new Ext.data.JsonStore({ url : '../php/empresas.php', root : 'data', fields : ['id_interno', 'razon'], autoLoad : true }); var cmbEmpresas = new Ext.form.ComboBox({ store : empresasStore, name : 'id_empresa', id : 'empresa', valueField : 'id_interno', //hiddenName : 'id_interno', displayField : 'razon', triggerAction : 'all', mode : 'local', emptyText : 'Seleccione una empresa', fieldLabel : 'Empresa', width : 200, editable : false, forceSelection : true, value : empresa, listeners : { select : function(){generarUsuario();} } }); var textUsuario = new Ext.form.TextField({ fieldLabel : 'Usuario', id : 'usuario', name : 'usuario', allowBlank : false, readOnly : true, autoCreate : {tag : "input", type : "text", autocomplete : "off", maxlength : 8, size : 10 }, value : usuario }); var textClave = new Ext.form.TextField({ fieldLabel : 'Clave', id : 'clave', name : 'clave', allowBlank : false, readOnly : true, autoCreate : {tag : "input", type : "text", autocomplete : "off", maxlength : 8, size : 10 }, value : clave }); //definicion del formulario var form = new Ext.FormPanel({ baseCls : 'x-plain', frame : true, autoScroll : false, bodyStyle : 'padding:10px;', url : pagina_url, items : [textNombre, textApellido, textCorreo, cmbEmpresas, textUsuario, textClave], fbar : [{ xtype : 'button', iconCls: 'guardar', tooltip: 'Guardar los datos', handler : function(){ form.getForm().submit({ method : 'POST', waitTitle : 'Conectando', waitMsg : 'Enviando datos...', success : function(){ win.close(); store.reload(); }, failure : function(form, action){ if (action.failureType == 'server'){ respuesta = Ext.util.JSON.decode(action.response.responseText); Ext.MessageBox.show({ title : 'Error', msg : respuesta.errors.reason, buttons : Ext.MessageBox.OK, icon : Ext.MessageBox.ERROR }); } else { Ext.MessageBox.show({ title : 'Error', msg : 'Fallo de conexión con el servidor',//+ action.response.responseText, buttons : Ext.MessageBox.OK, icon : Ext.MessageBox.ERROR }); } } }); } }] }); //definicion de la ventana var win = new Ext.Window({ title : titulo, iconCls : 'agregar', id : 'winusuarios', layout : 'fit', width : 350, height : 250, closable : true, resizable : false, border : true, modal : true, constrain : true, items : form }); win.show(); //me permite enviar el foco al campo despues que la ventana es creada Ext.getCmp('nombre').focus(true, 500); //genera el nombre de usuario y contraseña var generarUsuario = function(ruta){ Ext.Ajax.request({ url: ruta, params : { nombre : Ext.getCmp('nombre').getValue(), apellido : Ext.getCmp('apellido').getValue(), empresa : Ext.getCmp('empresa').getValue() }, success : function(response){ info = Ext.decode(response.responseText); Ext.getCmp('usuario').setValue(info.usuario); Ext.getCmp('clave').setValue(info.clave); } }); }; } } Ext.onReady(app.Grilla.init,app.Grilla);en los campos :
{name : 'razon'}, {name : 'id_empresa', type : 'int'}tengo el nombre de la empresa (razon) y el código interno asignado en la BD a esa empresa y que es el valor que deseo enviar. Como ven si leen el código cuando elijo la opción "agregar" de mi toolbar genero una ventana con los campos, estoy tratando de reutilizar el mismo código para cuando quiero editar un registro de mi BD. el problema es que cuando estoy "agregando" como debo desplegar el combo se asigna el valor correcto para la empresa pero cuando estoy "editando" me muestra el nombre de la empresa y me envia lo mismo pero no el valor del id de la empresa. alguna idea?
una cosa que me ha funcionado a medias es la sgte:
le he agregado un listeners al combobox:
afterrender : function(){ Ext.getCmp('modulo').setValue(modulo); }pero ademas debo darle el foco al combobox al final Ext.getCmp('modulo').focus(true, 500); porque sino me envía el displayFiled en vez del valueField
la solución definitiva y después de mucho cabecearla es:
afterrender : function(combo){ combo.setValue(id_modulo);//valor del valueField combo.setRawValue(modulo); //valor del DisplayField }por si a alguien le sirve <!-- s:lol: --><!-- s:lol: -->
que larga conversacion por el valor del combo.
para que el combo envie los datos del value field al momento de hacer submit en el form al que pertenece debes configutar las propiedades
hiddenName
hiddenValue
en el API del comobo esta la explicacion del porque
no es cuando envía solamente la información del combo, sino cunado cargas el combo a partir de información desde una grilla por ejemplo, yo utilizo la misma ventana para agregar que para editar y no lograba que me enviará el valuefield cuando trataba de cargar un combo con un valor de la lista a menos que manualmente seleccionara el ítem o le diera el foco, solo de esta forma me resulto.
hola Tokkaido, sabes desde hace dias toy buscando poner por default un valor a mi combo y aun no lo consigo, he copiado las lineas que tu pusiste y nada de nada. Los valores del combo los saco de una tabla y quiero que por default me aparesca el segundo registro. Pongo mi codigo para que me digas en que estoy fallando
GRACIAS!!!!
var w_producto=new Ext.form.ComboBox({
fieldLabel:'Tipo ',
name:'w_producto',
forceSelection:true,
emptyText:'Seleccione Producto o Proyecto...',
triggerAction: 'all',
editable:false,
width:400,
mode: 'local',
displayField:'des_ppt',
valueField: 'id_ppt',
selectOnFocus:true,
// selected:1,
store :new Ext.data.JsonStore({
url: 'index.php/programatica/pro_leeproducto',
root: 'data',
totalProperty: 'total',
fields: [
{name:'id_ppt', type: 'string'},
{name:'des_ppt', type: 'string'}
],
}),
//prueba
listeners : {
afterrender: function(combo){
combo.setValue(2);
combo.setRawValue(des_ppt);
}
},
});
al final, ya con la experiencia, te puedo decir que el 99,9% de las veces que quieres asignarle un valor a un combo y te muestra el id en vez del valor es porque se lo estas asignando cuando el store que alimenta el combo aun no está cargado, por lo que el listener no debe ser al combo, sino al store.
¿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.