Uso jquery, json y ajax en la vista y Spring mvc para los controladores.
Tengo que hacer un buscador con las siguientes características:
El número de cambos de búsqueda es variable, es decir se pueden añadir o eliminar.
Existes selects multiples.
Se incluye paginación, por lo tanto envío el número de página y los elementos por página.
Con la típica llamada por ajax, enviando el formulario sin los parámetros de paginación, no tengo ningún problema en recuperar los parámetros:
Código PHP:
$.ajax({
url: form.attr("action"),
type: 'POST',
data: form.serialize(),
dataType: 'json',
cache: false
}).success(function(data) {
callback(data);
});
codigoItem 234234
nombreItem foo
provinciaItem 0
publico on
tipoItem 1000600
tipoItem 1000492
Los select multiples los envía bajo la misma clave, en el controlador utilizo un MultiValueMap,
los recupero e imprimo los valores por consola, utilizo el MultiValueMap así crea un array de strings con en el caso de tipoItem.
Código PHP:
public HashMap<String, Object> buscador(MultiValueMap<String, List<String>>)
{
}
Código PHP:
var data = {
'params': form.serialize(),
'page': start,
'itemsPerPage': end
};
Código PHP:
public class SearchDto {
private int page;
private int itemsPerPage;
private MultiValueMap<String, List<String>> params;
public SearchDto() {
super();
}
}
Código PHP:
public HashMap<String, Object> buscador(SearchDto searchRequest)
{
}
page 1
params codigoItem=234234&nombreItem=foo&tipoItem=1000600& tipoItem=1000492&publico=on&provinciaItem=0
itemsPerPate 5
Evidentemente esto no me vale, después he probado con serializeArray() y lo transforma en un objeto jsón, pero de la siguiente forma y no me funciona;
params [10] [name] munItem
params [10] [value] 270
params [11] [name] munItem
params [11] [value] 276
params [13] [name] capItem
params [13] [value] 123123
params [2] [name] codItem
params [2] [value] asdfasdf
params [3] [name] nameItem
params [3] [value] asdfasdfasdf
params [4] [name] tipItem
params [4] [value] 1000600
params [5] [name] tipItem
params [5] [value] 1000492
params [6] [name] public
params [6] [value] on
params [7] [name] private
params [7] [value] on
params [8] [name] provinceItem
params [8] [value] 15
params [9] [name] munItem
params [9] [value] 262
He usado una función que he encontrado por internet, que lo arregla, y funciona menos con los selects multivalor, en ese caso crea un array en javascript y tira un error.
Código PHP:
var o = {};
var a = form.serializeArray();
$.each(a, function(){
if (o[this.name]) {
if (!o[this.name].push) {
o[this.name] = [o[this.name]];
}
o[this.name].push(this.value || '');
} else {
o[this.name] = this.value || '';
}
});
var data = {
'params': o,
'page': start,
'itemsPerPage': end
};
itemsPerPage 5
page 1
params[codigoItem] 123456
params[municipioItem] 270
params[nomeItem] foo
params[provinciaItem] 0
params[publico] on
params[tipoItem][] 1000600
params[tipoItem][] 1000492
Al crear un array, por ajax lo envía sin índice y me peta el controlador, es caso es que no se como obtenerlo en este caso, en los otros casos funciona perfectamente.
Se que es bastante complejo y no sabía si ponerlo en el foro de java o de javascript ya que creo que tendré que tocar ambas partes. Alguien pude ayudarme??
UN saludo y gracias.