在 GridView 小部件中使用下拉列表过滤我的 dataProvider 中的结果 (Yii 1.x)

Use a dropdown to filter results within my dataProvider in GridView widget (Yii 1.x)

在我的 Yii 1.x 应用程序中,我使用 GridView 小部件来显示表格数据。我想要一个简单的下拉菜单,让我可以过滤结果。

在这种情况下,我有一组 'Reward' 数据 - 每个奖励将是 'Positive' 或 'Negative'。我希望有一个下拉菜单可以在两者之间进行过滤。

这是我的代码:

<?php $this->widget('bootstrap.widgets.TbGridView', array(
'dataProvider' => $model->search(true, $drill, isset($drillVal) ? $drillVal : false, isset($drillField) ? $drillField : false),
'filter' => $model,
'id' => get_class($model),
'type' => 'striped bordered condensed',
'template' => $model->getGridTemplate(),
'pagerCssClass' => 'pull-right pagination pagination-sm',
'columns' => array(
    array(
        'name' => 'reward_name',
        'filter' => false
    ),
    array(
        'name'              => 'reward_type',
        'header'            => 'Reward Type',
        'filter'            => false // need some code here for filtering
    ),
    array(
        'name'              => 'totalPoints',
        'header'            => 'Total Points',
        'filter'            => false
    ),
),
));

例如,这将如下所示....

+-----------------------------------------+
| Reward Name | Reward Type | Total Points|
+-----------------------------------------+
|  Good Work  |   Positive  |     500     |    
| Great Effort|   Positive  |     150     |
|   Naughty   |   Negative  |     -75     |
+-----------------------------------------+

我希望过滤允许我仅显示 'negatives' 或仅显示 'positives'

任何人都可以建议我如何最好地做到这一点吗?

注意 - 在我的 search() 中,条件元素中有一个 IF 语句,如下所示:

'IF(t.type="1","Deduction","Achievement") AS reward_type',

首先,您需要在视图中有一个下拉列表:

CHtml::dropDownList('rewardType', $rewardType, array(0 =>"-", 1=>"Positive", 2=>"Negative"), array(
    'onchange' =>
    "$.fn.yiiGridView.update('yourGridID(without # sign)',{ data:{rewardType: $(this).val() }})",
));

您还可以使用手动下拉列表(没有 yii)并在 onchange 事件上发送 ajax 请求,并在 ajax 请求成功事件上更新 gridView。

现在您需要在 $model->search() 方法中添加此代码(在初始化 $criteria 之后):

if(isset($_POST['rewardType']) && ($_POST['rewardType'] != 0))
{
    Yii::app()->session['rewardType'] = $_POST['rewardType'];
    $criteria->addCondition("t.reward_type = ".$_POST['rewardType']);
}

最后的工作是在视图文件的开头添加一行:

<?php $rewardType= (isset(Yii::app()->session['rewardType'])) ? Yii::app()->session['rewardType'] : 0; ?>

我最近实现了类似的情况。我有一个用于在 CGridView 中更改页面大小的下拉列表并使用此解决方案。希望我的解决方案也能帮到你。