Создал модель Tag.php
Код: Выделить всё
<?php
namespace app\models;
/**
* This is the model class for table "tag".
*
* @property integer $id
* @property string $name
*/
class Tag extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'tag';
}
public function rules()
{
return [
[['name'], 'required'],
[['name'], 'string', 'max' => 50],
];
}
public function attributeLabels()
{
return [
'id' => 'ID',
'name' => 'Наименование',
];
}
}
Код: Выделить всё
<?php
namespace app\models;
use Yii;
/**
* This is the model class for table "zakaz_tag".
*
* @property integer $id
* @property integer $zakaz_id
* @property integer $tag_id
*/
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']);
}
}
Код: Выделить всё
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 [
...
[['id_zakaz', ..], 'integer'],
[['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;//делаем чтобы в полях select2 отображался value, без него не будет отображаться
}
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();//если присутствует то мы его сохраняем его в моделе ZakazTag
$model->zakaz_id = $this->id_zakaz;//Присваиваем id_zakaz
$model->tag_id = $one;//Присваиваем id тэга который пришел
$model->save();
}
if (isset($arr[$one])){//если присутствует данное значение в массиве то мы его перезапиываем
unset($arr[$one]);
}
}
}
}
Код: Выделить всё
<?= $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,
],
]);
?>
Код: Выделить всё
if (isset($arr[$one])){
В post запросе приходит следующие данные в дебаге
Если вар дампить то в переменной $one вот значение что отображается'Zakaz' => [
'description' => 'тестовые кружки'
'number' => '50'
'information' => 'ааи'
'name' => 'Иван'
'phone' => '89503164233'
'email' => ''
'oplata' => '1 500'
'fact_oplata' => '25'
'srok' => '2017-07-26 12:10:00'
'status' => ''
'prioritet' => ''
'tags_array' => [
0 => '3'
1 => '1'
]
]
Если $arr[$one], то там выходит ошибка Illegal offset type. Слишком много написал, но думаю что скорее всего это достаточно чтобы понять как сохранить тэги для профессионала. Я встал только на этом вопросе, потому что не могу сохранить это тэгиobject(app\models\Tag)[213]
private '_attributes' (yii\db\BaseActiveRecord) =>
array (size=2)
'id' => int 1
'name' => string 'Не берет номер' (length=26)
private '_oldAttributes' (yii\db\BaseActiveRecord) =>
array (size=2)
'id' => int 1
'name' => string 'Не берет номер' (length=26)
private '_related' (yii\db\BaseActiveRecord) =>
array (size=0)
empty
private '_errors' (yii\base\Model) => null
private '_validators' (yii\base\Model) => null
private '_scenario' (yii\base\Model) => string 'default' (length=7)
private '_events' (yii\base\Component) =>
array (size=0)
empty
private '_behaviors' (yii\base\Component) =>
array (size=0)
empty
Если $arr то вот array (size=1)
1 => int 1