JqGrid (Удалить строку) - Как отправить дополнительные данные POST?
У меня возникла проблема с механизмом удаления jqGrid, поскольку он отправляет только параметры "oper" и "id" в виде данных POST (id является первичным ключом таблицы).
Проблема в том, что мне нужно удалить строку на основе идентификатора и другого значения столбца, скажем, user_id. Как добавить этот user_id в данные POST?
Я могу суммировать проблему следующим образом:
- Как получить значение ячейки (user_id) выбранной строки?
- И, как добавить этот user_id в данные POST, чтобы он мог быть извлечен из кода, по которому происходит фактический процесс удаления.
Примеры кодов:
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
);
Ответы
Ответ 1
Это не проблема. Существуют различные способы сделать то, что вам нужно. Наиболее прямым способом является использование функции serializeDelData
. Код jqGrid, который удаляет строки, выглядит следующим образом
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);
Итак, вы можете просто определить свою собственную функцию serializeDelData
, которая сделает все, что вам нужно:
{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
Кстати, если вы хотите произвести сами данные, отправленные на сервер, просто верните строку вместо объекта. Затем данные будут опубликованы jQuery.ajax без каких-либо изменений.
Если вы предпочитаете размещать дополнительную информацию не в опубликованных данных, но в URL-адресе вы можете сделать это внутри onclickSubmit
. Я использую например службу RESTfull на стороне сервера и для удаления элемента, который я использую DELETE HTTP-запрос с пустым телом. Все параметры помещаются в URL-адрес. Соответствующий код выглядит следующим образом:
{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
Ответ 2
Вот как я добрался до jqGrid, чтобы добавить больше данных в POST при удалении:
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;
}
}
},
{},
{});
Это вернет массив сообщений {id: rowNumber, oper: del, name: someValue}. name
заключается в том, как вы хотите ссылаться на свою переменную в массиве post, someValue
- это то, что находится в ячейке из выбранной вами интересующей вас строки.
Надеюсь, это поможет!
Ответ 3
Это может быть легко достигнуто, если вы установите : true в colModel следующим образом:
colModel: [
{name: 'childId', index: 'childId', align: 'center', sorttype: 'string', key:true},
что приведет к автоматическому отправке этого поля во время POST.
Цель ключа : true в colModel заключается в том, чтобы позволить процессору команд правильно работать с индексированным набором записей.
Ответ 4
У меня была та же проблема. Способ, которым я его исправил, состоял в том, чтобы поставить user_id в качестве первого столбца в моей jsondata. и с настройками jsonreader jqgrid вы можете выполнить это, что будет работать.
http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data
посмотрите настройки jsonreader для jsondata.
i используйте:
jsonReader: { cell: "", id: "0" }
и мои данные похожи на
{ totalpages: "xxx", currpage: "yyy", totalrecords: "zzz",
invdata : [
{"userid","cell12", "cell13", "cell14"},
{"userid","cell22", "cell23", "cell24"},
...
]
}
и теперь, если я обновляю строку или удаляю строку, я получу идентификатор пользователя.
Надеюсь, это сработает для вас!
Ответ 5
Я не уверен, как отправлять дополнительные данные, но вы можете попробовать отправить дополнительные данные в качестве параметров строки запроса как часть URL-адреса удаления.
Ответ 6
Да, вы можете добавить дополнительные данные в postdata, используя событие onclickSubmit, в параметрах del navgrid. В вашем случае, если вы хотите отправить user_id, включая id, чем сделать что-то вроде этого
$("#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 () {
}
});