Foro

[solucionado] lo tipico: problema con un combo

0
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
0
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?
0
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?
0
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
0
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: -->
0
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
0
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.
0
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); } }, });
0
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.
0
ok thank you, ya te entendi.... gracias!!!! un abrazo
0
asegúrate que cuando le des el setValue al combo el store ya esté cargado totalmente.. tal vez en eso puede estar el error!! salu2

¿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.