Yii2 gridview日期范围选取器筛选器不起作用

Yii2 gridview日期范围选取器筛选器不起作用,gridview,yii2,kartik-v,Gridview,Yii2,Kartik V,我已将kartik-v日期范围选择器添加到我的gridview中,但在我选择日期后,过滤器无法工作。小部件的占位符将显示所选日期,但gridview中的结果不匹配。gridview中的结果显示所有数据 视图中的代码: <?= GridView::widget([ 'options' => ['class' => 'table-sm'], 'filterModel' => $searchModel, 'dataProvider' => $dat

我已将kartik-v日期范围选择器添加到我的gridview中,但在我选择日期后,过滤器无法工作。小部件的占位符将显示所选日期,但gridview中的结果不匹配。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']
            ])
        ],
    ]
]); ?>

DateRangePicker本身为您提供了一个包含范围的字符串,因此带有“date”=>$this->date的简单where子句无法工作。Kartik V.在程序包Kartik-V/yii2日期范围中提供行为Kartik\daterange\DateRangeBehavior

我正在以以下方式成功地使用它。请注意,我的timestamp属性是timestamp\u 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));
    }
}

显示您的$searchmodel我想问一下,您使用的“timestamp\u visit”属性来自数据库,它的列名为“timestamp\u visit”,对吗?还有数据库中的“timestampVisitStart”和“timestampVisitEnd”?或者您只是在searchModel中声明?是的,timestamp\u visit是MySQL类型timestamp的DB字段。timestampVisitStart和timestampVisitEnd当然只在搜索模型中声明。谢谢,但很抱歉再次询问行为函数中的类名是指哪个类?因为我现在很困惑。类名只是此行为中的一个声明用法,或者我需要将其更改为我的模型类名?DateRangeBehavior::className返回DateRangeBehavior的完全限定类名,因此请像在我的示例中一样使用它。行为配置需要行为的类名才能将其添加到当前模型中。因为自Yii 2.0.14以来,className已被弃用,所以我将其更改为::class。但它也适用于::className。在我的示例中,您需要将timestamp\u visit和timestamp\u visit更改到目前为止。这就是你所需要的。我已经更改了你在我的搜索模型中告诉我的内容,但在我的GridView中,在我选择特定日期后,它仍然显示所有结果。我的searchModel函数有任何影响吗?->public function search$params{$query=Lme::find->orderBy['date'=>SORT\u DESC];//在此处添加应始终应用的条件$dataProvider=new ActiveDataProvider['query'=>query'=>SORT'=>false/['defaultOrder'=>date'=>SORT\u DESC]];
<?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));
    }
}