我的理解是,您想在registration_date作为Date类型列的列上添加一个过滤器,它应该有 2 个选项Regular,Overdue并且应该根据以下条件过滤记录
您的 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 ] );
}
现在您可以根据所选选项过滤记录,如果您清除下拉列表中的选项,它将显示所有记录。