Как сделать локальный поиск по значению отформатированного столбца в jqgrid? - PullRequest
2 голосов
/ 28 апреля 2011

Я использую loadonce, чтобы получить все данные заранее, а затем выполняю сортировку и фильтрацию локально.

Одним из значений моего столбца является массив объектов.В опции colModel я использую функцию форматирования, которая выглядит следующим образом:

function my_formatter(cellValue) 
{ 
    return $.map(cellValue, function(element) {return element.human_readable_name;}).join(', '); 
}

Я также использую пользовательскую функцию сортировки, которая просто возвращает длину массива.

У меня проблема в том, чточто фильтрация панели инструментов и многополевая диалоговая фильтрация не работают.Похоже, они ищут в [objects] .toString (), а не в отформатированном значении.Таким образом, я получаю хиты, когда я ищу "[объект объекта]", но не когда я ищу фактические значения.

Есть ли способ заставить локальную фильтрацию использовать отформатированное значение?

Редактирование на основе ответа Олега:

Я адаптировал код Олега для добавления форматирования фильтра по столбцам.Вроде хорошо работает.Я удалил замену _toStr, потому что она не показалась необходимой - я думаю, что она используется для изменения поискового термина (что имеет смысл в случае с ударением в акценте Олега, но не в моем).

// Causes local filtering to use custom formatters for specific columns.
// formatters is a dictionary of the form:
// { "column_name_1_needing_formatting": "column1FormattingFunctionName",
//   "column_name_2_needing_formatting": "column2FormattingFunctionName" }
// Note that subsequent calls will *replace* all formatters set by previous calls.
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, '$1');
            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({'column_with_array_of_objects':'my_formatter'});

Тестирование предполагает, что это работает для «содержит», «не содержит», «равно», «не равно» (и, вероятно, «начинается с» и другихпростые сравнения строк - но я ими не пользуюсь).

Спасибо, Олег.

1 Ответ

1 голос
/ 28 апреля 2011

В моем старом ответе на форуме trirand я описал, как реализовать пользовательскую локальную фильтрацию и сортировку. Демонстрация показывает поиск и сортировку без акцента.Если вы используете ту же технику, вы можете переписать некоторые функции jqGrid, используемые для поиска (например, _toStr и _getStr), и реализовать ее так, чтобы в случае массивов вы использовали свою собственную реализацию.Сделайте мой ответ более удобным для Google. Я включил небольшой фрагмент кода

function myAccentRemovement(s) {
    // the s parameter is always string
    s = s.replace(/[àáâãäå]/gi,'a');
    s = s.replace(/[èéêë]/gi,'e');
    s = s.replace(/[ìíîï]/gi,'i');
    s = s.replace(/[òóôõöø]/gi,'o');
    s = s.replace(/[ùúûü]/gi,'u');
    s = s.replace(/[ýÿ]/gi,'y');
    s = s.replace(/æ/gi,'ae');
    s = s.replace(/œ/gi,'oe');
    s = s.replace(/ç/gi,'c');
    s = s.replace(/š/gi,'s');
    s = s.replace(/ñ/gi,'n');
    s = s.replace(/ž/gi,'z');
    return s;
}
//...
var oldFrom = $.jgrid.from;
$.jgrid.from = function(source,initalQuery){
    var result = oldFrom(source,initalQuery);
    var old_toStr = result._toStr;
    result._toStr=function(s) {
        return myAccentRemovement(old_toStr(s));
    };
    result._getStr=function(s) {
        var phrase=[];
        if(this._trim){
            phrase.push("jQuery.trim(");
        }
        phrase.push("myAccentRemovement(String("+s+"))");
        if(this._trim){
            phrase.push(")");
        }
        if(!this._usecase){
            phrase.push(".toLowerCase()");
        }
        return phrase.join("");
    }
    return result;
}

Это решит проблему.Я не могу дать вам более точные предложения, потому что вы не опубликовали информацию о точной структуре данных, которые вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...