Gridview中的自定义过滤器(常规或过期)

时间:2018-07-06 13:30:50

标签: yii2

我有一个registration_date列,用于存储客户在公司中注册的日期(例如:2015-06-12)。如果客户注册失败或过期(如果registration_date超过365天),则需要进行过滤。

在预览屏幕中,我可以显示这种情况,但是我需要在 Gridview 中显示为带有两个选项(常规或过期)的过滤器。

[
             'attribute' => 'registration_date',
             'format' => 'raw',
             'value' => function ($model) {
                 return $model->getRegistration($model->registration_date);
             },
             'filter' => [Regular or Overdue], ????
             'contentOptions' => $contentOptions,
             'headerOptions'  => $headerOptions,
],

如何在ClientSearch模型中进行此检查?

1 个答案:

答案 0 :(得分:1)

据我了解,您想在registration_date类型的列Date上添加过滤器,该列应具有2个选项RegularOverdue并应基于

过滤记录
  • Regular

    该选项应过滤出所有差异为registration_date小于或等于365天的记录。

  • Overdue

    该选项应筛选出与当前日期相差registration_date天超过365天的所有记录。

您的gridview列如下所示

enter image description here

GridView更改

如果以上正确,那么首先将以下配置添加到您的gridview列配置中。我们将在filter选项中提供一个主动下拉菜单,并为其指定一个名称registration_status

注意:我使用了select2作为下拉菜单,如果您不想使用下拉菜单,则可以使用默认设置,并将$searchModel更改为您要使用的客户端搜索模型的确切名称传递到gridview中的filterModel选项。

[

    'filter' => \kartik\widgets\Select2::widget ( [
        'data' => $searchModel->statusOptions(),
        'model' => $searchModel ,
        'attribute' => 'registration_status' ,
        'options' => [
            'placeholder' => 'Registration Status' ,
            'class' => 'form-control' ,
            'id' => 'registration_status' ,
        ] ,
        'theme' => \kartik\widgets\Select2::THEME_BOOTSTRAP ,
        'pluginOptions' => [
            'allowClear' => true ,
        ] ,
    ] ) ,
    'attribute' => 'created_at' ,
    'label' => Yii::t ( 'app' , 'Registration Date' ) ,
] ,

没有Select2

[
    'filter' => Html::activeDropDownList ( $searchModel , 'registration_status' , $searchModel->statusOptions () , [ 'prompt' => 'Select Registration status' ] ) ,
    'attribute' => 'created_at' ,
    'label' => Yii::t ( 'app' , 'Registration Date' ) ,
] ,

ClientSearch更改

  • 将常数添加到ClientSearch模型的顶部。
    • const STATUS_OVERDUE = 'overdue';
    • const STATUS_REGULAR = 'regular';
  • statusOptions()模型内部添加函数ClientSearch

        public function statusOptions() {
            return [
                self::STATUS_OVERDUE => 'Overdue' ,
                self::STATUS_REGULAR => 'Regular'
            ];
        }
    
  • 在搜索模型中添加公共属性registration_status

    public $registration_status

  • 将我们创建的该字段添加到safe内的rules()

    功能。

    function rules(){
        return [
            //other rules
            [ [.... , 'registration_status' ] , 'safe' ] ,
        ];
    }
    
  • 然后下一步是完成将筛选出记录的SQL条件,您可以使用MySQL函数DATEDIFF()CURDATE(),就像DATEDIFF(CURDATE(),registration_date)>365一样。

    因此,在搜索模型的search()函数的最后一行return $dataProvider之前添加以下内容。

    if ( $this->registration_status === self::STATUS_OVERDUE ) {
        $query->andFilterWhere ( [ '>' , 'DATEDIFF(NOW(),registration_date)' , 365 ] );
    } else if ( $this->registration_status === self::STATUS_REGULAR ) {
        $query->andFilterWhere ( [ '<=' , 'DATEDIFF(NOW(),registration_date)' , 365 ] );
    }
    

现在,您可以根据所选选项过滤记录,如果您清除下拉菜单中的选项,它将显示所有记录。