Задать вопрос
@hollanditkzn

Почему у меня не сохраняет тэги?

Как получить сохранение тегов, вроде бы система должна сохранять массив тегов, но почему то не сохраняет.
Моя реализация Модель tag.php
namespace app\models;

class Tag extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'tag';
    }
...
   
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'name' => 'Наименование',
        ];
    }
}

В моделе Zakaz.php
namespace app\models;

use Yii;
use yii\helpers\ArrayHelper;
use yii\db\ActiveRecord;

class Zakaz extends ActiveRecord
{
...
    public $tags_array;

    public static function tableName()
    {
        return 'zakaz';
    }

    public function rules()
    {
        return [
          ...
            [['tags_array'], 'safe'],
           ...
        ];
    }

    public function attributeLabels()
    {
        return [
            'id_zakaz' => '№',
           ...
            'tags_array' => 'Тэги',
        ];
    }
    public function getZakazTag()
    {
        return $this->hasMany(ZakazTag::className(), ['zakaz_id' => 'id_zakaz']);
    }

    public function getTags()
    {
        return $this->hasMany(Tag::className(), ['id' => 'tag_id'])->via('zakazTag');
    }

    public function afterFind()
    {
        return $this->tags_array = $this->tags;
    }
    public function afterSave($insert, $changedAttributes)
    {
        parent::afterSave($insert, $changedAttributes);

        $arr = ArrayHelper::map($this->tags, 'id', 'id');
        foreach ($this->tags_array as $one){
            if (!in_array($one, $arr)){
                $model = new ZakazTag();
                $model->zakaz_id = $this->id_zakaz;
                $model->tag_id = $one;
                $model->save();
            }
        }
    }
}

ZakaTag.php
namespace app\models;

use Yii;

class ZakazTag extends \yii\db\ActiveRecord
{
    public static function tableName()
    {
        return 'zakaz_tag';
    }

    public function rules()
    {
        return [
            [['zakaz_id', 'tag_id'], 'required'],
            [['zakaz_id', 'tag_id'], 'integer'],
        ];
    }

    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'zakaz_id' => 'Zakaz ID',
            'tag_id' => 'Tag ID',
        ];
    }

    public function getTag()
    {
        return $this->hasOne(Tag::className(), ['id' => 'tag_id']);
    }
}

В форме _form.php
<?= $form->field($model, 'tags_array')->widget(Select2::className(), [
                    'data' => ArrayHelper::map(Tag::find()->all(), 'id', 'name'),
                    'language' => 'ru',
                    'options' => ['placeholder' => 'Выберите тэг', 'multiple' => true],
                    'pluginOptions' => [
                        'allowClear' => true,
                        'tags' => true,
                        'maximumInputLength' => 10,
                    ],
                ]);
        ?>

Где я делаю не правильно?
В post запросе Zakaz 'tags_array' => [
0 => '3'
1 => '1'
2 => '2'
]
  • Вопрос задан
  • 242 просмотра
Подписаться 1 Оценить 13 комментариев
Решения вопроса 1
@hollanditkzn Автор вопроса
Максим Тимофеев Я решил уйти от afterSave, чтобы не путать меня и пошел по старой проверенной схеме, через контроллер.
Покапавшись в интернете как получать такие запросы
Zakaz => [
'tags_array' => [
0 => '3'
1 => '1'
2 => '2'
]
]

наткнулся вот на такой пост Yii::$app->request->post('Zakaz')['tags_array'] и все очень хорошо пошло, все сохраняет и удаляет прекрасно, даже мучиться разбираться не нужно почему в afterSave не сохраняет и почему именно этот массив не обрабатывает, возможно не достаточно опыта или просто не хватает наставника, но как бы прекрасно все работает и для моего восприятие она более понятнее что откуда берется.
Теперь контроллер постоянно громоздкий получается, потому что там не только одна модель сохраняется а уже 3 модели сохраняет и получается что create и update большой постоянно становится.
Но вот мой код в контроллере по сохранению тэгов
if ($model->load(Yii::$app->request->post()) && $client->load(Yii::$app->request->post())) {
$arr = ArrayHelper::map($model->tags, 'id', 'id');
                    foreach (Yii::$app->request->post('Zakaz')['tags_array'] as $one){
                        if (!in_array($one, $arr)){
                            $tag = new ZakazTag();
                            $tag->zakaz_id = $id;
                            $tag->tag_id = $one;
                            $tag->save();
                        }
                        if (isset($arr[$one])){
                            unset($arr[$one]);
                        }
                    }
                    ZakazTag::deleteAll(['tag_id' => $arr]);
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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