Вывод ошибок валидации, в форме из двух моделей

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Вывод ошибок валидации, в форме из двух моделей

Сообщение Drugpunker »

Здравствуйте всем.
Сделал форму добавления статьи.

В форме имеется поле для добавления тегов.
Теги вывожу, используя виджет картика (Select2)

Всё вроде работает, но не знаю как, собственно, выводить пользователю ошибки валидации, если этим самым пользователем добавлен несуществующий в базе тег.

Вот прямо чую, что существует некая хорошая практика по работе со связанными моделями.

Порядок действий сейчас такой:
Если модель статьи прошла валидацию, проверяю все теги из $_POST на наличие в бд.
Если в бд нет, добавляю в массив новых тегов и валидирую их.
Если весь массив прошёл валидацию, - опять же в цикле, записываю теги в бд.
Работает.
Но как выводить ошибки, если тег валидацию не прошёл?

В PostController

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

public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post())) {

            if ($model->validate()) {

                //Если тега нет в базе тегов - добавить
                //Проверить на валидность
                $new_tags_arr = [];

                foreach ($_POST['Posts']['post_tags'] as $key => $value) {
                    $tag_query = Tags::find()
                        ->where(['tag_name' => $value])->one();

                    if (!$tag_query) {
                        //Добавить в массив новых, добавить порядковый ключ и значение из _POST
                        array_push($new_tags_arr, [[$key, $value]]);
                        $tag_model = new Tags();
                        $tag_model->tag_name = $value;

                        if (!$tag_model->validate()) {
                        ////////ВОТ ЗДЕСЬ ЗАТЫК
                            return $tag_model->errors;
                        }
                    }
                }

                //Если не было ошибок - добавить все новые теги в базу
                foreach ($new_tags_arr as $key => $value) {
                    $post_tag_key = $value[0][0];
                    $post_tag_value = $value[0][1];

                    $tag_model = new Tags();
                    $tag_model->tag_name = $post_tag_value;

                    if ($tag_model->validate()) {
                        If ($tag_model->save()) {
                            //Заменить значение в поле на id нового тега, для afterSave в Posts
                            $model->post_tags[$post_tag_key] = $tag_model->tag_id;
                        }
                    }
                }

                //Сохранить статью
                $model->save();
                return $this->redirect(Yii::$app->request->referrer ?: Yii::$app->homeUrl);
            }
        }
}
rootMan
Сообщения: 3
Зарегистрирован: 2020.07.15, 23:16

Re: Вывод ошибок валидации, в форме из двух моделей

Сообщение rootMan »

Очень хорошая практика не громоздить такой экшн.
А для валидации есть метод rules() и пользовательские валидаторы
https://yiiframework.com.ua/ru/doc/guid ... alidation/
Drugpunker
Сообщения: 187
Зарегистрирован: 2014.08.13, 19:44

Re: Вывод ошибок валидации, в форме из двух моделей

Сообщение Drugpunker »

leonenco писал(а): 2020.07.16, 07:41 Используйте метод addError() : https://www.yiiframework.com/doc/api/2. ... r()-detail
Спасибо, посмотрю обязательно.
Ответить