У меня есть таблица с колонкой for_date
сохраняются по типу integer в базе данных.
Для того, чтобы показать for_date
с форматом DateTime я использовал ActiveForm с кодом:
<?= $form->field($model, 'for_date')->textInput([
'class' => 'form-control datepicker',
'value' => $model->for_date ? date(Yii::$app->params['dateFormat'], $model->for_date) : date(Yii::$app->params['dateFormat'], time()),
'placeholder' => 'Time'])
->label('Attendance Date') ?>
Но когда я создаю и сохраняю, Yii сообщает This field must be integer
В файле модели у меня было 2 функции для преобразования перед проверкой, но это все равно ошибка.
public function beforeValidate(){
if(!is_int($this->for_date)){
$this->for_date = strtotime($this->for_date);
$this->for_date = date('d/M/Y', $this->for_date);
}
return parent::beforeValidate();
}
public function afterFind(){
$this->for_date = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date));
$this->for_date = date('d/M/Y', $this->for_date);
return parent::afterFind();
}
Как я могу сделать это правильно, чтобы сохранить в базе данных с целым числом?
По вашему коду for_date
все еще в формате даты после beforeValidate
работает из-за линии:
$this->for_date = date('d/M/Y', $this->for_date);
Удалите эту строку, и она должна работать.
Однако у вас все еще будут проблемы, например, форматирование даты или кто-то вводит недействительную дату, например 30/02/2015
,
Я бы предложил создать отдельную собственность, например for_date_display
и добавление правила даты для этого. Тогда в beforeSave
преобразовать эту дату в метку времени и установить for_date
к этому значению следующим образом:
public $for_date_display;
...
public function afterFind() {
$this->for_date_display = \Yii::t('app', Yii::$app->formatter->asDate($this->for_date))
}
public function beforeSave($insert = true) {
$this->for_date = strtotime($this->for_date_display);
return parent::beforeSave($insert);
}
Я нашел решение. В поиске модели (мой случай AttendanceSearch.php
), найдите правила и двигайтесь for_date
от линии есть integer
ниже строки имеют safe
Мой код:
public function rules()
{
return [
[['id', 'user_id', 'project_id', 'commit_time', 'workload_type'], 'integer'],
[['comment', 'for_date'], 'safe'],
];
}