yii2 - 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 中进行此检查?
解决方案
我的理解是,您想在registration_date
作为Date
类型列的列上添加一个过滤器,它应该有 2 个选项Regular
,Overdue
并且应该根据以下条件过滤记录
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 ] ); }
现在您可以根据所选选项过滤记录,如果您清除下拉列表中的选项,它将显示所有记录。
推荐阅读
- python - 我的 Spyder 在我的计算机上找不到我的模块
- javascript - Javascript - clearTimeout 不清除 setTimeout 变量
- python - 为什么我在 python 错误中收到“all”函数?
- javascript - 随时检查 URL 在 JavaScript 中的 URL 更改
- c++ - 从内存中删除 OpenVDB 对象
- javascript - useState() 是异步的问题
- php - laravel orm :按 id 排序,但将另一列的 0 值放在末尾
- java - 动态想要从其他片段中获取图像
- python - 使用 Keras 询问有关 EEG 分类的建议
- python - 如何全球化传入的函数变量python3