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