PDA

View Full Version : Grid + combobox, problem with the store



Nexus3
9 Mar 2011, 11:29 PM
Hi, first sorry because my english is no long.

I have a paginated grid, which, in the first load show all the products of my database. The question is, I have a toolbar with a combo that allows load in the grid only products of a given family, everything correct until this point, It appears in the grid only products of this family, but when I click the pagination button to see next page, it shows me page two of the first selection (all products). I don't know why the params of the second query are not maintained .........

/ / I create a variable with parameters to access them

var parameters = {action: 'search', param1:'', param2:'', start: 0, limit: 25};


/ / I create the store, it loads all products on the grid when page load for 1 st time

var ds = new Ext.data.JsonStore({
url: 'globals/ajaxSearchProductsAll.php',
method:'POST',
totalProperty: 'total',
root: 'data',
fields: ['idProducto','nombre','comentarios','familia','referencia','codigo'],
selectRow: function(idGrid,row){

Ext.getCmp(idGrid).getSelectionModel().selectRow(row)

},
baseParams:parametros// Here load params
});

ds.load();

//Create combo

var comboProductosFamilia = new Ext.form.ComboBox({
store: storeComboProductosFamilia,
displayField:'idCategoria',
typeAhead: false,
loadingText: 'Searching...',
width: 200,
pageSize:10,
emptyText: 'Busqueda por familia',
triggerAction:'query',
mode: 'remote',
minChars:0,
listWidth:450,
tpl: resultTpl2,
itemSelector: 'div.search-item',
onSelect: function(record){
this.collapse();

ds.on('load',function(){

Ext.getCmp('grid-prods').getSelectionModel().selectRow(0);

});
// Here i change the params
parametros = {action:'search', param1:'familia', param2:record.data.idCategoria, start:0,limit:25};
ds.load({params:parametros});
}
});

When i use the combo, i change params values, and the grid show only determinated products, but when i click the pagination button to see next page, lose this selection and show me the second page of the first query (all the products not the selection that i load in the grid with the combobox).

I dont know why i lose the params of the second query, the params variable that i created is global.

I hope you can understand my english.
Thanks.

Nexus3
10 Mar 2011, 3:45 AM
somebody knows something about it???????

brittongr
11 Mar 2011, 7:15 AM
Te respondo es español pues con lo vi del codigo parece que es tu primer idioma.
La razon por la cual al parecer sucede eso es porque estas dejando fijo el parametro start en luegar de ponerlo dinamicamente con el objeto "paging" que creas para agregar el paginador el GridPanel, para eso tenes que acceder a la propiedad "cursor" que es la que te indica en el servidor que pagina es la que vas a cargar:



ds.load({
params:{
start: paging.cursor
//otros parametros
}
});

El baseParams lo deberias usar para los parametros que son constantes como el limit, que no normalmente no cambia al menos que tengas implementado alguna forma para que se cambie dinamicamente la cantidad de registros, y el params para los parametros que son mas variables.

Espero te ayude, si tienes otra duda puedes responder aqui mismo en español...

Nexus3
11 Mar 2011, 10:25 PM
Hola brittongr

Gracias por la contestacion. La verdad es que no entiendo muy bien la solucion. Es la 1ª vez que veo la propiedad start, y no la consigo ver en la documentacion. Tampoco lo de paging.cursor.
Si pudieses explicarmelo.....

Al final, consegui mantener los parametros haciendo una chapuza. Cuando pulso en el combo y cargo los nuevos productos en el store, lo que hago es cambiar los baseParams del store.

ds.baseParams= .....

Se que no es lo correcto, pero no entiendo bien lo que se consigue con la propiedad start y la propiedad cursor del paging.


Mil gracias

brittongr
12 Mar 2011, 12:35 AM
La propiedad start te indica en que indice de los registros inician el conteo. Por ejemplo si tienes 20 registros en tu tabla en la base de datos y creas un grid panel y lo configuras para que tenga un pageSize de 10 registros por pagina entonces haces esto:

store.load({params: start:0, limit:10})

El conteo inicia en 0, por lo tanto en el servidor puedes hacer una consulta con esos parametros para paginar los registros
Por ejemplo para mysql:

SELECT * FROM tbl LIMIT start, limit; # Retrieve rows 6-15
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15


The LIMIT clause can be used to constrain the number of rows returned by the SELECT (http://dev.mysql.com/doc/refman/5.0/en/select.html) statement. LIMIT takes one or two numeric arguments, which must both be nonnegative integer constants (except when using prepared statements). With two arguments, the first argument specifies the offset of the first row to return, and the second specifies the maximum number of rows to return. The offset of the initial row is 0 (not 1):


Usando entity framework:
response.data = objectSet.OrderUsingSortExpression(GetOrderExpression()).Skip(start).Take(limit).ToList();

Pero el parametro start solo es necesario especificarlo la primera vez que se manda a cargar el store, luego el paginador automaticamente configura ese parametro para enviarlo en la peticion.

Yo acostumbro crear dos funciones siempre una para los baseParams y otra para los otros parametros.



//Primero creo el paging aparte
var paging = new Ext.PagingToolbar(
{
store: ds,
displayInfo: true,
pageSize: 25
});

//Luego lo asigno en el gridPanel

//Despues que creo el grid panel llamo a la funcion loadDataSource

loadDataSource();

function assignBaseParams()
{
ds.baseParams.limit = paging.pageSize; //Esta linea no es necesaria
ds.baseParams.search = searchField.getValue();
//Puede ser que en tu caso configures aqui el parametro action
ds.baseParams.action = 'search';
}

function loadDataSource()
{
//Aqui es donde yo pondria los otros parametros que necesito
ds.load({
params:{
start: paging.cursor,
param2: comboBoxCategoria.getValue()
});
//En lugar de poner una funcion asignada al evento select del combobox nada mas le asignaria el loadDataSource
//y aqui adentro leeria el valor que tiene en ese momento el comboBox pero eso depende de que es lo que se tiene
//que configurar con ese evento.
}
}

Nexus3
12 Mar 2011, 11:07 PM
Hola brittongr,

Perdona que no contestase antes antes, pero tengo que entregar el proyecto esta semana que entra y voy algo retrasado, me decidi a hacer toda la zona de gestion con ext y está siendo mas lento de lo que pense.....

Gracias por la explicación, entiendo lo que quieres decir, asignar una funcion que directamente rescate el valor del combo y cambie los params del store. La verdad es que si, por fin esta funcionando correctamente!!!!

Voy a ver si sigo con esta locura....... Cualquier cosa, aqui estoy, no soy ningun gurú pero siempre 2 mejor que 1 (si se puede intentar ayudar).

Muchas gracias por tu tiempo y dedicacion.

brittongr
12 Mar 2011, 11:53 PM
Hola Nexus, que bien que te haya funcionado, te he enviado un mensaje privado...