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