php Yii2 GridView过滤器行为无法正常工作

qxsslcnc  于 2022-12-17  发布在  PHP
关注(0)|答案(1)|浏览(123)

Yii 2网格视图过滤器不能正常工作。选择一个过滤器会影响其他过滤器。更改一个过滤器(下拉列表)会自动选择其他过滤器(下拉列表)的值。这个问题也存在于URL中,更改一个过滤器会将其他过滤器附加到URL中,结果显示为组合。但实际上只有一个过滤器应该被应用,正在更改。
//搜索模型,添加虚拟表名

public function search($params)
{
    $query = Model::find()->with('model_b');

    if (empty($params['sort'])) {
        $query->orderBy("group, " . Model::getSortByType() . ', "title"');
    }

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => [
            'attributes' => [
                'code',
                'title',
                'updated_at'
            ]
        ]
    ]);

    $this->load($params);

    if (!$this->validate()) {
        // uncomment the following line if you do not want to return any records when validation fails
        // $query->where('0=1');
        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'type'          => $this->type,
        'price_type'    => $this->price_type,
        'status'        => $this->status,
        'terms_related' => $this->terms_related,
        'required'      => $this->required,
        'group'         => $this->group,
    ]);

    $query->andFilterWhere(['ilike', 'title', $this->title]);
    $query->andFilterWhere(['is_qr' => $this->is_qr]);

    return $dataProvider;
}

//控制器

public function actionIndex()
{
    $searchModel = new ModelSearch();
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams);

    return $this->render("index", [
        "searchModel"  => $searchModel,
        "dataProvider" => $dataProvider,
    ]);
}

//在View中,我更改的筛选器

[
                'attribute' => 'is_qr',
                'format' => 'boolean',
                'filter'    => [1 => 'TRUE', 0 => 'FALSE'],
                'content' => function ($service) { return ((int) $service->is_qr === 1) ? 'TRUE' : 'FALSE'; }
            ],

//用上述过滤器更换的过滤器

[
        'attribute' => 'terms_related',
        'filter' => array(0 => 'FALSE', 1 => 'TRUE'),
        'content' => function ($service) { return ((int) $service->terms_related === 1) ? 'TRUE' : 'FALSE'; }
    ]

意见:假设我在GridView中有5个过滤器。

操作1:我更改了一个过滤器,只有该过滤器是第一次应用,但在页面重新加载后,其他过滤器被填充为值“0”。因为在选择一个过滤器时,所有过滤器都被推送到URL中,而不是选择一个空值。具有空值的过滤器被应用到具有“0”值的其余过滤器

问题问题是,一旦我选择了筛选器,gridview将发送URL中所有可能的筛选器。我没有选择的筛选器具有空值。

Yii::$app->request->queryParams

这包含所有筛选器,并且除我选择的筛选器之外的筛选器具有空值,并且

$this->load($params);

in search()将空值作为0处理。因此,我没有接触的过滤器将使用“0”值填充。

iyzzxitl

iyzzxitl1#

我已经找到了解决方案,这是一个自定义的解决方案,但为我工作。我创建了一个特质

trait ParamsTrimable
{
    public function trimParams($params, $modelClass)
    {
        $modelClass = basename(str_replace('\\', '/', $modelClass));
        if ($params[$modelClass]) {
            $params[$modelClass] = array_filter($params[$modelClass], function ($value) {
                return ($value !== '');
            });
        }

        return $params;
    }
}

在此之前

$this->load($params);

我称之为trait的函数。

$params = $this->trimParams($params, static::class);
$this->load($params);

trait解决方案背后的原因是,这个问题也可能发生在其他清单中。要解决这个问题,我们只需要use trait并调用函数从参数中删除空值。

相关问题