Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Combo ExtJS

Estas en el tema de Combo ExtJS en el foro de Frameworks JS en Foros del Web. Buenas tardes a tod@s!!! Estoy empezando con ExtJS (grid) y me encuentro con el siguiente problema, al cargar los datos en lugar de mostrarme el ...
  #1 (permalink)  
Antiguo 14/10/2011, 07:52
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Combo ExtJS

Buenas tardes a tod@s!!!

Estoy empezando con ExtJS (grid) y me encuentro con el siguiente problema, al cargar los datos en lugar de mostrarme el displayField, me muestra el valueField. Seguramente esté haciendo algo mal, pero al ser nueva no veo cómo arreglarlo, les dejo mi código.

Código:
Ext.ns("com.quizzpot.tutorials");

com.quizzpot.tutorials.Crud = {
	init : function() {
		//CRUD
		var proxy = new Ext.data.HttpProxy({
			api: {
				read 	: "serverside/getContacts.php",
				create 	: "serverside/createContact.php",
				update	: "serverside/updateContact.php",
				destroy	: "serverside/destroyContact.php"
			}
		});
		
		var rd_random_employee_data = new Ext.data.JsonReader({}, ['idprovincia', 'descprovincia']);
		
		var provincias = new Ext.data.Store({
   			reader: new Ext.data.JsonReader({
        	fields: ['idprovincia', 'descprovincia'],
        	root: 'rows'}),
    		proxy: new Ext.data.HttpProxy({
        	url: 'serverside/getProvincias.php'
    		}),
			autoload:true
		});
		
		var provin = new Ext.form.ComboBox({  
			id: 'idprovincia',
			store: provincias,  
			valueField: 'idprovincia',  
			displayField: 'descprovincia',  
			mode: 'remote',  
			minChars : 0  ,
			autoload:true
		});
		
		var reader = new Ext.data.JsonReader({
			totalProperty	: 'total',
			successProperty	: 'success',	//<--- el successproperty indica la propiedad que define si se ha insertado/actualizado o borrado con éxito
			messageProperty	: 'message',
			idProperty		: 'coddelegacion',
			root			: 'data'		//<--- este es el nombre del parámetro que llega al servidor con el JSON modificado
		},[
				{name: 'descdelegacion', allowBlank: false},
				{name: 'domiciliodelegacion', allowBlank: false},
				{name: 'poblaciondelegacion', allowBlank: false},
				{name: 'emaildelegacion', allowBlank: false},
				{name: 'telefonodelegacion', allowBlank: false},
				{name: 'faxdelegacion', allowBlank: false},
				{name: 'codpostaldelegacion', allowBlank: false},
				{name: 'provinciadelegacion', allowBlank: false}
				
		]);
			
		var writer = new Ext.data.JsonWriter({
			encode			: true,
			writeAllFields	: true	//<--- decide si se manda al servidor solamente los campos modificados o todos
		});
		
		this.storeGrid = new Ext.data.Store({
			id			: "id",
			proxy		: proxy,
			reader		: reader,
			writer		: writer,
			autoLoad: true,
			autoSave	: true	//<--- hace las peticiones al servidor automáticamente
		});
		
		var textFieldEmail = new Ext.form.TextField({vtype: "email",allowBlank: false}),
			textFieldDelegacion = new Ext.form.TextField({allowBlank: false}),
			textFieldDomicilio = new Ext.form.TextField({allowBlank: false}),
			textFieldPoblacion = new Ext.form.TextField({allowBlank: false}),
			
			sm = new Ext.grid.CheckboxSelectionModel();
		
		var textFieldTelefono = new Ext.form.TextField({
     		width: 80,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'999-999999',
                           clearInvalid:false
           })]
   		});
		
		var textFieldFax = new Ext.form.TextField({
     		width: 80,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'999-999999',
                           clearInvalid:false
           })]
   		});
		
		var textFieldCP = new Ext.form.TextField({
     		width: 60,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'99999',
                           clearInvalid:false
           })]
   		});
		
		var pag = new Ext.PagingToolbar({
				 store:this.storeGrid
				,displayInfo:true
				,pageSize:1
			});
		
		
		
		this.grid = new Ext.grid.EditorGridPanel({
			store		: this.storeGrid,
			columns		: [
				sm,
				{header:'Delegación', dataIndex:'descdelegacion',width:180,sortable: true, editor:textFieldDelegacion},
				{header:'E-mail', dataIndex:'emaildelegacion',sortable: true,width:180,editor:textFieldEmail},
				{header:'Domicilio', dataIndex:'domiciliodelegacion',sortable: true,width:150, editor:textFieldDomicilio},
				{header:'Población', dataIndex:'poblaciondelegacion',sortable: true,width:150, editor:textFieldPoblacion},
				{header:'Cod.Postal', dataIndex:'codpostaldelegacion',sortable: true,width:60, editor:textFieldCP},
				{header:'Teléfono', dataIndex:'telefonodelegacion',sortable: true,width:70, editor:textFieldTelefono},
				{header:'Fax', dataIndex:'faxdelegacion',sortable: true,width:70, editor:textFieldFax},
				{header:'Provincia', dataIndex:'provinciadelegacion',sortable: true,width:90, editor:provin}				
			],
			sm			: sm,
			border		: false,
			stripeRows	: true,
			bbar: pag,
			clicksToEdit: 1
		});
		
		this.storeGrid.load({params: {start:0, limit: 1}});
		
		this.grid.on('save',this.aviso);
		
		var win = new Ext.Window({
			title	: "eProject - Gestión Delegaciones",
			layout	: "fit",
			tbar	: [  
				{text:'Añadir Delegación', scope:this, handler:this.addContact,iconCls:'save-icon'},
				{text:"Eliminar Selección", scope:this, handler:this.onDelete,iconCls:'delete-icon'},
				{text:"Exportar", scope:this, handler:this.exportPDF,iconCls:'pdf-icon'},
				{text:"Exportar", scope:this, handler:this.exportExcel,iconCls:'excel-icon'}
			],
			width	: 1000,
			height	: 300,
			items	: [this.grid]
		});
		win.show();
		
	},
	
	aviso: function()
	{
		alert("aviso");
	},
	
	onDelete : function(){
		var rows = this.grid.getSelectionModel().getSelections();

		if(rows.length === 0){
			return false;
		}
		
		this.storeGrid.remove(rows);
		Ext.MessageBox.alert('eProject','Registro(s) Eliminado(s) Con Éxito'); 
	},
	
	addContact : function(){
		var contact = new this.storeGrid.recordType({
			delegacion	: "",
			domicilio	: "",
			poblacion	: "",
			email	: "",
			cp: "",
			telefono: "",
			fax: "",
			provincia: "",
		});
		
		this.grid.stopEditing();
		this.storeGrid.insert(0,contact);
		this.grid.startEditing(0,1);
	},
	
	exportPDF: function(){
		var rows = this.grid.getSelectionModel().getSelections();
		var nSeleccionados = rows.length;
		var nElementos = this.storeGrid.getCount();
		var seleccionados = new Array();
		
		if(rows.length === 0){
			Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada'); 
			return false;
		}
		
		var i = 0;
		
		while (i<nSeleccionados)
		{
			seleccionados[i]=rows[i].id;
			i=i+1;
		}
		
		location.href="listado-delegaciones-sel.php?seleccion="+seleccionados;
		
	},
	
	exportExcel: function(){
		alert("exportar a Excel");
	}
	
	
}
Ext.onReady(com.quizzpot.tutorials.Crud.init,com.quizzpot.tutorials.Crud);
El caso es que al intentar editar una fila del grid, si que me aparece el dichoso combo con el displayField para poderlo seleccionar, pero al refrescar datos me vuelve a aparecer el valueField...

Gracias de antemano por su atención... un saludo.
  #2 (permalink)  
Antiguo 14/10/2011, 09:38
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

Hola, el problema pasa porque en tu store seguramente estas leyendo el id que asocias a tu valuefield pero no estas devolviendo lo que muestras en tu displayfield.

Desde mi punto de vista puedes hacer 2 cosas: por un lado devolver desde tu base de datos los valores del displayfield y al editar intervenir ese evento y enviar el id directo a la BD y luego volver a cargar el store de esta manera refrescar la información.

Por otro lado tienes el store asociado a tu combo por lo que puedes ocupar la propiedad renderer de la columna para que te devuelva el valor correspondiente al id buscando el valor correspondiente y asi no haces peticiones constantes al servidor, por ejemplo:

Código:
function desplegar(id){
    var st = Ext.StoreMgr.lookup('st_condicion');
    var index = st.find('id_interno',id);  
    var condicion;
		if(index>-1){
      var record = st.getAt(index);
      valor= record.get('descripcion');  
    }
		return valor;
  },
espero te sirva
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #3 (permalink)  
Antiguo 16/10/2011, 11:39
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

Gracias por tu ayuda, pero no sé muy bien cómo adaptar la función que me das a mi código, ¿podrías ayudarme un poco más?

¿Esa sería la función a ejecutar en renderer?

¿A qué te refieres con 'st condicion'? y con 'id interno'??

Un saludo.
  #4 (permalink)  
Antiguo 16/10/2011, 13:36
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

hola de nuevo!!! he intentado seguir mi intuición pero sigo sin conseguir que funcione, mi codigo ahora mismo es como sigue:

Código:
Ext.ns("com.quizzpot.tutorials");

com.quizzpot.tutorials.Crud = {
	init : function() {
		//CRUD
		var proxy = new Ext.data.HttpProxy({
			api: {
				read 	: "serverside/getContacts.php",
				create 	: "serverside/createContact.php",
				update	: "serverside/updateContact.php",
				destroy	: "serverside/destroyContact.php"
			}
		});
		
		var rd_random_employee_data = new Ext.data.JsonReader({}, ['idprovincia', 'descprovincia']);
		
		var provincias = new Ext.data.Store({
   			reader: new Ext.data.JsonReader({
        	fields: ['idprovincia', 'descprovincia'],
        	root: 'rows'}),
    		proxy: new Ext.data.HttpProxy({
        	url: 'serverside/getProvincias.php'
    		}),
			autoload:true
		});
		
		var provin = new Ext.form.ComboBox({  
			id: 'idprovincia',
			store: provincias,  
			valueField: 'idprovincia',  
			displayField: 'descprovincia',  
			mode: 'remote',  
			minChars : 0  ,
			autoload:true
		});
		
		function muestraDescripcion(valor)
		{ 
			var comboTipoPregunta = Ext.getCmp('provincias'); 
			var stx = comboTipoPregunta.getStore(); 
			var index = stx.find('provinciadelegacion',valor);   
			if(index>-1){ 
				var record = stx.getAt(index); 
				return record.get('descprovincia');   
			}   
	    };
		
		var reader = new Ext.data.JsonReader({
			totalProperty	: 'total',
			successProperty	: 'success',	//<--- el successproperty indica la propiedad que define si se ha insertado/actualizado o borrado con éxito
			messageProperty	: 'message',
			idProperty		: 'coddelegacion',
			
			root			: 'data'		//<--- este es el nombre del parámetro que llega al servidor con el JSON modificado
		},[
				{name: 'descdelegacion', allowBlank: false},
				{name: 'domiciliodelegacion', allowBlank: false},
				{name: 'poblaciondelegacion', allowBlank: false},
				{name: 'emaildelegacion', allowBlank: false},
				{name: 'telefonodelegacion', allowBlank: false},
				{name: 'faxdelegacion', allowBlank: false},
				{name: 'codpostaldelegacion', allowBlank: false},
				{name: 'provinciadelegacion', allowBlank: false}
				
		]);
			
		var writer = new Ext.data.JsonWriter({
			encode			: true,
			writeAllFields	: true	//<--- decide si se manda al servidor solamente los campos modificados o todos
		});
		
		this.storeGrid = new Ext.data.Store({
			id			: "id",
			proxy		: proxy,
			reader		: reader,
			writer		: writer,
			autoLoad: true,
			autoSave	: true	//<--- hace las peticiones al servidor automáticamente
		});
		
		var textFieldEmail = new Ext.form.TextField({vtype: "email",allowBlank: false}),
			textFieldDelegacion = new Ext.form.TextField({allowBlank: false}),
			textFieldDomicilio = new Ext.form.TextField({allowBlank: false}),
			textFieldPoblacion = new Ext.form.TextField({allowBlank: false}),
			
			sm = new Ext.grid.CheckboxSelectionModel();
		
		var textFieldTelefono = new Ext.form.TextField({
     		width: 80,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'999-999999',
                           clearInvalid:false
           })]
   		});
		
		var textFieldFax = new Ext.form.TextField({
     		width: 80,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'999-999999',
                           clearInvalid:false
           })]
   		});
		
		var textFieldCP = new Ext.form.TextField({
     		width: 60,
      		allowBlank:false,
      		maskRe : /['0-9'.-]$/,
                plugins: [new Ext.ux.InputTextMask({
                          mask:'99999',
                           clearInvalid:false
           })]
   		});
		
		var pag = new Ext.PagingToolbar({
				 store:this.storeGrid
				,displayInfo:true
				,pageSize:1
			});
		
		var gridId=Ext.id();
		
		
		this.grid = new Ext.grid.EditorGridPanel({
			store		: this.storeGrid,
			renderer:this.muestraDescripcion,
			id: gridId,
			columns		: [
				sm,
				{header:'Delegación', dataIndex:'descdelegacion',width:180,sortable: true, editor:textFieldDelegacion},
				{header:'E-mail', dataIndex:'emaildelegacion',sortable: true,width:180,editor:textFieldEmail},
				{header:'Domicilio', dataIndex:'domiciliodelegacion',sortable: true,width:150, editor:textFieldDomicilio},
				{header:'Población', dataIndex:'poblaciondelegacion',sortable: true,width:150, editor:textFieldPoblacion},
				{header:'Cod.Postal', dataIndex:'codpostaldelegacion',sortable: true,width:60, editor:textFieldCP},
				{header:'Teléfono', dataIndex:'telefonodelegacion',sortable: true,width:70, editor:textFieldTelefono},
				{header:'Fax', dataIndex:'faxdelegacion',sortable: true,width:70, editor:textFieldFax},
				{header:'Provincia', dataIndex:'provinciadelegacion',sortable: true,width:90, gridId: gridId, editor:provin, 
				}],
			sm			: sm,
			border		: false,
			stripeRows	: true,
			bbar: pag,
			
			clicksToEdit: 1
		});
		
		this.storeGrid.load();
		
		//this.grid.on('afteredit',this.datosProvincia('19'));
		
		var win = new Ext.Window({
			title	: "eProject - Gestión Delegaciones",
			layout	: "fit",
			tbar	: [  
				{text:'Añadir Delegación', scope:this, handler:this.addContact,iconCls:'save-icon'},
				{text:"Eliminar Selección", scope:this, handler:this.onDelete,iconCls:'delete-icon'},
				{text:"Exportar", scope:this, handler:this.exportPDF,iconCls:'pdf-icon'},
				{text:"Exportar", scope:this, handler:this.exportExcel,iconCls:'excel-icon'}
			],
			width	: 1000,
			height	: 300,
			items	: [this.grid]
		});
		win.show();
		
	},
	
	aviso: function()
	{
		alert("aviso");
	},
	
	onDelete : function(){
		var rows = this.grid.getSelectionModel().getSelections();

		if(rows.length === 0){
			return false;
		}
		
		this.storeGrid.remove(rows);
		Ext.MessageBox.alert('eProject','Registro(s) Eliminado(s) Con Éxito'); 
	},
	
	addContact : function(){
		var contact = new this.storeGrid.recordType({
			delegacion	: "",
			domicilio	: "",
			poblacion	: "",
			email	: "",
			cp: "",
			telefono: "",
			fax: "",
			provincia: "",
		});
		
		this.grid.stopEditing();
		this.storeGrid.insert(0,contact);
		this.grid.startEditing(0,1);
	},
	
	exportPDF: function(){
		var rows = this.grid.getSelectionModel().getSelections();
		var nSeleccionados = rows.length;
		var nElementos = this.storeGrid.getCount();
		var seleccionados = new Array();
		
		if(rows.length === 0){
			Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada'); 
			return false;
		}
		
		var i = 0;
		
		while (i<nSeleccionados)
		{
			seleccionados[i]=rows[i].id;
			i=i+1;
		}
		
		location.href="listado-delegaciones-sel.php?seleccion="+seleccionados;
		
	},
	
	exportExcel: function(){
		var rows = this.grid.getSelectionModel().getSelections();
		var nSeleccionados = rows.length;
		var nElementos = this.storeGrid.getCount();
		var seleccionados = new Array();
		
		if(rows.length === 0){
			Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada'); 
			return false;
		}
		
		var i = 0;
		
		while (i<nSeleccionados)
		{
			seleccionados[i]=rows[i].id;
			i=i+1;
		}
		
		location.href="excel-listado-delegaciones.php?seleccion="+seleccionados;
	}
}
Ext.onReady(com.quizzpot.tutorials.Crud.init,com.quizzpot.tutorials.Crud);
GRACIAS POR TU ATENCIÓN!!!! Espero que puedas ayudarme.
  #5 (permalink)  
Antiguo 17/10/2011, 09:28
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

hola, el renderer debes colocarlo en la columna donde quieres que se muestre el valro correcto asociado al id, es decir

{header:'Provincia', dataIndex:'provinciadelegacion',sortable: true,width:90, gridId: gridId, editor:provin, renderer: muestraDescripcion }

con el resto de tu código no debería darte problemas.
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #6 (permalink)  
Antiguo 17/10/2011, 12:48
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

Hola de nuevo,

he incluido lo que me comentas y en la línea 40 (que es la que te indico en negrita. al menos de mi código) me da error 'undefinided es nulo o no es un objeto' al cargar la página y no llega a visualizar nada... tienes idea del por qué?

Ext.ns("com.quizzpot.tutorials");

com.quizzpot.tutorials.Crud = {
init : function() {
//CRUD
var proxy = new Ext.data.HttpProxy({
api: {
read : "serverside/getContacts.php",
create : "serverside/createContact.php",
update : "serverside/updateContact.php",
destroy : "serverside/destroyContact.php"
}
});

var rd_random_employee_data = new Ext.data.JsonReader({}, ['idprovincia', 'descprovincia']);

var provincias = new Ext.data.Store({
reader: new Ext.data.JsonReader({
fields: ['idprovincia', 'descprovincia'],
root: 'rows'}),
proxy: new Ext.data.HttpProxy({
url: 'serverside/getProvincias.php'
}),
autoload:true
});

var provin = new Ext.form.ComboBox({
id: 'idprovincia',
store: provincias,
valueField: 'idprovincia',
displayField: 'descprovincia',
mode: 'remote',
minChars : 0 ,
autoload:true
});

function muestraDescripcion(valor)
{
var comboTipoPregunta = Ext.getCmp('provincias');
var stx = comboTipoPregunta.getStore();
var index = stx.find('provinciadelegacion',valor);
if(index>-1){
var record = stx.getAt(index);
return record.get('descprovincia');
}
};

var reader = new Ext.data.JsonReader({
totalProperty : 'total',
successProperty : 'success', //<--- el successproperty indica la propiedad que define si se ha insertado/actualizado o borrado con éxito
messageProperty : 'message',
idProperty : 'coddelegacion',

root : 'data' //<--- este es el nombre del parámetro que llega al servidor con el JSON modificado
},[
{name: 'descdelegacion', allowBlank: false},
{name: 'domiciliodelegacion', allowBlank: false},
{name: 'poblaciondelegacion', allowBlank: false},
{name: 'emaildelegacion', allowBlank: false},
{name: 'telefonodelegacion', allowBlank: false},
{name: 'faxdelegacion', allowBlank: false},
{name: 'codpostaldelegacion', allowBlank: false},
{name: 'provinciadelegacion', allowBlank: false}

]);

var writer = new Ext.data.JsonWriter({
encode : true,
writeAllFields : true //<--- decide si se manda al servidor solamente los campos modificados o todos
});

this.storeGrid = new Ext.data.Store({
id : "id",
proxy : proxy,
reader : reader,
writer : writer,
autoLoad: true,
autoSave : true //<--- hace las peticiones al servidor automáticamente
});

var textFieldEmail = new Ext.form.TextField({vtype: "email",allowBlank: false}),
textFieldDelegacion = new Ext.form.TextField({allowBlank: false}),
textFieldDomicilio = new Ext.form.TextField({allowBlank: false}),
textFieldPoblacion = new Ext.form.TextField({allowBlank: false}),

sm = new Ext.grid.CheckboxSelectionModel();

var textFieldTelefono = new Ext.form.TextField({
width: 80,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'999-999999',
clearInvalid:false
})]
});

var textFieldFax = new Ext.form.TextField({
width: 80,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'999-999999',
clearInvalid:false
})]
});

var textFieldCP = new Ext.form.TextField({
width: 60,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'99999',
clearInvalid:false
})]
});

var pag = new Ext.PagingToolbar({
store:this.storeGrid
,displayInfo:true
,pageSize:1
});

var gridId=Ext.id();


this.grid = new Ext.grid.EditorGridPanel({
store : this.storeGrid,
renderer:this.muestraDescripcion,
id: gridId,
columns : [
sm,
{header:'Delegación', dataIndex:'descdelegacion',width:180,sortable: true, editor:textFieldDelegacion},
{header:'E-mail', dataIndex:'emaildelegacion',sortable: true,width:180,editor:textFieldEmail},
{header:'Domicilio', dataIndex:'domiciliodelegacion',sortable: true,width:150, editor:textFieldDomicilio},
{header:'Población', dataIndex:'poblaciondelegacion',sortable: true,width:150, editor:textFieldPoblacion},
{header:'Cod.Postal', dataIndex:'codpostaldelegacion',sortable: true,width:60, editor:textFieldCP},
{header:'Teléfono', dataIndex:'telefonodelegacion',sortable: true,width:70, editor:textFieldTelefono},
{header:'Fax', dataIndex:'faxdelegacion',sortable: true,width:70, editor:textFieldFax},
{header:'Provincia', dataIndex:'provinciadelegacion',sortable: true,width:90, gridId: gridId, editor:provin, renderer: muestraDescripcion
}],
sm : sm,
border : false,
stripeRows : true,
bbar: pag,

clicksToEdit: 1
});

this.storeGrid.load();

//this.grid.on('afteredit',this.datosProvincia('19') );

var win = new Ext.Window({
title : "eProject - Gestión Delegaciones",
layout : "fit",
tbar : [
{text:'Añadir Delegación', scope:this, handler:this.addContact,iconCls:'save-icon'},
{text:"Eliminar Selección", scope:this, handler:this.onDelete,iconCls:'delete-icon'},
{text:"Exportar", scope:this, handler:this.exportPDF,iconCls:'pdf-icon'},
{text:"Exportar", scope:this, handler:this.exportExcel,iconCls:'excel-icon'}
],
width : 1000,
height : 300,
items : [this.grid]
});
win.show();

},

aviso: function()
{
alert("aviso");
},

onDelete : function(){
var rows = this.grid.getSelectionModel().getSelections();

if(rows.length === 0){
return false;
}

this.storeGrid.remove(rows);
Ext.MessageBox.alert('eProject','Registro(s) Eliminado(s) Con Éxito');
},

addContact : function(){
var contact = new this.storeGrid.recordType({
delegacion : "",
domicilio : "",
poblacion : "",
email : "",
cp: "",
telefono: "",
fax: "",
provincia: ""
});

this.grid.stopEditing();
this.storeGrid.insert(0,contact);
this.grid.startEditing(0,1);
},

exportPDF: function(){
var rows = this.grid.getSelectionModel().getSelections();
var nSeleccionados = rows.length;
var nElementos = this.storeGrid.getCount();
var seleccionados = new Array();

if(rows.length === 0){
Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada');
return false;
}

var i = 0;

while (i<nSeleccionados)
{
seleccionados[i]=rows[i].id;
i=i+1;
}

location.href="listado-delegaciones-sel.php?seleccion="+seleccionados;

},

exportExcel: function(){
var rows = this.grid.getSelectionModel().getSelections();
var nSeleccionados = rows.length;
var nElementos = this.storeGrid.getCount();
var seleccionados = new Array();

if(rows.length === 0){
Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada');
return false;
}

var i = 0;

while (i<nSeleccionados)
{
seleccionados[i]=rows[i].id;
i=i+1;
}

location.href="excel-listado-delegaciones.php?seleccion="+seleccionados;
}
}
Ext.onReady(com.quizzpot.tutorials.Crud.init,com.q uizzpot.tutorials.Crud);

Gracias de nuevo!
  #7 (permalink)  
Antiguo 17/10/2011, 13:24
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

eso pasa porque a tu combo le pusiste 'idprovincia' y estas tratando de acceder al combo con 'provincia'.


yo prefiero usar Ext.StoreMgr.lookup('el_id_del_store');

pero deberas configurarle un id al store

var provincias = new Ext.data.Store({
storeId: 'st_provincias',
reader: new Ext.data.JsonReader({
fields: ['idprovincia', 'descprovincia'],
root: 'rows'}),
proxy: new Ext.data.HttpProxy({
url: 'serverside/getProvincias.php'
}),
autoload:true
});
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #8 (permalink)  
Antiguo 17/10/2011, 13:32
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

Disculpa pero no te entiendo... le incluyo el storeId que me indicas y luego modifico la función? o dónde prefieres usar Ext.StoreMgr.lookup??
  #9 (permalink)  
Antiguo 17/10/2011, 14:14
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

en :

function muestraDescripcion(valor)
{
var comboTipoPregunta = Ext.getCmp('provincias');
var stx = comboTipoPregunta.getStore();
var index = stx.find('provinciadelegacion',valor);
if(index>-1){
var record = stx.getAt(index);
return record.get('descprovincia');
}
};

donde dice :

var comboTipoPregunta = Ext.getCmp('provincias');

deberia decir:

var comboTipoPregunta = Ext.getCmp('idprovincias');

y mi sugerencia es que en vez de hacerlo asi:

var comboTipoPregunta = Ext.getCmp('provincias');
var stx = comboTipoPregunta.getStore();


lo hagas asi:

var stx = Ext.StoreMgr.lookup('st_provincias');


pero deberás agregarle una linea a tu store:

var provincias = new Ext.data.Store({
storeId: 'st_provincias',
reader: new Ext.data.JsonReader({
fields: ['idprovincia', 'descprovincia'],
root: 'rows'}),
proxy: new Ext.data.HttpProxy({
url: 'serverside/getProvincias.php'
}),
autoload:true
});


espero te sirva
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #10 (permalink)  
Antiguo 17/10/2011, 14:22
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

He probado lo que me dices y al cargar el grid no me muestra nada en el campo provincia, sin embargo al seleccionar el campo provincia para editarlo, se me abre el combo de manera correcta y una vez seleccionado un valor al guardar los cambios si que aparece la descripción de la provincia en la fila determinada que he editado, el resto sirve vacío...

Sin embargo, otra curiosidad, si desde el punto anterior utilizo el botón de refrescar de la barra inferior de paginado, me aparece la descripción de todas las filas del grid...

Esto empieza a ser de expediente X y empiezo a creer que el problema radica en la carga de datos del grid...

Qué desesperación....

Gracias.
  #11 (permalink)  
Antiguo 17/10/2011, 14:23
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

Ahora mismo mi código está como sigue:

Ext.ns("com.quizzpot.tutorials");

com.quizzpot.tutorials.Crud = {
init : function() {
//CRUD
var proxy = new Ext.data.HttpProxy({
api: {
read : "serverside/getContacts.php",
create : "serverside/createContact.php",
update : "serverside/updateContact.php",
destroy : "serverside/destroyContact.php"
}
});

var rd_random_employee_data = new Ext.data.JsonReader({}, ['idprovincia', 'descprovincia']);

var provincias = new Ext.data.Store({
reader: new Ext.data.JsonReader({
fields: ['idprovincia', 'descprovincia'],
root: 'rows'}),
proxy: new Ext.data.HttpProxy({
url: 'serverside/getProvincias.php'
}),
autoload:true
});

var provin = new Ext.form.ComboBox({
id: 'idprovincia',
storeId: 'st_provincias',
store: provincias,
valueField: 'idprovincia',
displayField: 'descprovincia',
mode: 'remote',
minChars : 0 ,
autoload:true
});

function muestraDescripcion(valor)
{
var comboTipoPregunta = Ext.getCmp('idprovincia');
var stx = Ext.StoreMgr.lookup('st_provincias');
if(index>-1){
var record = stx.getAt(index);
return record.get('descprovincia');
}
};

var reader = new Ext.data.JsonReader({
totalProperty : 'total',
successProperty : 'success', //<--- el successproperty indica la propiedad que define si se ha insertado/actualizado o borrado con éxito
messageProperty : 'message',
idProperty : 'coddelegacion',

root : 'data' //<--- este es el nombre del parámetro que llega al servidor con el JSON modificado
},[
{name: 'descdelegacion', allowBlank: false},
{name: 'domiciliodelegacion', allowBlank: false},
{name: 'poblaciondelegacion', allowBlank: false},
{name: 'emaildelegacion', allowBlank: false},
{name: 'telefonodelegacion', allowBlank: false},
{name: 'faxdelegacion', allowBlank: false},
{name: 'codpostaldelegacion', allowBlank: false},
{name: 'provinciadelegacion', allowBlank: false}

]);

var writer = new Ext.data.JsonWriter({
encode : true,
writeAllFields : true //<--- decide si se manda al servidor solamente los campos modificados o todos
});

this.storeGrid = new Ext.data.Store({
id : "id",
proxy : proxy,
reader : reader,
writer : writer,
autoLoad: true,
autoSave : true //<--- hace las peticiones al servidor automáticamente
});

var textFieldEmail = new Ext.form.TextField({vtype: "email",allowBlank: false}),
textFieldDelegacion = new Ext.form.TextField({allowBlank: false}),
textFieldDomicilio = new Ext.form.TextField({allowBlank: false}),
textFieldPoblacion = new Ext.form.TextField({allowBlank: false}),

sm = new Ext.grid.CheckboxSelectionModel();

var textFieldTelefono = new Ext.form.TextField({
width: 80,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'999-999999',
clearInvalid:false
})]
});

var textFieldFax = new Ext.form.TextField({
width: 80,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'999-999999',
clearInvalid:false
})]
});

var textFieldCP = new Ext.form.TextField({
width: 60,
allowBlank:false,
maskRe : /['0-9'.-]$/,
plugins: [new Ext.ux.InputTextMask({
mask:'99999',
clearInvalid:false
})]
});

var pag = new Ext.PagingToolbar({
store:this.storeGrid
,displayInfo:true
,pageSize:1
});

var gridId=Ext.id();


this.grid = new Ext.grid.EditorGridPanel({
store : this.storeGrid,
renderer:this.muestraDescripcion,
id: gridId,
columns : [
sm,
{header:'Delegación', dataIndex:'descdelegacion',width:180,sortable: true, editor:textFieldDelegacion},
{header:'E-mail', dataIndex:'emaildelegacion',sortable: true,width:180,editor:textFieldEmail},
{header:'Domicilio', dataIndex:'domiciliodelegacion',sortable: true,width:150, editor:textFieldDomicilio},
{header:'Población', dataIndex:'poblaciondelegacion',sortable: true,width:150, editor:textFieldPoblacion},
{header:'Cod.Postal', dataIndex:'codpostaldelegacion',sortable: true,width:60, editor:textFieldCP},
{header:'Teléfono', dataIndex:'telefonodelegacion',sortable: true,width:70, editor:textFieldTelefono},
{header:'Fax', dataIndex:'faxdelegacion',sortable: true,width:70, editor:textFieldFax},
{header:'Provincia', dataIndex:'provinciadelegacion',sortable: true,width:90, gridId: gridId, editor:provin, renderer: muestraDescripcion
}],
sm : sm,
border : false,
stripeRows : true,
bbar: pag,

clicksToEdit: 1
});

this.storeGrid.load();

//this.grid.on('afteredit',this.datosProvincia('19') );

var win = new Ext.Window({
title : "eProject - Gestión Delegaciones",
layout : "fit",
tbar : [
{text:'Añadir Delegación', scope:this, handler:this.addContact,iconCls:'save-icon'},
{text:"Eliminar Selección", scope:this, handler:this.onDelete,iconCls:'delete-icon'},
{text:"Exportar", scope:this, handler:this.exportPDF,iconCls:'pdf-icon'},
{text:"Exportar", scope:this, handler:this.exportExcel,iconCls:'excel-icon'}
],
width : 1000,
height : 300,
items : [this.grid]
});
win.show();

},

aviso: function()
{
alert("aviso");
},

onDelete : function(){
var rows = this.grid.getSelectionModel().getSelections();

if(rows.length === 0){
return false;
}

this.storeGrid.remove(rows);
Ext.MessageBox.alert('eProject','Registro(s) Eliminado(s) Con Éxito');
},

addContact : function(){
var contact = new this.storeGrid.recordType({
delegacion : "",
domicilio : "",
poblacion : "",
email : "",
cp: "",
telefono: "",
fax: "",
provincia: ""
});

this.grid.stopEditing();
this.storeGrid.insert(0,contact);
this.grid.startEditing(0,1);
},

exportPDF: function(){
var rows = this.grid.getSelectionModel().getSelections();
var nSeleccionados = rows.length;
var nElementos = this.storeGrid.getCount();
var seleccionados = new Array();

if(rows.length === 0){
Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada');
return false;
}

var i = 0;

while (i<nSeleccionados)
{
seleccionados[i]=rows[i].id;
i=i+1;
}

location.href="listado-delegaciones-sel.php?seleccion="+seleccionados;

},

exportExcel: function(){
var rows = this.grid.getSelectionModel().getSelections();
var nSeleccionados = rows.length;
var nElementos = this.storeGrid.getCount();
var seleccionados = new Array();

if(rows.length === 0){
Ext.MessageBox.alert('eProject','No Ha Seleccionado Nada');
return false;
}

var i = 0;

while (i<nSeleccionados)
{
seleccionados[i]=rows[i].id;
i=i+1;
}

location.href="excel-listado-delegaciones.php?seleccion="+seleccionados;
}
}
Ext.onReady(com.quizzpot.tutorials.Crud.init,com.q uizzpot.tutorials.Crud);
  #12 (permalink)  
Antiguo 17/10/2011, 14:49
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

"He probado lo que me dices y al cargar el grid no me muestra nada en el campo provincia"

-- al cargar el grid y lees de tu base de datos esa columna ya viene con algun valor, puedes chequear lo que te devuelve usando el firebug y ademas colocando dentro de la funcion muestraDescripcion un console para revisar que valor te está devolviendo efectivamente, algo asi como:

console.log(valor);

", sin embargo al seleccionar el campo provincia para editarlo, se me abre el combo de manera correcta y una vez seleccionado un valor al guardar los cambios si que aparece la descripción de la provincia en la fila determinada que he editado, el resto sirve vacío..."

-- creo que eso explicaria que los valores iniciales no son los que esperas en esa columna


"Sin embargo, otra curiosidad, si desde el punto anterior utilizo el botón de refrescar de la barra inferior de paginado, me aparece la descripción de todas las filas del grid..."

-- este punto es interesante, es probable que sea que el store de tu combo aun no este cargado al momento de iniciar la pagina, recuerda que la carga de un store es asincronica lo que quiere decir que se carga de manera independiente de la carga del resto del código, por lo que la refrescar el store ya estaría cargado y encontraría que valores retornar

[...]

"Qué desesperación...."

--no te preocupes siempre es así al principio ya veras que entre mas cosas hagas con el lenguaje después todo será transparente como el cristal. Al principio no daba pie con bola y vieras los sistemas que tengo desarrollados ahora ;)
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #13 (permalink)  
Antiguo 17/10/2011, 14:57
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

no te lo vas a creer..... con la simple instrucción provincias.load(); se ha solucionado el problema...

Me has salvado la vida con tu paciencia y atención...

Ahora a pelearme con el paginado, que también me da guerra, ya que me calcula bien las páginas que tendrían que cargarse pero en la primera carga de datos, visualiza todos los datos, sin hacer la paginación en si.

¿Sería mucho abusar si me ayudaras también con ese tema?

Gracias!!!
  #14 (permalink)  
Antiguo 17/10/2011, 15:07
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

en pedir no hay engaño ;)

el tema del paginado tiene su truco, normalmente junto con el store debes enviar el start y el limit como parámetros y del lado del php donde tienes tu consulta debes hacer 2 veces la consulta, una con la cual contaras las filas devueltas y otra(que es la misma) agregándole el LIMIT 'el valor de start', 'el valor de limit'

no se como trabajas tus archivos por el lado del servidor así que eso puedo decirte por ahora
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #15 (permalink)  
Antiguo 17/10/2011, 15:13
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

El código para obtener los datos del grid es:

<?php
$connection= mysql_connect("localhost","kszwsoso_ugespro","uges pro") or die("Connection Failed".mysql_error());
mysql_select_db("kszwsoso_gestorproyectos",$connec tion)or die("Error loading the DataBase".mysql_error());

//$result= mysql_query("SELECT * FROM gestdelegaciones001");
$result= mysql_query("SELECT coddelegacion,descdelegacion,domiciliodelegacion,p oblaciondelegacion,provinciadelegacion,descprovinc ia,codpostaldelegacion,telefonodelegacion,faxdeleg acion,emaildelegacion FROM gestdelegaciones001,gestprovin001 WHERE gestdelegaciones001.provinciadelegacion=gestprovin 001.idprovincia AND baja=0");

$data= array();
$metadata = array();

while($row= mysql_fetch_array($result)){
array_push($data,array(
"coddelegacion" => $row["coddelegacion"],
"descdelegacion" => $row["descdelegacion"],
"domiciliodelegacion" => $row["domiciliodelegacion"],
"poblaciondelegacion" => $row["poblaciondelegacion"],
"provinciadelegacion" => $row["provinciadelegacion"],
"codpostaldelegacion" => $row["codpostaldelegacion"],
"telefonodelegacion" => $row["telefonodelegacion"],
"faxdelegacion" => $row["faxdelegacion"],
"emaildelegacion" => $row["emaildelegacion"],
));
}

echo json_encode(
array(
"success" => true,
"data" => $data
));

únicamente tengo 5 registros en mi base de datos, actualmente lo que hace es que me carga los 5 registros en la 1ª página (sin considerar el paginado) aunque si que me visualiza en la barra del paginado total 5 paginas, 1 de 5, 2 de 5... pero al pasar de página no cambia la información visualizada.

No Sé si me explico...
  #16 (permalink)  
Antiguo 17/10/2011, 15:48
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

quieres devolver solo un registro por pagina? o es parte de la prueba que haces del paginado?

te pego aquí como lo hago yo para ver si te sirve, de hecho si vas a devolver los campos con el mismo nombre que tienen en la base de datos este codigo es mas eficiente que escribir pareados los datos como lo haces en tu codigo:

Código:
$start = (integer) (isset($_POST['start']) ? $_POST['start'] : 0);
$end = (integer) (isset($_POST['limit']) ? $_POST['limit'] : 10000); 
$sortDir = isset($_POST['dir']) ? $_POST['dir'] : "ASC";
$sortBy = isset($_POST['sort']) ? $_POST['sort'] : "id"; //este campo es por el cual quieres ordenar

$sql_count = "SELECT * 	FROM mitabla";
$sql  = $sql_count . ' ORDER BY ' . $sortBy. ' ' . $sortDir . ' LIMIT ';
$sql .= $start . ', '. $end;
$result_count = mysql_query($sql_count) or die();
$total = mysql_num_rows($result_count);
$arr = array();
$rs = mysql_query($sql) or die(falla('servidor',mysql_errno()));
while($obj = mysql_fetch_object($rs)){
  $arr[] = $obj;
}
echo '{"success":true, "total" : '.$total.', "data":'.json_encode($arr).'}';
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #17 (permalink)  
Antiguo 17/10/2011, 15:52
 
Fecha de Ingreso: julio-2009
Mensajes: 90
Antigüedad: 15 años, 3 meses
Puntos: 4
Respuesta: Combo ExtJS

ah y lo del provincias.load(); ha sido porque en la definicion de tu store colocaste

autoload: true

y deberia ser

autoLoad: true

recuerda lo del "case sensitive" porque te puede evitar mas de un dolor de cabeza innecesario
__________________
C[^L*]D
[email protected]
tokkaido.blogspot.com
No hay mejor forma de aprender que enseñar
  #18 (permalink)  
Antiguo 18/10/2011, 08:24
 
Fecha de Ingreso: febrero-2007
Mensajes: 56
Antigüedad: 17 años, 9 meses
Puntos: 1
Respuesta: Combo ExtJS

Muchas gracias! Tu ayuda me ha servido para resolver mis últimos 2 problemas...

Ahora mi siguiente reto es conseguir la búsqueda en el grid, veremos cómo se da al cosa.

Un saludo.

Etiquetas: combo, extjs, js, php
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:12.