首页 > 解决方案 > 如何为 GridView 使用多个过滤器选择器?

问题描述

我有两个用于 GridView 的小部件过滤器 - 用于在表格中显示最喜欢的项目的复选框和用于每页项目数的下拉列表。

<?= \kartik\checkbox\CheckboxX::widget([
    'name' => 'LSearch[favourite]',
    'value' => $lotSearch->favourite,
]) ?>
<?= \nterms\pagesize\PageSize::widget() ?>

对于这两个小部件的工作,我需要设置 GridView 的 filterSelector 属性:

'filterSelector' => 'input[name="LSearch[favourite]"]',
'filterSelector' => 'select[name="per-page"]',

但是我需要为每个小部件单独执行此操作,并且过滤仅适用于一个小部件,因为 filterSelector 是字符串属性并且不接受数组。有没有办法解决这个问题?

标签: yii2

解决方案


这个问题多年来一直是一个问题,也许它是一个错误。试试这个,但我不确定这是否有效。如果这不起作用,您需要根据需要进行修改。

yii.gridView.js

 applyFilter: function () {
        var $grid = $(this), event;
        var settings = gridData[$grid.attr('id')].settings;
        var data = {};
        $.each($(settings.filterSelector).serializeArray(), function () {
            if (data[this.name] === undefined) {
                data[this.name] = this.name.indexOf('[]') === -1 ? this.value : [this.value];
            } else if (typeof data[this.name] === 'object') {
                data[this.name].push(this.value);
            }
        });

        $.each(yii.getQueryParams(settings.filterUrl), function (name, value) {
            if (data[name] === undefined) {
                data[name] = value;
            }
        });

        var pos = settings.filterUrl.indexOf('?');
        var url = pos < 0 ? settings.filterUrl : settings.filterUrl.substring(0, pos);

        $grid.find('form.gridview-filter-form').remove();
        var $form = $('<form action="' + url + '" method="get" class="gridview-filter-form" style="display:none" data-pjax></form>').appendTo($grid);
        $.each(data, function (name, value) {
            if (typeof value === 'object') {
                $.each(value, function (id, value_multi) {
                    $form.append($('<input type="hidden" name="t" value="" />').attr('name', name).val(value_multi));
                });
            } else {
                $form.append($('<input type="hidden" name="t" value="" />').attr('name', name).val(value));
            }
        });
        
        event = $.Event(gridEvents.beforeFilter);
        $grid.trigger(event);
        if (event.result === false) {
            return;
        }

        $form.submit();
        
        $grid.trigger(gridEvents.afterFilter);
    },

并确保修改您的配置:

'assetManager' => [
     'bundles' => [
          'yii\grid\GridViewAsset' => [
               'sourcePath' => __DIR__ . '/../assets',
          ],
     ],
],

资源


推荐阅读