沃梦达 / IT编程 / 前端开发 / 正文

yii gridview实现时间段筛选功能

下面是“yii gridview实现时间段筛选功能”的完整攻略。

下面是“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'],
    ];
}

然后,在主模型Modelsearch()方法中添加关联模型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;
}

然后,在主模型Modelfields()方法中添加关联模型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实现时间段筛选功能