2010-05-14 6 views
14

J'ai un problème avec le mécanisme de suppression jqGrid car il envoie seulement les paramètres "oper" et "id" sous forme de données POST (id est la clé primaire de la table).jqGrid (Delete row) - Comment envoyer des données POST supplémentaires?

Le problème est, je dois supprimer une ligne en fonction de l'identifiant et une autre valeur de la colonne, disons user_id. Comment ajouter cet user_id aux données POST?

Je peux résumer la question comme suit:

  1. Comment obtenir la valeur de la cellule (user_id) de la ligne sélectionnée?
  2. ET, comment ajouter que user_id aux données POST afin qu'il puisse être récupéré à partir du code sous-jacent dans lequel le processus de suppression proprement dite a lieu.

codes exemples:

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

Répondre

0

J'ai eu le même problème. La façon dont je l'ai résolu, était de mettre l'id_utilisateur comme première colonne dans mon jsondata. et avec les paramètres jsonreader du jqgrid vous pouvez l'accomplir qui fonctionnera.

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

regard sur les paramètres de jsonreader pour jsondata.

i utiliser:

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

et mes données sont comme

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

et maintenant si je mets à jour une ligne ou supprimer une ligne que je vais obtenir le code d'utilisateur. J'espère que cela peut fonctionner pour vous!

+0

Désolé, mais le problème n'était pas d'obtenir les données, mais de poster des informations supplémentaires lors de ** la suppression ** d'une ligne de jqGrid. Un besoin d'avoir pas un ID utilisateur, mais deux id: id et user_id. – Oleg

18

Ce n'est pas un problème. Il y a différentes façons de faire ce dont vous avez besoin. La manière la plus directe est l'utilisation de la fonction serializeDelData. Le code de jqGrid les lignes de suppression ressemblent suivant

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

Alors vous pouvez simplement définir votre propre fonction serializeDelData qui font tout ce dont vous avez besoin:

{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 

Par ailleurs si vous voulez vous produire les données posté sur le serveur, il suffit de renvoyer une chaîne au lieu d'un objet. Ensuite, les données seront publiées par jQuery.ajax sans aucun changement.

Si vous préférez placer une information supplémentaire non dans les données qui sont affichées, mais dans l'URL, vous pouvez le faire à l'intérieur de onclickSubmit. J'utilise par exemple un service RESTfull côté serveur et pour supprimer un item j'utilise DELETE HTTP request avec le corps vide. Tous les paramètres sont placés dans l'URL. Le code correspondant ressemble à ce qui suit:

{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

Merci. jQuery ('# tags'). getRowData (postdata.id); est juste ce que je cherchais. –

+0

J'ai essayé cette approche en mettant un bouton de suppression sur chaque ligne de ma grille - cela a fonctionné la première fois que vous avez cliqué sur supprimer, mais chaque suppression ultérieure gardé en utilisant la même URL que le premier clic. J'ai modifié le code pour me débarrasser de l'override "onclickSubmit" et à la place j'ai passé l'URL appropriée directement dans la méthode delGridRow (au lieu de définir rp_ge.url), et cela a fonctionné. –

+0

@ jrnail23: Cela dépend probablement de l'utilisation de l'option 'recreateForm'. J'ai 'recréerFormulaire: true' comme paramètre par défaut. Vous pouvez essayer d'ajouter cette option ensemble à 'mtype:" DELETE ", reloadAfterSubmit: true, ...'. – Oleg

0

Je ne sais pas comment publier des données supplémentaires, mais vous pouvez essayer d'envoyer des données supplémentaires en tant que paramètres de chaîne de requête dans le cadre de la suppression-url.

6

Voilà comment je suis arrivé à jqGrid pour ajouter plus de données à la représentation lors de la suppression:

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

Ceci renvoie un tableau de poste {id: rowNumber, oper: del, nom: someValue}. name est comment vous voulez faire référence à votre variable dans le tableau de poste, someValue est ce qui est dans la cellule de la ligne sélectionnée qui vous intéresse.

Espérons que cela aide!

0

Oui, vous pouvez ajouter des données supplémentaires à l'postdata en utilisant l'événement onclickSubmit sous del paramètres de navgrid, Dans votre cas, si vous voulez envoyer user_id y compris id, que faire quelque chose comme ça

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

Cela peut être facile atteint si vous définissez clé: true dans colModel comme ceci:

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

faire tha t provoquera automatiquement l'envoi de ce champ pendant le POST.

Le but de clé: true dans colModel est juste pour permettre au processeur de commande pour fonctionner correctement sur un jeu d'enregistrements indexés.

+0

En définissant la clé: true, il n'envoie que la valeur _id. Vous ne pouvez pas envoyer d'autres données de champ avec. –

Questions connexes