@Vasiliy_M

Как сохранять relation's в одной форме?

Есть сущность типа Post, есть теги к посту Tag хранящиеся через таблицу связей.

В форме поста ввел мультиселект для выбора тегов:
<?= $form->field($model, 'tags')->dropDownList(
        ArrayHelper::map(
            Tag::find()->all(), 'id', 'title'
        ), [
            'multiple' => true
        ]
    ) ?>

В модели Post:
public function afterSave($insert, $changedAttributes)
    {
        Tag2post::deleteAll(['post_id' => $this->id]);

        if (!empty($this->tags)) {
            foreach ($this->tags as $tag) {
                if (($tag = Tag::findOne($tag)) !== null) {
                    $relation = new Tag2post();
                    $relation->post_id = $this->id;
                    $relation->tag_id = $tag->id;
                    $relation->save();
                }
            }
        }

        parent::afterSave($insert, $changedAttributes);
    }

view:
<?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            // ..
            [
                'attribute' => 'tags',
                'value' => function ($model) {
                    $list = [];
                    foreach ($model->getTags()->all() as $tag) {
                        $list[] = $tag->title;
                    }
                    return empty($list) ? 'теги не указаны' : implode(', ', $list);
                },
            ]
        ],
    ]) ?>


когда происходит ошибка формы при Create (например, не пропускает валидатор post-запрос), нужно сделать так, что бы в select-списке были selected все выбранные пользователем option's. Как этого добиться?
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ответы на вопрос 1
Вам нужно добиться того, чтобы в $model->tags были ранее выбранные теги. Тогда дропдаун подхватит их и отметит отмеченными. Для сохранения связанных данных лучше использовать коробочный метод $model->link(). В официальной документации есть информация на этот счет. Также сохранение из afterSave лучше перенести туда где собственно сохранение происходит, в метод контроллера. Отправка запросов в цикле = зло
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы