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实现元素浮动和清除浮动的方法

    针对“CSS实现元素浮动和清除浮动的方法”,下面是一个详细的攻略: 一、什么是元素浮动? 在CSS中,元素的浮动是指将某个元素从它原有位置向左或向右移动,直到它的左边缘或右边缘触及包含它的容器或另一个浮动元素为止。CSS中常用的浮动方式有左浮动(float: left;)和右浮动(float: right;)。 使用浮动布局的好处在于可以让元素从正常的文档流…

    css 2023年6月10日
    00
  • 让我来教你使用css中的字体图标的方法

    这里是使用CSS中的字体图标的完整攻略。 什么是字体图标 字体图标是指通过 CSS 技术将矢量图标嵌入到普通的文本内容中,以字体的形式展示在网页上。与传统的图像图标比较,字体图标具有体积小、色彩清晰、适应性强的优点。 如何使用字体图标 基本上就是在 CSS 中应用 web 字体 + Unicode 字符的组合定义字体图标。具体操作分为三步: 下载字体图标库。…

    css 2023年6月9日
    00
  • 5种方法快速去掉HTML中Inline-Block的空白

    下面我将详细讲解五种方法快速去掉HTML中Inline-Block的空白的攻略。 前言 当我们在使用 Inline-Block 布局时,会发现元素之间会出现一些空白,这对我们的布局会产生一定的影响。那么接下来,我们将介绍5种方法来快速去掉这些空白。 方法一:使用负的字间距 我们可以通过给 Inline-Block 元素设置一个负的字间距来去掉元素之间的空白。…

    css 2023年6月9日
    00
  • JS+CSS实现仿msn风格选项卡效果代码

    下面是详细讲解“JS+CSS实现仿msn风格选项卡效果代码”的完整攻略,包含以下几个步骤: 1. HTML结构 首先,我们需要在HTML中定义选项卡的基本结构,通常采用<ul>和<li>来表示。具体代码如下: <ul class="tabnav"> <li class="active&q…

    css 2023年6月10日
    00
  • 关于table表格中的内容溢出布局方法

    好的!下面是针对table表格中内容溢出的解决方法的攻略。 问题描述 在table表格中,如果一行中某一列的内容过长,就会导致整个表格排版错乱,内容溢出,影响页面的美观度和用户的体验感。 解决方法 1. 使用CSS属性:text-overflow CSS属性text-overflow可以控制元素中溢出部分的文本如何呈现,常用于处理较长文本在较小空间内显示时溢…

    css 2023年6月10日
    00
  • 使用vue引入maptalks地图及聚合效果的实现

    以下是使用Vue引入maptalks地图及聚合效果的实现攻略: 1. 引入maptalks库 首先,我们需要在Vue项目中引入maptalks地图库,通过NPM进行安装: npm install maptalks –save 在Vue组件中引入maptalks库,可以通过以下方式实现: import maptalks from ‘maptalks’; 2.…

    css 2023年6月11日
    00
  • HTML的dl、dt、dd标记制作表格对决Table制作表

    HTML 中的 <dl>、<dt>、<dd> 标记是用来制作定义列表的,使用这三个标记可以很方便地制作出类似于表格的结构。下面我们将介绍如何通过定义列表制作出类似于表格的结构,以及与传统的 <table> 标记制作出的表格对比。 1. <dl>、<dt>、<dd>标记制作表格…

    css 2023年6月10日
    00
  • 高性能JavaScript 重排与重绘(2)

    高性能JavaScript 重排与重绘(2) 完整攻略 什么是重排与重绘 在了解高性能JavaScript中的重排(re-layout)和重绘(re-paint)之前,需要先了解一些页面绘制的基础知识。当我们访问一个网站时,浏览器会先对HTML进行解析,并生成DOM树。接着,CSS样式会被解析,并生成样式树。浏览器在解析文档的同时,还会对JavaScript…

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