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实现时间段筛选功能 - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • CSS裁剪属性clip使用的实例教程

    下面我将详细讲解“CSS裁剪属性clip使用的实例教程”的完整攻略。 什么是CSS裁剪属性clip? CSS裁剪属性clip指定了一个区域,该区域内的元素将会被显示,超出该区域的部分将会被裁剪掉,并不会显示在页面上。clip属性的值包括四个值:clip-top、clip-right、clip-bottom、clip-left,分别表示裁剪区域的上、右、下、左…

    css 2023年6月10日
    00
  • Designer怎么布局css网页?

    设计师在布局CSS网页时,需要考虑网页的结构、排版和样式等方面。以下是一个详细的攻略,介绍了设计师如何布局CSS网页,包括两个示例说明: 1. 网页结构 在布局CSS网页时,首先需要考虑网页的结构。通常,网页可以分为头部、主体和底部三个部分。头部通常包括网站的标志、导航菜单和搜索框等元素;主体通常包括网页的主要内容;底部通常包括版权信息、联系方式和社交媒体链…

    css 2023年5月18日
    00
  • Bootstrap开发实战之第一次接触Bootstrap

    Bootstrap开发实战之第一次接触Bootstrap Bootstrap是一个流行的前端框架,它可以帮助我们快速开发一个美观、响应式的网页。在这篇文章中,我们将介绍如何第一次接触Bootstrap并使用它构建一个简单的网页。 步骤1:下载Bootstrap 首先,我们需要从Bootstrap官网上下载最新版本的Bootstrap。下载之后,我们可以解压缩…

    css 2023年6月11日
    00
  • CSS作用域(样式分割)的使用汇总

    关于“CSS作用域(样式分割)的使用汇总”的完整攻略,下面是详细的讲解。 概述 “CSS作用域”指的是对CSS样式限定作用范围的一种技术,这种技术使用广泛,可以有效避免样式冲突和代码污染,提高代码的可维护性和可读性,是开发者不可或缺的一项技能。当我们在编写CSS样式时,可能会遇到样式污染或者样式冲突的问题,此时可以使用一些技巧来进行样式分割和作用域限制,以达…

    css 2023年6月9日
    00
  • 浅谈CSS中overflow清除浮动的用法

    以下是关于 “浅谈CSS中overflow清除浮动的用法” 的详细攻略。 什么是浮动 在CSS中,浮动指将元素从其正常位置移动,并沿着其父元素的左侧或右侧浮动。这个概念是为了能够将文本和图片等元素组合在一起,以形成复杂的布局。 浮动元素带来的问题 当一个元素浮动时,其它元素可能会出现在它的下方,这时候就需要通过清除浮动来确保页面布局不混乱。 如何清除浮动 空…

    css 2023年6月10日
    00
  • CSS中box(盒模式)的分析

    CSS中的盒模型是指网页元素被看作一个矩形的盒子,这个盒子由4个部分组成,分别是:content(内容区域)、padding(内边距)、border(边框)、margin(外边距)。这4个部分都有各自的作用,我们需要通过CSS的属性来控制这4个部分的样式和大小。 盒模型的组成 盒模型的4个部分的具体含义如下: Content: 盒子里面用来显示文本、图像、视…

    css 2023年6月10日
    00
  • css子元素相对父元素进行定位的实现

    当我们需要将一个子元素相对于其父元素进行定位时,我们可以使用CSS的定位属性。在CSS中,有以下属性可以用来实现子元素相对父元素进行定位: position: relative; – 用于将子元素相对于父元素进行定位。该属性可以将元素定位到其正常位置之上,同时其他元素仍然占据其正常位置。 top, bottom, left, right – 用于控制相应的方…

    css 2023年6月9日
    00
  • CSS实例:创建一个鼠标感应换图片的按钮

    下面我将详细讲解如何使用CSS创建一个鼠标感应换图片的按钮。 1. 创建HTML结构 首先,我们需要在HTML中创建一个基本的按钮结构。在这个例子中,我们使用button元素来创建按钮,它的class属性为button-change-img。 <button class="button-change-img"></but…

    css 2023年6月10日
    00
合作推广
合作推广
分享本页
返回顶部