Валидация даты в дд.мм.гггг вид

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
aiaal_n
Сообщения: 11
Зарегистрирован: 2017.07.15, 07:22

Валидация даты в дд.мм.гггг вид

Сообщение 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 как изменить, чтобы при редактировании в форме показывала в формате дд.мм.гггг?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение zelenin »

хранишь в каком формате? в том и редактируешь.
aiaal_n
Сообщения: 11
Зарегистрирован: 2017.07.15, 07:22

Re: Валидация даты в дд.мм.гггг вид

Сообщение aiaal_n »

zelenin писал(а): 2017.07.15, 16:55 хранишь в каком формате? в том и редактируешь.
хранение в бд формате Y-m-d (бд MySQL)
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Валидация даты в дд.мм.гггг вид

Сообщение Nex-Otaku »

Есть несколько вариантов.

Первый вариант, подключаешь и настраиваешь яваскриптовый виджет, который автоматически будет преобразовывать дату Y-m-d => дд.мм.гггг и обратно.

Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение futbolim »

Nex-Otaku писал(а): 2017.07.16, 08:29 Есть несколько вариантов.

Первый вариант, подключаешь и настраиваешь яваскриптовый виджет, который автоматически будет преобразовывать дату Y-m-d => дд.мм.гггг и обратно.

Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение zelenin »

futbolim писал(а): 2017.07.16, 08:47Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение futbolim »

zelenin писал(а): 2017.07.16, 12:22
futbolim писал(а): 2017.07.16, 08:47Второй вариант. А вообще нужно юзать Постгрес. Она автоматом переделывает.
чего она автоматом переделывает? Y-m-d в d.m.Y?)
Наоборот
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение 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
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение 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
Бывает
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение 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
Бывает
у тебя это часто бывает.
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение 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
Бывает
у тебя это часто бывает.
Вангуешь?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение zelenin »

futbolim писал(а): 2017.07.16, 16:07
zelenin писал(а): 2017.07.16, 15:29
futbolim писал(а): 2017.07.16, 15:25
Бывает
у тебя это часто бывает.
Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение futbolim »

zelenin писал(а): 2017.07.16, 16:15
futbolim писал(а): 2017.07.16, 16:07
zelenin писал(а): 2017.07.16, 15:29 у тебя это часто бывает.
Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Хех, так мило, что ты за мной следишь )
Репортёр?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Валидация даты в дд.мм.гггг вид

Сообщение zelenin »

futbolim писал(а): 2017.07.16, 21:55
zelenin писал(а): 2017.07.16, 16:15
futbolim писал(а): 2017.07.16, 16:07

Вангуешь?
констатирую: твои форумные вопросы и советы удивительно не коррелируют с твоим опытом (временнЫм)
Хех, так мило, что ты за мной следишь )
я бы с большой натяжкой называл чтение форума слежкой за пользователями, и тем более за конкретным.
aiaal_n
Сообщения: 11
Зарегистрирован: 2017.07.15, 07:22

Re: Валидация даты в дд.мм.гггг вид

Сообщение aiaal_n »

Nex-Otaku писал(а): 2017.07.16, 08:29 Второй вариант, после загрузки модели преобразовываешь дату прямо в PHP, и в форму отдаёшь преобразованную дату. Соответственно обратно тоже преобразовываешь при разборе данных формы.
А как это сделать?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Валидация даты в дд.мм.гггг вид

Сообщение futbolim »

Можно воспользоваться afterFind()
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Валидация даты в дд.мм.гггг вид

Сообщение vitalik1183 »

Поведение как вариант.
Yii2!
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Валидация даты в дд.мм.гггг вид

Сообщение Nex-Otaku »

afterFind, поведение и другие способы, завязанные на события, плохи тем, что преобразование будет выполняться всегда. И это рано или поздно начнёт создавать проблемы.

Тебе же преобразование нужно только в двух случаях
1. модель передаётся в форму редактирования.
2. модель заполняется данными из формы.

Решается просто. В модель добавляешь свойство

Код: Выделить всё

    public $birthdateWithDots;
прописываешь его в "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".

Вот так будет самое наглядное.

Если хочется сохранить контроллер чистым от этой логики, то можно создать модель специально для формы редактирования, в которую вынести все эти преобразования. Тогда экшен в контроллере вернётся практически к изначальному виду.
Аватара пользователя
vitalik1183
Сообщения: 1675
Зарегистрирован: 2014.07.01, 08:42

Re: Валидация даты в дд.мм.гггг вид

Сообщение vitalik1183 »

И что что всегда? Зато в вашем вариант забыл указать свойство и "привет"!
Событие можно отключить, если это не нужно(как и бихейвер). А если нужна дата в конкретном формате, то скорее всего она будет нужна практически во всем проекте. А где не нужна - отключили тот же бихейвер и вопрос решен. А в вашем вариант если будут манипуляции в 100500 местах то..
Yii2!
Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Валидация даты в дд.мм.гггг вид

Сообщение Nex-Otaku »

Событие можно отключить, если это не нужно(как и бихейвер).
Костыли. Борьба с последствиями изначально ошибочного решения.
А в вашем вариант если будут манипуляции в 100500 местах то..
Но ведь их нет. Преобразование только в том месте, где оно требуется - в форме редактирования, и больше нигде.
Ответить