如何将CDataColumn过滤器应用于我的CGridView,以便它只显示具有空值的行?

时间:2013-05-20 06:24:37

标签: yii

我有一个带有布尔值的模型,从这样的表生成:

CREATE TABLE receivable (
    ...
    is_paid INTEGER DEFAULT NULL,
    ...
)

您应该只注意可能的NULL值。

我有一个gii生成的Receivable.php模型和一个简单的CGridView,如下所示:

$dataProvider = $model->search();
$dataProvider->pagination = ['pageSize'=>20]; 
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider,
    'filter'=>$model,
    'columns'=>array(
        'id',
        [
            'name'=>'is_paid',
            'type'=>'raw',
            'value'=>'($data->is_paid==1)?"PAID":"";',
            'filter'=>['1'=>'PAID', '0'=>'0']
        ],
        'someothercolumn',
        ['class'=>'CButtonColumn']
    ),
);

到目前为止应该有意义吗?它确实可以正常工作,只有一个小问题 - 我也想允许过滤空值!

'filter'=>['1'=>'PAID', '0'=>'0', null=>'null']  // This shows all records. 
'filter'=>['1'=>'PAID', '0'=>'0', ''=>'null']    // This also shows all records.
'filter'=>['1'=>'PAID', '<>1'=>'null or zero']   // This shows 0-records only. 
嗯,现在我不知所措。有什么办法可以使用CDataColumn.filter来允许用户过滤空值吗? (仅显示'is_paid'== null)的行

编辑:值可以是1,0或NULL,但过滤器只能应用于1或0(或显示所有内容)。如何让用户只显示带空值的行?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

这是你可以做到的一种方式

1.'filter' => array('0' => Yii::t('app', 'No'), '1' => Yii::t('app', 'Yes')),

或类似的东西

2.is_paid:boolean

或类似的东西

3.'filter' => CHtml::listData(UserRegistry::model()->findAll(), 'id_user_registry', 'firstname' ),

在上面的例子中,我有一个db表中的值

或类似的东西

4.'filter' => Lookup::items('option'),

对于模型中的上述示例,您将拥有类似这样的内容

4. public static function items($type, $code)
        {
            if(!isset(self::$_items[$type]))
                self::loadItems($type);
            return isset(self::$_items[$type][$code]) ? self::$_items[$type][$code] : false;           
        }

        private static function loadItems($type)
        {
            self::$_items[$type]=array();
            $models=self::model()->findAll(array(
                'condition'=>'type=:type',
                'params'=>array(':type'=>$type),
                //'order'=>'position',
            ));
            foreach($models as $model)
                self::$_items[$type][$model->code]=$model->name;
        }