Сделал форму добавления статьи.
В форме имеется поле для добавления тегов.
Теги вывожу, используя виджет картика (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);
}
}
}