2010-05-14 23 views
14

Tengo un problema con el mecanismo de eliminación jqGrid ya que solo envía los parámetros "oper" e "id" en forma de datos POST (id es la clave principal de la tabla).jqGrid (Eliminar fila) - ¿Cómo enviar datos POST adicionales?

El problema es que necesito eliminar una fila en función del ID y el valor de otra columna, digamos user_id. ¿Cómo agregar este user_id a los datos POST?

Puedo resumir el tema de la siguiente manera:

  1. cómo obtener el valor de la celda (user_id) de la fila seleccionada?
  2. Y, cómo agregar ese user_id a los datos POST para que pueda ser recuperado desde el código detrás del lugar donde ocurre el proceso de eliminación real.

códigos de muestra:

jQuery("#tags").jqGrid({ 
       url: "subgrid.process.php, 
       editurl: "subgrid.process.php?, 
       datatype: "json", 
       mtype: "POST", 
       colNames:['id','user_id','status_type_id'], 
       colModel:[{name:'id', index:'id', width:100, editable:true}, 

         {name:'user_id', index:'user_id', width:200, editable:true}, 

         {name:'status_type_id', index:'status_type_id', width:200} 
       ], 
       pager: '#pagernav2', 
       rowNum:10, 
       rowList:[10,20,30,40,50,100], 
       sortname: 'id', 
       sortorder: "asc", 
       caption: "Test", 
       height: 200 
     }); 
     jQuery("#tags").jqGrid('navGrid','#pagernav2', 
      {add:true,edit:false,del:true,search:false}, 
     {}, 
      {mtype:"POST",closeAfterAdd:true,reloadAfterSubmit:true}, // add options 
    {mtype:"POST",reloadAfterSubmit:true}, // del options 
      {} // search options 
     ); 

Respuesta

0

que tenían el mismo problema. La forma en que lo arreglé, fue poner el user_id como primera columna en mi jsondata. y con la configuración jsonreader de jqgrid puedes lograrlo que funcione.

http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data

vistazo a la configuración JsonReader para jsondata.

que utilizo:

jsonReader: { cell: "", id: "0" } 

y mis datos es como

{ totalpages: "xxx", currpage: "yyy", totalrecords: "zzz", 
    invdata : [ 
    {"userid","cell12", "cell13", "cell14"}, 
    {"userid","cell22", "cell23", "cell24"}, 
    ... 
    ] 
} 

y ahora si actualizar una fila o eliminar una fila Voy a por el ID de usuario. ¡Espero que esto funcione para ti!

+0

Lo sentimos, pero el problema no fue obtener los datos, sino publicar información adicional durante ** eliminar ** de una fila de jqGrid. Uno necesita tener un ID de usuario, pero dos ids: id y user_id. – Oleg

18

No hay problema. Hay diferentes maneras de hacer lo que necesita. La forma más directa es el uso de la función serializeDelData. El código de jqGrid qué filas de eliminación parecen siguiente

var ajaxOptions = $.extend({ 
    url: rp_ge.url ? rp_ge.url : $($t).jqGrid('getGridParam','editurl'), 
    type: p.mtype, 
    data: $.isFunction(p.serializeDelData) ? p.serializeDelData(postd) : postd, 
    complete:function(data,Status){ 
     //... 
    }, 
    error:function(xhr,st,err){ 
     //... 
    } 
}, $.jgrid.ajaxOptions, p.ajaxDelOptions); 

$.ajax(ajaxOptions); 

lo que sólo puede definir su propio serializeDelData función que haga todo lo que necesita:

{mtype:"POST", reloadAfterSubmit:true, serializeDelData: function (postdata) { 
     var rowdata = jQuery('#tags').getRowData(postdata.id); 
     // append postdata with any information 
     return {id: postdata.id, oper: postdata.oper, user_id: rowdata.user_id}; 
}}, // del options 

Por cierto si usted quiere producir usted mismo los datos publicado en el servidor, solo devuelve una cadena en lugar de un objeto. Entonces los datos serán publicados por jQuery.ajax sin ningún cambio.

Si prefiere colocar una información adicional no en los datos que se publican, pero en la URL puede hacerlo dentro de onclickSubmit. Utilizo, por ejemplo, un servicio RESTfull en el lado del servidor y para eliminar un elemento utilizo la solicitud DELETE HTTP con el cuerpo vacío. Todos los parámetros se colocan en la URL. El código correspondiente se parece a lo siguiente:

{mtype:"DELETE", reloadAfterSubmit:true, serializeDelData: function (postdata) { 
     return ""; // the body MUST be empty in DELETE HTTP requests 
}, onclickSubmit: function(rp_ge,postdata) { 
     var rowdata = jQuery('#tags').getRowData(postdata.id); 
     rp_ge.url = 'subgrid.process.php/' + encodeURIComponent(postdata.id) + 
        '?' + jQuery.param ({user_id: rowdata.user_id}); 
}}, // del options 
+0

Gracias. jQuery ('# tags'). getRowData (postdata.id); es justo lo que estaba buscando. –

+0

Intenté este enfoque al poner un botón Eliminar en cada fila de mi cuadrícula, funcionó la primera vez que hizo clic en eliminar, pero luego cada eliminación subsiguiente siguió usando la misma URL que el primer clic. Modifiqué el código para deshacerme de la anulación "onclickSubmit" y, en su lugar, pasé la URL correspondiente directamente al método delGridRow (en lugar de establecer rp_ge.url), y funcionó. –

+0

@ jrnail23: Probablemente depende del uso de la opción 'recreateForm'. Tengo 'recreateForm: true' como mi configuración predeterminada. Puede intentar agregar esta opción a 'mtype:" DELETE ", reloadAfterSubmit: true, ...'. – Oleg

0

No estoy seguro de cómo publicar datos adicionales, pero se puede intentar el envío de datos adicionales como parámetros de cadena de consulta como parte de la eliminación-url.

6

Esta es la forma en que llegué a jqGrid para añadir más datos a la oficina de borrado:

var grid = $("#grid").jqGrid(... //make your grid 

$("#grid").jqGrid('navGrid', '#pager', {add:false, edit:false, del:true}, 
        {}, 
        {}, 
        {delData: { 
          name: function() { 
             var sel_id = grid.jqGrid('getGridParam', 'selrow'); 
             var value = grid.jqGrid('getCell', sel_id, 'colName'); 
             return value; 
            } 
          } 
        }, 
        {}, 
        {}); 

Esto devolverá una matriz de post {id: rowNumber, oper: del, nombre: someValue}. name es la forma en que desea hacer referencia a su variable en la matriz posterior, someValue es lo que está en la celda de la fila seleccionada que le interese.

Espero que esto ayude!

0

sí se puede añadir datos adicionales a la postdata usando evento onclickSubmit bajo Del parámetros de navgrid, en su caso, si desea enviar user_id incluyendo identificación, de hacer algo como esto

$("#gridId").jqGrid({ 
    }).hideCol(['']).navGrid('#pagerId', { 
     edit: false, add: false, del: true, search: true, refresh: true, beforeRefresh: function() { 
     }, afterRefresh: function() { 
     } 
    }, {}, {}, { 
     afterComplete: function() { 
     }, onclickSubmit: function (params) { 
      var extraParameters = []; var arraySelected = $("#gridId").jqGrid('getGridParam', 'selarrrow'); 
      for (var i = 0; i < arraySelected.length; i++) { 
       extraParameters.push($('#gridId').getRowData(arraySelected[i]).user_id) 
      } 
      return { extraParams: extraParameters.join(',') }; 
     } 
    }, 
    { 
     sopt: ['cn', 'nc'], onSearch: function() { 
     }, 
     onReset: function() { 
     } 
    }); 
1

Esto puede ser fácil alcanzado si se establece clave: verdadera en colModel así:

colModel: [ {name: 'childId', index: 'childId', align: 'center', sorttype: 'string', key:true},

haciendo tha t ocasionará que se envíe automáticamente este campo durante la POST.

La intención de clave: verdadera en colModel es sólo para permitir que el procesador de comandos para operar correctamente en un conjunto de registros indexado.

+0

Al establecer la clave: verdadero, solo envía el valor como _id. No puede enviar otros datos de campo con él. –

Cuestiones relacionadas