【问题标题】:Yii2 gridview date range picker filter won't functionYii2 gridview 日期范围选择器过滤器不起作用
【发布时间】:2020-03-10 03:00:20
【问题描述】:

我已将 kartik-v 日期范围选择器添加到我的网格视图中,但在我选择日期后过滤器无法工作。小部件的占位符将显示所选日期,但网格视图中的结果不匹配。 gridview 中的结果显示所有数据。

视图中的代码:

<?= GridView::widget([
    'options' => ['class' => 'table-sm'],
    'filterModel' => $searchModel,
    'dataProvider' => $dataProvider,
    'summary' =>'',
    'columns' => [
        [
            'attribute' => 'price',
            'value' => function ($model) {
                return number_format($model->price, 3);
            },
            'contentOptions' => ['class' => 'text-right']
        ],
        [
            'attribute' => 'date',
            'contentOptions' => ['class' => 'text-right'],
            'filter' => DateRangePicker::widget([
                'name'=>'date_range_2',
                'presetDropdown'=>true,
                'convertFormat'=>true,
                'includeMonthsFilter'=>true,
                'attribute' => 'date',
                'model' => $searchModel,
                'pluginOptions' => ['locale' => ['format' => 'Y-m-d']],
                'options' => ['placeholder' => 'Select Date']
            ])
        ],
    ]
]); ?>

下面的代码是我的 $searchModel 部分。
更新:

public function rules()
{
    return [
        [['id'], 'integer'],
        [['name', 'date'], 'safe'],
        [['price'], 'number'],
    ];
}

/**
 * {@inheritdoc}
 */
public function scenarios()
{
    // bypass scenarios() implementation in the parent class
    return Model::scenarios();
}

/**
 * Creates data provider instance with search query applied
 *
 * @param array $params
 *
 * @return ActiveDataProvider
 */
public function search($params)
{
    $query = Lme::find()->orderBy([
        'date' => SORT_DESC
    ]);

    // add conditions that should always apply here

    $dataProvider = new ActiveDataProvider([
        'query' => $query,
        'sort' => false //['defaultOrder' => ['date' => SORT_DESC]]
    ]);

    $this->load($params);

    if (!$this->validate()) {

        return $dataProvider;
    }

    // grid filtering conditions
    $query->andFilterWhere([
        'id' => $this->id,
        'price' => $this->price,
        'date' => $this->date,
    ]);

    $query->andFilterWhere(['like', 'name', $this->name]);


    return $dataProvider;
    }

【问题讨论】:

  • 显示你的$searchModel

标签: gridview yii2 kartik-v


【解决方案1】:

DateRangePicker 本身为您提供了一个包含范围的字符串,因此带有'date' =&gt; $this-&gt;date 的简单 where 子句无法工作。 Kartik V. 在包kartik-v/yii2-date-range 中提供了行为kartik\daterange\DateRangeBehavior

我正在通过以下方式成功使用它。请注意,我的时间戳属性是timestamp_visit

在视图中:

echo GridView::widget([
...
    'columns' => [
        [
            'attribute' => 'timestamp_visit',
            'format' => [
                'datetime',
                'medium'
            ],
            'width' => '60px',
            'filterType' => GridView::FILTER_DATE_RANGE,
            'filterWidgetOptions' => [
                'model' => $searchModel,
                'convertFormat' => true,
                'pluginOptions' => [
                    'timePicker' => true,
                    'timePickerIncrement' => 1,
                    'timePicker24Hour' => true,
                    'locale' => [
                        'format' => $searchModel::TIME_FORMAT,
                    ]
                ]
            ]
        ],
    ...
    ]

在搜索模型中:

<?php
...
use kartik\daterange\DateRangeBehavior;

class ...Search extends ....
{
    const TIME_FORMAT = 'Y-m-d H:i:s';

    /**
     * @var string Start date filled up by DateRangeBehavior
     */     
    public $timestampVisitStart;

    /**         
     * @var string End date filled up by DateRangeBehavior
     */         
    public $timestampVisitEnd;
...

       public function rules()
    {
        return [
            [['timestamp_visit'], 'match', 'pattern' => '/^.+\s\-\s.+$/'],
            ...
        ];
    } 
    public function behaviors()
    {
        return [
            [
                'class' => DateRangeBehavior::class,
                'attribute' => 'timestamp_visit',
                'dateStartAttribute' => 'timestampVisitStart',
                'dateEndAttribute' => 'timestampVisitEnd',
                'dateStartFormat' => self::TIME_FORMAT,
                'dateEndFormat' => self::TIME_FORMAT,
            ]
        ];
    }
...
    public function search($params)
    {
        $query = self::find();

        $dataProvider = new ActiveDataProvider([
            'query' => $query
        ]);

        $dataProvider->sort = new Sort([
            'defaultOrder' => [
                'timestamp_visit' => SORT_DESC,
                'id' => SORT_DESC,
            ]
        ]);
...
        if ($this->timestampVisitStart) {
            $query->andWhere(['>=', "timestamp_visit", $this->timeToUTC($this->timestampVisitStart)]);
        }
        if ($this->timestampVisitStart) {
            $query->andWhere(['<=', "timestamp_visit", $this->timeToUTC($this->timestampVisitEnd)]);
        }

        return $dataProvider;
   }

   /**
     * Convert string time in format $format to UTC time format for SQL where clause
     * @param string $time Time in format $format
     * @param string $format Format of $time for the function date, default 'Y-m-d H:i:s'
     */
    private function timeToUTC($time, $format='Y-m-d H:i:s')
    {
        $timezoneOffset = \Yii::$app->formatter->asDatetime('now', 'php:O');
        return date($format, strtotime($time.$timezoneOffset));
    }
}

【讨论】:

  • 我想问一下,你使用'timestamp_visit'的属性来自那里的数据库,它有一个名为'timestamp_visit'的列,对吗?还有数据库中的'timestampVisitStart'和'timestampVisitEnd'?或者你只是在 searchModel 中声明?
  • 是的,timestamp_visit 是 MySQL 类型 timestamp 的 DB 字段。 timestampVisitStarttimestampVisitEnd 当然只在搜索模型中声明。
  • 谢谢,但是很抱歉再次询问行为函数中的“className()”是指哪个类?因为我现在对此感到困惑。 “className”只是在此行为中声明使用,或者我需要将其更改为我的模型类名称?
  • DateRangeBehavior::className() 返回 DateRangeBehavior 的完全限定类名,因此在我的示例中使用它。行为配置需要行为的类名才能将其添加到当前模型。因为 className() 自 Yii 2.0.14 起已弃用,我已将其更改为 ::class。但它也适用于::className()。您需要在我的示例中将timestampVisittimestamp_visit 更改为date。这就是你所需要的。
  • 我已经更改了您在我的 searchModel 中告诉的内容,但在我的 GridView 中,在我选择特定日期后它仍然显示所有结果。我的 searchModel 函数有什么影响吗?--> "public function search($params) { $query = Lme::find()->orderBy([ 'date' => SORT_DESC ]); // 添加条件总是在这里应用 $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => false //['defaultOrder' => ['date' => SORT_DESC]] ]);"
猜你喜欢
  • 1970-01-01
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2014-11-02
相关资源
最近更新 更多