首页 > 解决方案 > Gridview 中的自定义过滤器(常规或过期)

问题描述

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

在预览屏幕中,我可以显示此条件,但我需要在Gridview中显示为具有 2 个选项(常规或过期)的过滤器。

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

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

标签: yii2

解决方案


我的理解是,您想在registration_date作为Date类型列的列上添加一个过滤器,它应该有 2 个选项RegularOverdue并且应该根据以下条件过滤记录

  • Regular

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

  • Overdue

    该选项应过滤掉registration_date与当前日期相差大于365天的所有记录。

您的 gridview 列将如下所示

在此处输入图像描述

GridView变化

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

注意:我已经使用select2了下拉菜单,如果您不需要,您可以使用默认值,并将您传递给网格视图中选项$searchModel的客户端搜索模型的确切名称更改为确切名称。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 ] );
    }
    

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


推荐阅读