如何使用搜索模型自定义GridView的过滤器?

时间:2017-02-10 06:38:07

标签: javascript jquery forms gridview yii2

我在yii2中使用了gridview小部件。

在我的搜索视图文件中:

$gridview=GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        [
            'attribute'=>'id',
            'width'=>'10%'
        ],
        [
            'attribute'=>'status_id',
            'value'=>function ($data) {
                return $data->statusOption[$data->status_id];
            },
           'filterType'=>GridView::FILTER_SELECT2,
           'filter'=> Problem::getStatusOption(),
        ],
        [
            'attribute'=>'content',
        ]
    ]
]);

现在我已经定制了搜索模型以支持按多个status_id过滤项目,如下所示。

在我的ItemSearch模型文件中:

class ItemSearch extends Item
{
    public $sids=[];

    public function rules()
    {
        return [
            [['status_id'], 'integer'],
            [['sids'], 'safe'],
        ];
    }

    public function query($params)
    {
        $this->load($params);

        $query = Item::find();

        $query->andFilterWhere([
            'status_id' => $this->status_id,
        ]);

        if(!empty($this->sids))
        {
            $query->andWhere(['in','status_id',  $this->sids]);
        }
    }

    public function search($params)
    {
        $query=  $this->query($params);

        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => [
                'pageSize' => 10,
            ],
        ]);

        return $dataProvider;
    }
}

现在我在网格外放了一个adidtional选择框。除了提交按钮外,这有点难看。

在我的搜索视图文件中:

<?php $form = ActiveForm::begin([
        'method' => 'get',
]);?>

<div class="form-group">
    <select class="status" name="ItemSearch[sids][]" multiple="true">
          <option value="0">status 0 </option>
          <option value="1">status 1 </option>
     </select>
    <button class="btn btn-success" type="submit">submit</button>
 </div>

我将所选状态存储在js事物的数组中。

echo "var stSelect = ".\yii\helpers\Json::encode($searchModel->sids).";\n"

我想让以下按钮组工作。

<div class="btn-group" data-toggle="buttons">
<?php foreach(Problem::getStatusOption() as $key=>$val):?>
    <label class="status-button btn btn-default <?= in_array($key, $searchModel->sids)?"active":''?>" data-key="<?=$key?>"><input type="checkbox"><?= $val?></label>
<?php endforeach;?>
</div>

所以我用Jquery写了一些js:

$('.status-button').on('click', function(){
    stSelect = toggle(Number($(this).attr("data-key")),stSelect);
    $('.status').val(stSelect);
})

var toggle = function(value,array){
    if(array.indexOf(value) > -1) {
        array.splice(array.indexOf(value),1)
    }else{
        array.push(value)
    }
    return array
}

但现在我有以下问题要处理:

  • 每当我提交表格时,get params发送给控制器只需添加到最后一个参数。

    例如,在第一次提交中,我选择状态0。

    stSelect = {&#34; 0&#34;}

    在第2次提交中,我选择状态0和1。

    stSelect = {&#34; 0&#34;&#34; 0&#34;&#34; 1&#34;}

    但原始过滤器工作正常。

  • 我需要单击“提交”以刷新网格。单击按钮组按钮时如何让网格更新?

0 个答案:

没有答案