具有两个属性的 Kartik DateRangePicker 在范围日期选择时导致 invalidDateFormat 和 NaN

Kartik DateRangePicker with two attributes cause invalidDateFormat and NaN on range date selection

我对我在 gridview 中用于过滤某些结果的 Kartik DateRangePicker 小部件有疑问。

在我的 SearchModel 中,我创建了两个属性

    public $date_start;
    public $date_end;

我使用这些来过滤数据库中的字段 'insert_date'。

在我看来,作为网格配置,我已经设置了这些选项

[
            'attribute' => 'insert_date',
            'options' => ['class' => 'gridview-date-column'],
            'filter' => DateRangePicker::widget([
                'model' => $searchModel,
                'name' => 'insert_date',
                'attribute' => 'insert_date',
                'startAttribute' => 'date_start',
                'endAttribute' => 'date_end',
                'convertFormat'=>true,
                'pluginOptions' => [
                    'opens'=>'right',
                    'locale' => [
                        'cancelLabel' => 'Clear',
                        'format' => 'd-m-Y',
                    ],
                ]
            ]),
            'format' => ['date', Yii::$app->formatter->datetimeFormat],
            'contentOptions'=>['style'=>'min-width: 200px;'] 
        ],

默认情况下 $date_start 和 $date_end 没有值,因此,当我进入我的视图并尝试过滤此字段时,我收到 'invalidDate' 错误并且日历上的一系列 NaN

如果我为这两个字段设置一个值,或者如果将它们从配置中删除(因此我只能使用 insert_date 属性作为具有这两个范围的字符串进行过滤,则此问题是固定的)。

查看插件存储库,我找到了 same case 并且作为作者的回应

This problem occurs because you have an invalid date format for the data that does not match the plugin's format.

但由于这些字段为空,因此永远不可能有正确的数据格式。

有人遇到过同样的问题吗? 预先感谢所有回复。

我找到了解决方案:

在 Kartik 插件中有一个我可以包含在我的 searchModel 中的行为模型:

use kartik\daterange\DateRangeBehavior;

然后我可以实例化它覆盖 behaviors() 方法:

public $date_start;
public $date_end;

public function behaviors() {
    return [
        [
            'class' => DateRangeBehavior::className(),
            'attribute' => 'insert_date',
            'dateStartAttribute' => 'date_start',
            'dateEndAttribute' => 'date_end',
            'dateStartFormat' => 'd-m-Y',
            'dateEndFormat' => 'd-m-Y',

        ]
    ];
}

在 search() 方法中:

public function search($params)
{
   // Some other filters
   if($this->date_start && $this->date_end) {
      // filtered query
   }
}

希望这可以帮助其他人。