Страница 1 из 2
Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.15, 08:03
aiaal_n
Всем привет. У меня такой вопрос даты при показе в таблице сделал в формате дд.мм.гггг
http://imgur.com/lBNLdqD
Код: Выделить всё
<?= DetailView::widget([
'model' => $model,
'attributes' => [
'id',
'fio',
'birthdate:date',
....
в моделе в функции rules добавил
Код: Выделить всё
[['birthdate'], 'date', 'format' => 'dd.MM.yyyy'],
[['birthdate'], 'default', 'value' => date('dd.MM.yyyy')],
и при редактировании в форме дата показывает в формате Y-m-d,
http://imgur.com/WQYiZka как изменить, чтобы при редактировании в форме показывала в формате дд.мм.гггг?
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.15, 16:55
zelenin
хранишь в каком формате? в том и редактируешь.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 08:12
aiaal_n
zelenin писал(а): ↑2017.07.15, 16:55
хранишь в каком формате? в том и редактируешь.
хранение в бд формате Y-m-d (бд MySQL)
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 08:29
Nex-Otaku
Есть несколько вариантов.
Первый вариант, подключаешь и настраиваешь яваскриптовый виджет, который автоматически будет преобразовывать дату Y-m-d => дд.мм.гггг и обратно.
Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 08:47
futbolim
Nex-Otaku писал(а): ↑2017.07.16, 08:29
Есть несколько вариантов.
Первый вариант, подключаешь и настраиваешь яваскриптовый виджет, который автоматически будет преобразовывать дату Y-m-d => дд.мм.гггг и обратно.
Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 12:22
zelenin
futbolim писал(а): ↑2017.07.16, 08:47Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 12:38
futbolim
zelenin писал(а): ↑2017.07.16, 12:22
futbolim писал(а): ↑2017.07.16, 08:47Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Наоборот
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 12:51
zelenin
futbolim писал(а): ↑2017.07.16, 12:38
zelenin писал(а): ↑2017.07.16, 12:22
futbolim писал(а): ↑2017.07.16, 08:47Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Наоборот
Код: Выделить всё
sql> insert into test VALUES ('20.12.2016')
[2017-07-16 12:51:00] [22008] ERROR: date/time field value out of range: "20.12.2016"
[2017-07-16 12:51:00] Hint: Perhaps you need a different "datestyle" setting.
[2017-07-16 12:51:00] Position: 26
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 15:25
futbolim
zelenin писал(а): ↑2017.07.16, 12:51
futbolim писал(а): ↑2017.07.16, 12:38
zelenin писал(а): ↑2017.07.16, 12:22
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Наоборот
Код: Выделить всё
sql> insert into test VALUES ('20.12.2016')
[2017-07-16 12:51:00] [22008] ERROR: date/time field value out of range: "20.12.2016"
[2017-07-16 12:51:00] Hint: Perhaps you need a different "datestyle" setting.
[2017-07-16 12:51:00] Position: 26
Бывает
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 15:29
zelenin
futbolim писал(а): ↑2017.07.16, 15:25
zelenin писал(а): ↑2017.07.16, 12:51
futbolim писал(а): ↑2017.07.16, 12:38
Наоборот
Код: Выделить всё
sql> insert into test VALUES ('20.12.2016')
[2017-07-16 12:51:00] [22008] ERROR: date/time field value out of range: "20.12.2016"
[2017-07-16 12:51:00] Hint: Perhaps you need a different "datestyle" setting.
[2017-07-16 12:51:00] Position: 26
Бывает
у тебя это часто бывает.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 16:07
futbolim
zelenin писал(а): ↑2017.07.16, 15:29
futbolim писал(а): ↑2017.07.16, 15:25
zelenin писал(а): ↑2017.07.16, 12:51
Код: Выделить всё
sql> insert into test VALUES ('20.12.2016')
[2017-07-16 12:51:00] [22008] ERROR: date/time field value out of range: "20.12.2016"
[2017-07-16 12:51:00] Hint: Perhaps you need a different "datestyle" setting.
[2017-07-16 12:51:00] Position: 26
Бывает
у тебя это часто бывает.
Вангуешь?
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 16:15
zelenin
futbolim писал(а): ↑2017.07.16, 16:07
zelenin писал(а): ↑2017.07.16, 15:29
у тебя это часто бывает.
Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.16, 21:55
futbolim
zelenin писал(а): ↑2017.07.16, 16:15
futbolim писал(а): ↑2017.07.16, 16:07
zelenin писал(а): ↑2017.07.16, 15:29
у тебя это часто бывает.
Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Хех, так мило, что ты за мной следишь )
Репортёр?
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.17, 00:40
zelenin
futbolim писал(а): ↑2017.07.16, 21:55
zelenin писал(а): ↑2017.07.16, 16:15
futbolim писал(а): ↑2017.07.16, 16:07
Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Хех, так мило, что ты за мной следишь )
я бы с большой натяжкой называл чтение форума слежкой за пользователями, и тем более за конкретным.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.17, 11:52
aiaal_n
Nex-Otaku писал(а): ↑2017.07.16, 08:29
Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
А как это сделать?
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.17, 12:06
futbolim
Можно воспользоваться afterFind()
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.17, 12:08
vitalik1183
Поведение как вариант.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.18, 15:28
Nex-Otaku
afterFind, поведение и другие способы, завязанные на события, плохи тем, что преобразование будет выполняться всегда. И это рано или поздно начнёт создавать проблемы.
Тебе же преобразование нужно только в двух случаях
1. модель передаётся в форму редактирования.
2. модель заполняется данными из формы.
Решается просто. В модель добавляешь свойство
прописываешь его в "rules"
Код: Выделить всё
['birthdateWithDots', 'safe'], // оставляем просто "safe" либо вписываем валидатор даты
далее в экшенах преобразовываем (пример кода для "actionCreate")
Код: Выделить всё
if ($model->load(Yii::$app->request->post())) {
$model->birthdate = $this->dateDotsToDashes($model->birthdateWithDots);
if ($model->save()) {
return $this->redirect(['view', 'id' => $model->id]);
}
}
$model->birthdateWithDots = $this->dateDashesToDots($model->birthdate);
return $this->render('create', [
'model' => $model,
]);
Ну и в форме, соответственно, в поле редактирования отдаём "birthdateWithDots" вместо "birthdate".
Вот так будет самое наглядное.
Если хочется сохранить контроллер чистым от этой логики, то можно создать модель специально для формы редактирования, в которую вынести все эти преобразования. Тогда экшен в контроллере вернётся практически к изначальному виду.
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.18, 15:32
vitalik1183
И что что всегда? Зато в вашем вариант забыл указать свойство и "привет"!
Событие можно отключить, если это не нужно(как и бихейвер). А если нужна дата в конкретном формате, то скорее всего она будет нужна практически во всем проекте. А где не нужна - отключили тот же бихейвер и вопрос решен. А в вашем вариант если будут манипуляции в 100500 местах то..
Re: Валидация даты в дд.мм.гггг вид
Добавлено: 2017.07.19, 07:59
Nex-Otaku
Событие можно отключить, если это не нужно(как и бихейвер).
Костыли. Борьба с последствиями изначально ошибочного решения.
А в вашем вариант если будут манипуляции в 100500 местах то..
Но ведь их нет. Преобразование только в том месте, где оно требуется - в форме редактирования, и больше нигде.