/** * @inheritdoc */ public function validateAttribute($model, $attribute) { $label = $model->getAttributeLabel($attribute); if (!is_array($model->{$attribute})) { $model->addError($attribute, Yii::t('many-to-many', '{attribute} must be an array.', ['attribute' => $label])); return; } /* @var $behavior null|ManyToManyBehavior */ $behavior = null; foreach ($model->behaviors as $key => $attachedBehavior) { if ($attachedBehavior::className() == ManyToManyBehavior::className()) { $behavior = $attachedBehavior; break; } } if (!$behavior) { throw new InvalidConfigException("Behavior not detected."); } /* @var $relation null|\arogachev\ManyToMany\components\ManyToManyRelation */ $relation = null; foreach ($behavior->getManyToManyRelations() as $attachedRelation) { if ($attachedRelation->editableAttribute == $attribute) { $relation = $attachedRelation; break; } } if (!$relation) { throw new InvalidConfigException("Relation not detected."); } $primaryKeys = $model->{$attribute}; if (!$primaryKeys) { return; } /* @var $relatedModel \yii\db\ActiveRecord */ $relatedModel = $relation->relatedModel; $relatedModelPk = $relatedModel::primaryKey()[0]; $relatedModelsCount = $relatedModel::find()->where([$relatedModelPk => $primaryKeys])->count(); if (count($primaryKeys) != $relatedModelsCount) { $error = 'There are nonexistent elements in {attribute} list.'; $model->addError($attribute, Yii::t('many-to-many', $error, ['attribute' => $label])); } }
public function behaviors() { return [TimestampBehavior::className(), BlameableBehavior::className(), DateTimeBehavior::className(), CacheBehavior::className(), ['class' => AdminLogBehavior::className(), 'titleAttribute' => 'title', 'icon' => 'fa-bars bg-olive'], ['class' => TranslateableBehavior::className(), 'translationAttributes' => ['title', 'slug', 'description', 'content', 'image_description', 'redirect', 'meta_title', 'meta_keywords', 'meta_description'], 'translationLanguageAttribute' => 'locale'], ['class' => ImageUploadBehavior::className(), 'attribute' => 'image', 'defaultImage' => '/images/no_image.png', 'thumbs' => ['small' => ['width' => 150, 'height' => 100], 'big' => ['width' => 450, 'height' => 150]], 'filePath' => '@frontend/web/uploads/news/[[id_path]]/[[pk]].[[extension]]', 'fileUrl' => '/uploads/news/[[id_path]]/[[pk]].[[extension]]', 'thumbPath' => '@frontend/web/uploads/news/[[id_path]]/[[profile]]_[[pk]].[[extension]]', 'thumbUrl' => '/uploads/news/[[id_path]]/[[profile]]_[[pk]].[[extension]]'], ['class' => ManyToManyBehavior::className(), 'relations' => [['editableAttribute' => 'categories', 'table' => '{{%news_news_category}}', 'ownAttribute' => 'news_id', 'relatedModel' => NewsCategory::className(), 'relatedAttribute' => 'category_id', 'fillingRoute' => ['news/news/create', 'news/news/update']]]], ['class' => TaggableBehavior::className()], ['class' => GalleryBehavior::className(), 'galleryClass' => NewsGallery::className()]]; }
/** * Use alternative config - relation via relation * @param Test|\arogachev\ManyToMany\behaviors\ManyToManyBehavior $test * @param array $additionalUsersRelationConfig * @return Test|\arogachev\ManyToMany\behaviors\ManyToManyBehavior */ protected function useRelationViaRelation($test, $additionalUsersRelationConfig = []) { $test->attachBehavior('manyToMany', ['class' => ManyToManyBehavior::className(), 'relations' => [array_merge(['name' => 'usersViaRelation', 'editableAttribute' => 'editableUsers'], $additionalUsersRelationConfig)]]); $test->customInit(); if (!$test->isNewRecord) { $test->afterFind(); } return $test; }
/** * @inheritdoc */ public function behaviors() { return ['manyToMany' => ['class' => ManyToManyBehavior::className(), 'relations' => [array_merge(['editableAttribute' => 'editableUsers', 'table' => 'tests_users', 'ownAttribute' => 'test_id', 'relatedModel' => User::className(), 'relatedAttribute' => 'user_id'], self::$additionalUsersRelationConfig)]]]; }