我有一个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模型中进行此检查?
答案 0 :(得分:1)
据我了解,您想在registration_date
类型的列Date
上添加过滤器,该列应具有2个选项Regular
和Overdue
并应基于
Regular
该选项应过滤出所有差异为registration_date
小于或等于365
天的记录。
Overdue
该选项应筛选出与当前日期相差registration_date
天超过365
天的所有记录。
您的gridview列如下所示
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 ] );
}
现在,您可以根据所选选项过滤记录,如果您清除下拉菜单中的选项,它将显示所有记录。