如何为GridView使用多个过滤器选择器?

时间:2019-08-05 09:27:06

标签: yii2

我有两个用于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是字符串属性,并且不接受数组。有什么办法可以解决这个问题?

1 个答案:

答案 0 :(得分:0)

这个问题已经困扰了好几年了,也许是一个错误。 尝试一下,但是我不确定是否可以正常工作。如果无法正常运行,则需要根据需要进行修改。

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',
          ],
     ],
],

source