Ver Mensaje Individual
  #1 (permalink)  
Antiguo 27/08/2014, 12:03
oskrok
 
Fecha de Ingreso: febrero-2006
Mensajes: 43
Antigüedad: 18 años, 1 mes
Puntos: 1
Recuperar parámetros de un buscador y numeros de página enviados por ajax

Antes de nada voy a describir lo que tengo que hacer y lo que estoy utilizando.
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({
            
urlform.attr("action"),
            
type'POST',
            
dataform.serialize(),
            
dataType'json',
            
cachefalse
          
}).success(function(data) {
            
callback(data);
          }); 
De esta forma se envía:

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<StringObjectbuscador(MultiValueMap<String, List<String>>)
  {
  } 
El siguiente paso es crear una estructura del tipo

Código PHP:
          var data = {  
            
'params'form.serialize(),
            
'page'start,
            
'itemsPerPage'end  
          
}; 
He creado una clase DTO
Código PHP:
public class SearchDto {
  
  private 
int page;
  
  private 
int itemsPerPage;
  
  private 
MultiValueMap<String, List<String>> params;

  public 
SearchDto() {
    
super();
  }

Y en el controlador:
Código PHP:
  public HashMap<StringObjectbuscador(SearchDto searchRequest)
  {
  } 
Con esta estructura me envía;
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 = {};
          var 
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  
          
}; 
Así envía:

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.