在 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 中更改页面大小的下拉列表并使用此解决方案。希望我的解决方案也能帮到你。
在我的 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 中更改页面大小的下拉列表并使用此解决方案。希望我的解决方案也能帮到你。