2010-05-14 14 views
14

Mam problem z mechanizmem usuwania jqGrid, ponieważ wysyła on tylko parametry "oper" i "id" w postaci danych POST (id jest kluczem podstawowym tabeli).jqGrid (Usuń wiersz) - Jak wysłać dodatkowe dane POST?

Problem polega na tym, że muszę usunąć wiersz na podstawie identyfikatora i innej wartości kolumny, np. Id_użytkownika. Jak dodać ten identyfikator użytkownika do danych POST?

mogę podsumować kwestię jak:

  1. Jak uzyskać wartość komórki (user_id) wybranego wiersza?
  2. ORAZ, jak dodać identyfikator użytkownika do danych POST, aby można go było pobrać z kodu znajdującego się w miejscu, w którym ma miejsce faktyczny proces usuwania.

Przykładowe kody:

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 
     ); 

Odpowiedz

0

miałem ten sam problem. Sposób, w jaki to naprawiłem, polegał na umieszczeniu user_id jako pierwszej kolumny w mojej jsondacie. i z ustawieniami jsonreadera jqgrid możesz to zrobić, co zadziała.

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

spojrzenie na ustawieniach jsonreader dla jsondata.

używam:

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

i moje dane jest jak

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

i teraz jeśli mogę zaktualizować wiersz lub usunąć wiersz Wezmę identyfikatora. Mam nadzieję, że to może ci pomóc!

+0

Niestety, problem polegał nie na pozyskiwaniu danych, ale na publikowaniu dodatkowych informacji podczas ** usuwania ** wiersza z jqGrid. Nie trzeba mieć jednego identyfikatora użytkownika, ale dwóch identyfikatorów: id i user_id. – Oleg

18

To nie jest problem. Istnieją różne sposoby robienia tego, czego potrzebujesz. Najbardziej bezpośrednim sposobem jest użycie funkcji serializeDelData. Kodeks jqGrid których usuwanie wierszy wyglądać po

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); 

więc można po prostu zdefiniować własną serializeDelData funkcji, które zrobić wszystko co trzeba:

{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 

Nawiasem mówiąc, jeśli chcesz produkować własne dane wysłane na serwer, wystarczy zwrócić ciąg zamiast obiektu. Następnie dane zostaną opublikowane przez jQuery.ajax bez żadnych zmian.

Jeśli wolisz umieszczać dodatkowe informacje poza zaksięgowanymi danymi, ale w adresie URL możesz to zrobić w numerze onclickSubmit. Używam na przykład usługi RESTfull po stronie serwera i do usuwania pozycji Używam polecenia DELETE HTTP z pustą treścią. Wszystkie parametry są umieszczone w adresie URL. Odpowiedni kod wygląda jak następuje:

{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

Dzięki. jQuery ('# tags'). getRowData (postdata.id); właśnie tego szukałem. –

+0

Próbowałem tego podejścia podczas umieszczania przycisku usuwania w każdym wierszu mojej siatki - działało po raz pierwszy kliknij usunąć, ale następnie każde kolejne usunięcie trzymane za pomocą tego samego adresu URL, jak pierwsze kliknięcie. Zmodyfikowałem kod, aby pozbyć się nadpisania "onclickSubmit" i zamiast tego przekazałem odpowiedni adres URL bezpośrednio do metody delGridRow (zamiast ustawienia rp_ge.url) i zadziałało. –

+0

@ jrnail23: Prawdopodobnie zależy to od użycia opcji 'recreateForm'. Jako ustawienie domyślne mam 'recreateForm: true'. Możesz spróbować dodać tę opcję do 'mtype:" DELETE ", reloadAfterSubmit: true, ...'. – Oleg

0

nie jestem pewien, jak odpowiedzieć dodatkowych danych, ale można spróbować wysłać dodatkowe dane jako parametry ciąg kwerendy w ramach usuwania URL.

6

ten sposób dotarłem do jqGrid dołączyć więcej danych placówce na usuwanie:

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; 
            } 
          } 
        }, 
        {}, 
        {}); 

Ta zwróci poczta tablicę {id: RowNumber, oper: DEL nazwa: SomeValue}. name to sposób, w jaki chcesz odnieść się do zmiennej w tablicy postów, someValue to, co znajduje się w komórce w wybranym wierszu, który Cię interesuje.

Mam nadzieję, że to pomoże!

0

Tak można dodać dodatkowe dane do postData używając zdarzenie onclickSubmit pod del parametrów navgrid, W twoim przypadku, jeśli chcesz wysłać user_id tym id, niż zrobić coś takiego

$("#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

To może być łatwe osiągnięty, jeśli ustawisz klucz: true w colModel tak:

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

robi tha t spowoduje automatyczne wysłanie tego pola podczas testu POST.

Intencją klucza: true w colModel jest właśnie umożliwienie procesor poleceń poprawnie działają na indeksowanego zbioru rekordów.

+0

Ustawiając klawisz: true, wysyła on tylko wartość jako _id. Nie można wysyłać z nim innych danych pola. –