下面是“yii gridview实现时间段筛选功能”的完整攻略。
一、准备工作
首先,我们需要在后台控制器中定义一个名为search()
的方法来进行筛选。在该方法中,我们需要通过传递的参数获取目标时间段的开始时间和结束时间,以便进行筛选。
public function actionIndex()
{
$searchModel = new ModelSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
public function actionSearch($start_time, $end_time)
{
$searchModel = new ModelSearch();
$dataProvider = $searchModel->search([
'ModelSearch' => [
'start_time' => $start_time,
'end_time' => $end_time,
]
]);
return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}
然后,在模型Model
中定义一个名为search()
的方法,用于查询符合条件的数据。在该方法中,我们需要添加时间段的筛选条件。
public static function search($params)
{
$query = Model::find();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$query->andFilterWhere(['between', 'create_time', $this->start_time, $this->end_time]);
return $dataProvider;
}
二、实现时间段筛选功能
在视图文件index.php
中,使用jquery插件daterangepicker来实现选择时间段的功能。
<?php
use drsdre\daterangepicker\DateRangePicker;
echo DateRangePicker::widget([
'model'=>$searchModel,
'attribute'=>'create_time',
'convertFormat'=>true,
'language'=>'zh-CN',
'startAttribute'=>'start_time',
'endAttribute'=>'end_time',
'pluginOptions'=>[
'locale' => ['format' => 'Y-m-d'],
'opens'=>'left',
]
]);
?>
然后,在搜索按钮上添加一个JavaScript函数,用于提交时间段筛选的请求。
<?php echo Html::submitButton('搜索', ['class' => 'btn btn-primary', 'onclick' => 'search()']) ?>
最后,在JavaScript代码中定义search()
方法,来发送请求并重新加载GridView。
function search() {
var start_time = $('#modelsearch-start_time').val();
var end_time = $('#modelsearch-end_time').val();
$.pjax.reload({
url: '?r=controller/search&start_time=' + start_time + '&end_time=' + end_time,
container: '#pjax-container',
timeout: 10000
});
}
三、示例说明
示例一
我们需要在Model模型的create_time
字段上进行时间段筛选。首先,我们需要在模型的rules()
方法中添加该字段的验证规则。
public function rules()
{
return [
[['create_time'], 'safe'],
];
}
然后,在GridView的columns
属性中添加该字段的显示。
[
'attribute' => 'create_time',
'format' => ['date', 'php:Y-m-d H:i:s'],
'filter' => false,
'headerOptions' => ['width' => '160'],
],
最后,在GridView的dataProvider
属性中添加模型的search()
方法,同时设定pagination
属性为真。
echo GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'id',
'title',
[
'attribute' => 'create_time',
'format' => ['date', 'php:Y-m-d H:i:s'],
'filter' => false,
'headerOptions' => ['width' => '160'],
],
['class' => 'yii\grid\ActionColumn'],
],
'layout' => "{items}\n{pager}",
'pager' => [
'firstPageLabel' => '首页',
'lastPageLabel' => '尾页',
'prevPageLabel' => '上一页',
'nextPageLabel' => '下一页',
'maxButtonCount' => 5,
],
]);
示例二
现在我们需要在关联模型的create_time
字段上进行时间段筛选。首先,我们需要在关联模型的rules()
方法中添加该字段的验证规则。
public function rules()
{
return [
[['create_time'], 'safe'],
];
}
然后,在主模型Model
的search()
方法中添加关联模型Relate
的查询以及关联表的join条件。
public static function search($params)
{
$query = Model::find()->joinWith('relate');
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$dataProvider->setSort([
'attributes' => [
'create_time' => [
'asc' => ['model.create_time' => SORT_ASC],
'desc' => ['model.create_time' => SORT_DESC],
]
]
]);
$dataProvider->setPagination(['pageSize' => 10]);
$relateQuery = Relate::find();
$relateDataProvider = new ActiveDataProvider([
'query' => $relateQuery,
]);
$query->andFilterWhere(['between', 'model.create_time', $this->start_time, $this->end_time]);
$relateQuery->andFilterWhere(['between', 'relate.create_time', $this->start_time, $this->end_time]);
return $dataProvider;
}
然后,在主模型Model
的fields()
方法中添加关联模型Relate
的查询。
public function fields()
{
return [
'id',
'title',
'create_time',
'relate_create_time' => function () {
return $this->relate->create_time;
}
];
}
最后,在GridView的columns
属性中添加关联模型Relate
的显示。
[
'attribute' => 'relate_create_time',
'format' => ['date', 'php:Y-m-d H:i:s'],
'filter' => false,
'headerOptions' => ['width' => '160'],
'value' => function($model) {
return $model->relate_create_time;
}
],
以上就是Yii GridView实现时间段筛选功能的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:yii gridview实现时间段筛选功能 - Python技术站