2011-03-22 16 views
5

Estoy usando el plugin jqGrid más excelente, y he encontrado mucha ayuda en este sitio buscando, pero he encontrado un problema que no puedo resolver o encontrar una solución. Esta será mi primera publicación aquí.jqGrid búsqueda avanzada 'beforeSearch' opción?

Estoy usando una filterToolbar para hacer algunas búsquedas en mi grilla. Debido a la naturaleza del back-end con el que necesito interactuar, no puedo utilizar los filtros que proporciona jqGrid, y en su lugar tengo que interceptar la búsqueda y modificar los datos posteriores antes de enviarlos. Hago esto con la filterToolbar opción "beforeSearch" de esta manera:

$("#SC_grid").jqGrid('filterToolbar', {stringResult: true, searchOnEnter: true, defaultSearch : "cn", beforeSearch: function() { 
      var postData = $("#SC_grid").jqGrid('getGridParam','postData'); 
      var newPostData = '1=1'; 
      var searchData = jQuery.parseJSON(postData.filters); 
      for (var iRule=0; iRule<searchData.rules.length; iRule++) { 
       newPostData = newPostData + " AND " + searchData.rules[iRule].field + " LIKE '%" + searchData.rules[iRule].data + "%' "; 
      } 
      $("#SC_grid").jqGrid('setGridParam',{postData: { filter: newPostData, filters: ''} }); 
      return false; 
}}); 

Esto funciona muy bien para mí para construir una parte de mi selecto antes de su presentación. También me gustaría utilizar la búsqueda avanzada de la misma manera, pero no puedo encontrar la manera de interceptar el POST antes de enviarlo. No parece haber una opción beforeSearch() disponible, y las opciones afterShowSearch u onClose no tienen los tiempos correctos. ¿Alguna sugerencia sobre cómo proceder?

Marcos

+0

Bienvenido en la stackoverflow con muy buena primera pregunta. +1 de mí para la pregunta. En poco tiempo intentaré describir una posible manera de resolver su problema. Hasta más tarde ... – Oleg

Respuesta

4

Tiene usted razón, la implementación actual de la búsqueda avanzada de la jqGrid no tenemos ninguna eventos como beforeSearch. La nueva versión de búsqueda avanzada que está completamente nueva tendrá el método onSearch que podría usar. El método como beforeSearch se disparará antes de trigger("reloadGrid",[{page:1}]), pero después de que se llene el postData.

El beforeSearch del filterToolbar tiene una característica más interesante para que pueda detener la búsqueda, devolviendo el valor de la truebeforeSearch. Entonces, el beforeSearch puede jugar un rol de validación.

En una old answer mi me describe un método universal que puede ser utilizado para cualquier tipo de validación o postData modificación. En la respuesta muestro cómo se puede subclase el controlador de eventos reloadGrid de jqGrid y detener la recarga de la cuadrícula si es necesario. The demo muestra esto. De la misma manera, aquí uno podría hacer cualquier otra modificación de los datos. Es una lástima, pero the answer estará muy mal indexado y no será utilizado en la mayoría de las búsquedas en el stackoverflow. Entonces uno no lo sabe.

En su caso solo necesita para modificar los datos posteriores antes de enviar y no necesita detener la recarga de la red. Para que pueda resolver el problema utilizando al menos dos eventos jqGrid estándar: beforeRequest y serializeGridData. En ambos puede acceder a los parámetros search (como this.p.search) y postData (como this.p.postData). El valor del parámetro search se enviará al servidor como _search y se establecerá en true si se utiliza alguno de los métodos de búsqueda/filtrado. Por lo tanto, dentro de uno desde el controlador de eventos puede modificar this.p.postData.

Dentro de serializeGridData tiene incluso una manera de definir qué datos se enviarán exactamente al servidor sin requerir modificar los datos. La ventaja es que si abre la ventana de búsqueda avanzada la próxima vez verá (y puede modificar si es necesario) la última solicitud de búsqueda.

Si usted necesita tener la misma aplicación de beforeRequest o serializeGridData en muchas redes de su sitio web se puede configurar su implementación por defecto de la función con respecto a $.jgrid.defaults:

$.extend($.jgrid.defaults, { 
     datatype: 'json', // overwrite default value of any jqGrid parameter 
     serializeGridData: function(postData) { 
      // your implementation 
     } 
}); 
+1

Gracias por su respuesta sobre este tema. Aprendí mucho de la demostración que creaste para tus respuestas, y es muy apreciada. Estoy seguro de que podré abrirme camino a través de este también con tus demos. Si todo lo demás falla, es bueno saber que la próxima versión agregará un método para lidiar con este problema. – driedger

+0

¿hay alguna manera de pedalear solo en la columna donde la búsqueda es verdadera? – frabiacca

+0

@frabiacca: Lo siento, pero no entiendo lo que quieres decir. ¿A qué ciclo te refieres? – Oleg

Cuestiones relacionadas