rkit/tags-behavior-yii2

Tags Behavior for Yii2

1.0.0 2018-07-16 16:57 UTC

README

Build Status Scrutinizer Code Quality

Flexible yii2 behavior for tags.

Requirements

PHP 7

Installation

composer require rkit/tags-behavior-yii2

Configuration

For example, we have a Post model and we want to add tags.
Let's do it.

  1. Add tag and post_to_tag tables and a Tag model for the tags
$this->createTable('{{%tag}}', [
    'id' => $this->primaryKey(),
    'name' => $this->string()->notNull()->unique(),
    'frequency' => $this->integer()->notNull()->defaultValue(0),
]);

$this->createTable('{{%post_to_tag}}', [
    'post_id' => $this->integer()->notNull()->defaultValue(0),
    'tag_id' => $this->integer()->notNull()->defaultValue(0),
]);

$this->addPrimaryKey('', '{{%post_to_tag}}', ['post_id', 'tag_id']);
  1. Add a TagsBehavior behavior to the Post model
public function behaviors()
{
    return [
        'tagsBehavior' => [
            'class' => 'rkit\tags\behavior\TagsBehavior',
            'relation' => 'tags',
            'tagAttribute' => 'name',
            'tagFrequencyAttribute' => 'frequency', // or false
            'findTag' => function ($value) {
                return Tag::find()->where([$this->tagAttribute => $value])->one();
            },
            'createTag' => function ($value) {
                $tag = new Tag();
                $tag->{$this->tagAttribute} = $value;
                return $tag;
            },
        ],
    ];
}
  1. Add a tags relation (see relation option in the behavior)
/**
 * @return \yii\db\ActiveQuery
 */
public function getTags()
{
    return $this
        ->hasMany(Tag::class, ['id' => 'tag_id'])
        ->viaTable('{{%post_to_tag}}', ['post_id' => 'id']);
}

Usage

Add tags

$model = new Post();
$model->setTagValues(['example1', 'example2']);
$model->save();

Get tags

$post = Post::find()->with('tags')->where(['id' => $id])->one();
$post->getTagValues();

Remove tags

$model = new Post();
$model->setTagValues([]);
$model->save();

Tests

Coding Standard