jqgrid 工具栏如何使用搜索工具栏在自定义格式的列上 search/sort
jqgrid Toolbar how to search/sort on custom formatted column with search toolbar
编辑:我发现了方法,答案如下
我尝试查看其他问题,但不知道如何解决我的问题。
我用 json 数据加载 jqGrid。这是 json 文件的示例:
{"statut" : "Inactive","name" : [{"LinkType":"user", "LinkText":"DINGO", "LinkSrc":"9443"}], "bands":""},
{"statut" : "Active","name" : [{"LinkType":"user", "LinkText":"BONNIE", "LinkSrc":"8591"}],"bands" : [{"LinkType":"band", "LinkText":"PARADE","LinkSrc":"PARADE"},{"LinkType":"band", "LinkText":"GLORIA KILLS", "LinkSrc":"gloria kills"}]}
...
在 jqGrid 上,设置是这些:
$("#table").jqGrid({
datatype: 'json',
url : 'json.php',
regional: 'fr',
filtering: true,
sorting: true,
paging: true,
autoload: true,
pageSize: 15,
pageButtonCount: 5,
ignoreCase: true,
height: '100%',
loadonce: true,
gridview: true,
colModel: [
{name: 'statut', label : 'Statut', width:100, align: 'center', stype:'select', searchoptions:{value:':All;Inactive:Inactive;Active:Active'}},
{name: 'name', label : 'Name', formatter: MyLinkFormater, unformat: MyLinkUnformater},
{name: 'bands', label : 'Bands', formatter: MyLinkFormater, unformat: MyLinkUnformater}
],
pager: '#pager',
rowList:[10,20,30,40,50,100,200,300,400,500,1000,5000],
});
jQuery("#table").jqGrid('filterToolbar', { stringResult: true, searchOnEnter: false, defaultSearch: "cn" });
函数如下:
function MyLinkFormater(cellvalue, options, rowObject) {
var i, res = "", linkInfo, preLink;
if (cellvalue == null || !$.isArray(cellvalue)) {
return " "; // empty cell in case or error
}
for (i = 0; i < cellvalue.length; i++) {
linkInfo = cellvalue[i];
if(linkInfo.LinkType == 'band') {
preLink = '?page=showBand&band=';
}
if(linkInfo.LinkType == 'user') {
preLink = '?page=showUser&e=1&id=';
}
res += (res.length > 0 ? ", " : "") +
'<a href="' + preLink + linkInfo.LinkSrc + '" >' + linkInfo.LinkText + '</a>';
}
return res;
}
function MyLinkUnformater(cellvalue, options, cell) {
return $('a', cell).text();
}
除 searching/sorting Name 或 Bands 列外,一切正常。我不知道我应该做什么。我必须使用 beforeSearch 吗?如果是,我应该怎么办?
欢迎任何帮助,这让我发疯。
好吧,我终于知道了。
搜索问题
使用 this question 我添加了我的函数来过滤格式化程序
function setFilterFormatters(formatters)
{
function columnUsesCustomFormatter(column_name)
{
for (var col in formatters)
{
if (col == column_name)
return true;
}
return false;
}
var accessor_regex = /jQuery\.jgrid\.getAccessor\(this\,'(.+)'\)/;
var oldFrom = $.jgrid.from;
$.jgrid.from = function(source, initialQuery) {
var result = oldFrom(source, initialQuery);
result._getStr = function(s) {
var column_formatter = 'String';
var column_match = s.match(accessor_regex, '');
if (column_match && columnUsesCustomFormatter(column_match[1]))
{
column_formatter = formatters[column_match[1]];
}
var phrase=[];
if(this._trim) {
phrase.push("jQuery.trim(");
}
phrase.push(column_formatter+"("+s+")");
if(this._trim) {
phrase.push(")");
}
if(!this._usecase) {
phrase.push(".toLowerCase()");
}
return phrase.join("");
}
return result;
};
}
setFilterFormatters({'name':'my_formatter','bands':'my_formatter'});
和my_formatter函数
function my_formatter(cellValue)
{
var i, res = "", linkInfo;
if(cellValue==null || !$.isArray(cellValue)) {
res += ' ';
} else {
for (i = 0; i < cellValue.length; i++) {
linkInfo = cellValue[i];
res += linkInfo.LinkText + ' ';
}
}
return $.map(cellValue,function(element) { return res; }).join(', ');
}
排序问题
为了解决排序问题,我使用了这个 answer 并将设置排序类型添加到相关列中,其中 return 纯文本信息,即:
{name: 'name', label : 'Name', index: 'name', formatter: MyLinkFormater, unformat:MyLinkUnformater, sorttype:function(cell, obj){
return cell + '_' +obj.name[0].LinkText;
}},
编辑:我发现了方法,答案如下
我尝试查看其他问题,但不知道如何解决我的问题。
我用 json 数据加载 jqGrid。这是 json 文件的示例:
{"statut" : "Inactive","name" : [{"LinkType":"user", "LinkText":"DINGO", "LinkSrc":"9443"}], "bands":""},
{"statut" : "Active","name" : [{"LinkType":"user", "LinkText":"BONNIE", "LinkSrc":"8591"}],"bands" : [{"LinkType":"band", "LinkText":"PARADE","LinkSrc":"PARADE"},{"LinkType":"band", "LinkText":"GLORIA KILLS", "LinkSrc":"gloria kills"}]}
...
在 jqGrid 上,设置是这些:
$("#table").jqGrid({
datatype: 'json',
url : 'json.php',
regional: 'fr',
filtering: true,
sorting: true,
paging: true,
autoload: true,
pageSize: 15,
pageButtonCount: 5,
ignoreCase: true,
height: '100%',
loadonce: true,
gridview: true,
colModel: [
{name: 'statut', label : 'Statut', width:100, align: 'center', stype:'select', searchoptions:{value:':All;Inactive:Inactive;Active:Active'}},
{name: 'name', label : 'Name', formatter: MyLinkFormater, unformat: MyLinkUnformater},
{name: 'bands', label : 'Bands', formatter: MyLinkFormater, unformat: MyLinkUnformater}
],
pager: '#pager',
rowList:[10,20,30,40,50,100,200,300,400,500,1000,5000],
});
jQuery("#table").jqGrid('filterToolbar', { stringResult: true, searchOnEnter: false, defaultSearch: "cn" });
函数如下:
function MyLinkFormater(cellvalue, options, rowObject) {
var i, res = "", linkInfo, preLink;
if (cellvalue == null || !$.isArray(cellvalue)) {
return " "; // empty cell in case or error
}
for (i = 0; i < cellvalue.length; i++) {
linkInfo = cellvalue[i];
if(linkInfo.LinkType == 'band') {
preLink = '?page=showBand&band=';
}
if(linkInfo.LinkType == 'user') {
preLink = '?page=showUser&e=1&id=';
}
res += (res.length > 0 ? ", " : "") +
'<a href="' + preLink + linkInfo.LinkSrc + '" >' + linkInfo.LinkText + '</a>';
}
return res;
}
function MyLinkUnformater(cellvalue, options, cell) {
return $('a', cell).text();
}
除 searching/sorting Name 或 Bands 列外,一切正常。我不知道我应该做什么。我必须使用 beforeSearch 吗?如果是,我应该怎么办?
欢迎任何帮助,这让我发疯。
好吧,我终于知道了。
搜索问题
使用 this question 我添加了我的函数来过滤格式化程序
function setFilterFormatters(formatters)
{
function columnUsesCustomFormatter(column_name)
{
for (var col in formatters)
{
if (col == column_name)
return true;
}
return false;
}
var accessor_regex = /jQuery\.jgrid\.getAccessor\(this\,'(.+)'\)/;
var oldFrom = $.jgrid.from;
$.jgrid.from = function(source, initialQuery) {
var result = oldFrom(source, initialQuery);
result._getStr = function(s) {
var column_formatter = 'String';
var column_match = s.match(accessor_regex, '');
if (column_match && columnUsesCustomFormatter(column_match[1]))
{
column_formatter = formatters[column_match[1]];
}
var phrase=[];
if(this._trim) {
phrase.push("jQuery.trim(");
}
phrase.push(column_formatter+"("+s+")");
if(this._trim) {
phrase.push(")");
}
if(!this._usecase) {
phrase.push(".toLowerCase()");
}
return phrase.join("");
}
return result;
};
}
setFilterFormatters({'name':'my_formatter','bands':'my_formatter'});
和my_formatter函数
function my_formatter(cellValue)
{
var i, res = "", linkInfo;
if(cellValue==null || !$.isArray(cellValue)) {
res += ' ';
} else {
for (i = 0; i < cellValue.length; i++) {
linkInfo = cellValue[i];
res += linkInfo.LinkText + ' ';
}
}
return $.map(cellValue,function(element) { return res; }).join(', ');
}
排序问题
为了解决排序问题,我使用了这个 answer 并将设置排序类型添加到相关列中,其中 return 纯文本信息,即:
{name: 'name', label : 'Name', index: 'name', formatter: MyLinkFormater, unformat:MyLinkUnformater, sorttype:function(cell, obj){
return cell + '_' +obj.name[0].LinkText;
}},