0

在我的 Drupal 7 站点中,我有一个使用 Views 构建的产品概览页面。在该页面上,我有许多可以按任何顺序单击的复选框。对于单击的每个复选框,相应的标签将复制到输入文本字段中。此文本字段随后用作 jQuery Quicksearch 插件的搜索字段。(我从这里借用了这个想法,但我使用了 deuxhuithuit 的新插件版本)。

由于可以按任何顺序单击这些复选框,因此可以按任何顺序添加搜索字段中的标签。

然后我有大量包含产品的 div,其中每个产品都有一个标签文本字段,其中可以输入许多标签术语,仅用空格分隔,具体取决于产品的特性。

有什么方法可以让 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);
        }
    });
4

1 回答 1

0

最后我自己想出了一个解决方案。诀窍是按照与每个产品的标签相同的顺序对查询进行排序。为此,我使用了一个带有参考数组的排序函数(标签也必须按此顺序输入每个产品的标签字段中)。

下一个问题是只有在匹配的标签彼此相邻时才能找到匹配项。例如,如果产品的标签字符串是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);
        }
    });
于 2019-01-31T11:03:04.450 回答