Как заставить jQuery Quicksearch принимать условия поиска в любом порядке? - PullRequest
0 голосов
/ 30 января 2019

На моем сайте Drupal 7 у меня есть страница обзора продукта, созданная с помощью Views.На этой странице у меня есть несколько флажков, которые можно нажимать в любом порядке.Для каждого установленного флажка соответствующий тег копируется в поле ввода текста.Это текстовое поле затем используется в качестве поля поиска для плагина jQuery Quicksearch.(Я заимствовал эту идею у здесь , но я использую новую версию плагина от deuxhuithuit).

Поскольку эти флажки можно нажимать в любом порядке, теги в поле поиска добавляютсяв любом порядке.

У меня тогда есть большое количество элементов, содержащих продукты, где каждый продукт имеет текстовое поле тега, где число терминов тега может быть введено через пробел, в зависимости от характеристикthe products.

Есть ли способ заставить плагин Quicksearch принимать эти условия в любом порядке с помощью опций prepareQuery и / или testQuery?Если так, как это сделано?Я потратил много часов, пытаясь найти примеры того, как это сделать.

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

В любом случае, вот как сейчас выглядит установка:

$('#searchfield').quicksearch('.views-column .views-field-field-soktaggar', {
        'delay': 100,
        'selector': 'div.searchtags',
        'loader': 'span.loading',
        'noResults': '#noresults',
        'bind': 'keyup',
        'show': function () {
                $(this).parent('.views-column').removeClass('hide');
            $(this).parent('.views-column').addClass('show');
        },
        'hide': function () {
            $(this).parent('.views-column').removeClass('show');
                    $(this).parent('.views-column').addClass('hide');

        },
        'prepareQuery': function (val) {
            return new RegExp(val, "i");
        },
        'testQuery': function (query, txt, _row) {
                console.log('query: ' + query + ' txt: ' + txt + ' _row: ' + _row);
            return query.test(txt);
        }
    });

1 Ответ

0 голосов
/ 31 января 2019

В конце концов я сам придумал решение.Хитрость заключалась в том, чтобы отсортировать запрос в том же порядке, в котором указаны теги для каждого продукта.Для этого я использовал функцию сортировки со ссылочным массивом (также теги должны быть введены в указанном порядке в поле тега каждого продукта).

Следующая проблема заключалась в том, что совпадения были найдены только тогда, когда соответствующие теги были расположенырядом друг с другом.Например, если строка тега продукта была infrared logger ntc, а запрос был infrared ntc, совпадение было невозможно.Таким образом, в этом случае тег logger необходимо было удалить из строки тега.

Теперь это полная рабочая функция:

$('#searchfield').quicksearch('.views-column .views-field-field-soktaggar', {
        'delay': 100,
        'selector': 'div.searchtags',
        'loader': 'span.loading',
        'noResults': '#noresults',
        'bind': 'keyup',
        'show': function () {
                $(this).parent('.views-column').removeClass('hide');
            $(this).parent('.views-column').addClass('show');
        },
        'hide': function () {
            $(this).parent('.views-column').removeClass('show');
                    $(this).parent('.views-column').addClass('hide');

        },
        'prepareQuery': function (val) {
                // turn query into array in order to allow sorting
                var q = String(val).match(/("[^"]+"|[^"\s]+)/g);
                // sort the tags in the query in the same order as in the reference array
                var reference_array = [ 'ir', 'lowtemp', 'hightemp', 'logger', 'tek', 'tet', 'tes', 'tej', 'pt100', 'ntc', 'livs', 'fastighet' ];
                if(q != null){
                    var result = q.sort(function(a, b) {
                        return reference_array.indexOf(a) - reference_array.indexOf(b);
                    });
                    var str = result.join(' ');
                }
            return new RegExp(str, "i");
        },
        'testQuery': function (query, txt, _row) {
                // remove tags in txt that are not used in query
                if(txt != ''){ // only process items with tags
                    // turn txt (tags from items) into array
                    var t = String(txt).match(/("[^"]+"|[^"\s]+)/g);
                    // remove leading '/' and trailing '/i' in query
                    var str = String(query).replace(/^\/|\/i$/g, '');
                    // turn query into array
                    var q = String(str).match(/("[^"]+"|[^"\s]+)/g);
                    // only show matching tags in txt, otherwise matching is not always possible
                    var res = t.filter(element => q.includes(element));
                    //turn tags array into string
                    var _txt = res.join(' ');
                    // use this alternative tag string from items
                    return query.test(_txt);
                }

            return query.test(txt);
        }
    });
...