Yii 如何将CDATA列筛选器应用于CGridView,使其仅显示空值的行?

Yii 如何将CDATA列筛选器应用于CGridView,使其仅显示空值的行?,yii,Yii,我有一个带有布尔值的模型,由如下表生成: CREATE TABLE receivable ( ... is_paid INTEGER DEFAULT NULL, ... ) $dataProvider = $model->search(); $dataProvider->pagination = ['pageSize'=>20]; $this->widget('zii.widgets.grid.CGridView', array( 'd

我有一个带有布尔值的模型,由如下表生成:

CREATE TABLE receivable (
    ...
    is_paid INTEGER DEFAULT NULL,
    ...
)
$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']
    ),
);
您应该只注意可能的空值

我有一个gii生成的received.php-model和一个简单的CGridView,如下所示:

CREATE TABLE receivable (
    ...
    is_paid INTEGER DEFAULT NULL,
    ...
)
$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. 
'filter'=>['1'=>'PAID','0'=>'0',null=>'null']//这将显示所有记录。
'filter'=>['1'=>'PAID','0'=>'0',''=>'null']//这也会显示所有记录。
'filter'=>['1'=>'PAID','1'=>'null或zero']//这仅显示0条记录。
嗯,现在我不知所措。是否有任何方法可以使用CDATA Column.filter允许用户筛选空值?(仅显示“已付款”==null的行)

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


非常感谢您的帮助

这是一种方法

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' ),
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;
        }
或者类似的事情

2.is_paid:boolean
3.'filter' => CHtml::listData(UserRegistry::model()->findAll(), 'id_user_registry', 'firstname' ),
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;
        }
在上面的例子中,我在db表中有这些值

或者类似的事情

2.is_paid:boolean
3.'filter' => CHtml::listData(UserRegistry::model()->findAll(), 'id_user_registry', 'firstname' ),
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;
        }
对于模型中的上述示例,您将有如下内容

2.is_paid:boolean
3.'filter' => CHtml::listData(UserRegistry::model()->findAll(), 'id_user_registry', 'firstname' ),
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;
        }

>数组('0'=>Yii::t('app','No'),'1'=>Yii::t('app','Yes'))。这适用于1和0。但是如何将空值作为目标?值可以是1,0或NULL,但我只能筛选1,0或全部。我希望用户能够使用过滤器仅显示具有空值的行。我现在会研究你的其他解决方案,但我想你错过了我的问题。对不起,不清楚!我现在编辑了标题。你的问题是正确的,我没有注意到,我错过了带有null的部分,请尝试在CgridView=中查看此->处理null值,如果仍然存在问题,请告诉我为什么要使用null作为值?在创建条目时将其默认为0,或者如果您的条目需要2种以上的状态,则将记录int并使用0,1,2作为状态。使用null作为过滤选项非常棘手,这是因为等待时间太长。我接受这个答案(因为这是唯一的答案)。正如Tavi所说,我相信正确的解决方案是从一开始就避免空值。非常感谢。