yii2-taggable

Yii框架的可标记行为。(The taggable behavior for the Yii framework.)

  • Owner: creocoder/yii2-taggable
  • Platform: Linux, Mac, Windows
  • License:: Other
  • Category::
  • Topic:
  • Like:
    0
      Compare:

Github stars Tracking Chart

Taggable Behavior for Yii 2

Build Status
Code Coverage
Code Quality
Packagist Version

A modern taggable behavior for the Yii framework.

Installation

The preferred way to install this extension is through composer.

Either run

$ composer require creocoder/yii2-taggable

or add

"creocoder/yii2-taggable": "~2.0"

to the require section of your composer.json file.

Migrations

Run the following command

$ yii migrate/create create_post_table

Open the /path/to/migrations/m_xxxxxx_xxxxxx_create_post_table.php file,
inside the up() method add the following

$this->createTable('{{%post}}', [
    'id' => Schema::TYPE_PK,
    'title' => Schema::TYPE_STRING . ' NOT NULL',
    'body' => Schema::TYPE_TEXT . ' NOT NULL',
]);

Run the following command

$ yii migrate/create create_tag_table

Open the /path/to/migrations/m_xxxxxx_xxxxxx_create_tag_table.php file,
inside the up() method add the following

$this->createTable('{{%tag}}', [
    'id' => Schema::TYPE_PK,
    'name' => Schema::TYPE_STRING . ' NOT NULL',
    'frequency' => Schema::TYPE_INTEGER . ' NOT NULL DEFAULT 0',
]);

Run the following command

$ yii migrate/create create_post_tag_assn_table

Open the /path/to/migrations/m_xxxxxx_xxxxxx_create_post_tag_assn_table.php file,
inside the up() method add the following

$this->createTable('{{%post_tag_assn}}', [
    'post_id' => Schema::TYPE_INTEGER . ' NOT NULL',
    'tag_id' => Schema::TYPE_INTEGER . ' NOT NULL',
]);

$this->addPrimaryKey('', '{{%post_tag_assn}}', ['post_id', 'tag_id']);

Configuring

Configure model as follows

use creocoder\taggable\TaggableBehavior;

/**
 * ...
 * @property string $tagValues
 */
class Post extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'taggable' => [
                'class' => TaggableBehavior::className(),
                // 'tagValuesAsArray' => false,
                // 'tagRelation' => 'tags',
                // 'tagValueAttribute' => 'name',
                // 'tagFrequencyAttribute' => 'frequency',
            ],
        ];
    }

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

    public function transactions()
    {
        return [
            self::SCENARIO_DEFAULT => self::OP_ALL,
        ];
    }

    public static function find()
    {
        return new PostQuery(get_called_class());
    }

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

Model Tag can be generated using Gii.

Configure query class as follows

use creocoder\taggable\TaggableQueryBehavior;

class PostQuery extends \yii\db\ActiveQuery
{
    public function behaviors()
    {
        return [
            TaggableQueryBehavior::className(),
        ];
    }
}

Usage

Setting tags to the entity

To set tags to the entity

$post = new Post();

// through string
$post->tagValues = 'foo, bar, baz';

// through array
$post->tagValues = ['foo', 'bar', 'baz'];

Adding tags to the entity

To add tags to the entity

$post = Post::findOne(1);

// through string
$post->addTagValues('bar, baz');

// through array
$post->addTagValues(['bar', 'baz']);

Remove tags from the entity

To remove tags from the entity

$post = Post::findOne(1);

// through string
$post->removeTagValues('bar, baz');

// through array
$post->removeTagValues(['bar', 'baz']);

Remove all tags from the entity

To remove all tags from the entity

$post = Post::findOne(1);
$post->removeAllTagValues();

Getting tags from the entity

To get tags from the entity

$posts = Post::find()->with('tags')->all();

foreach ($posts as $post) {
    // as string
    $tagValues = $post->tagValues;

    // as array
    $tagValues = $post->getTagValues(true);
}

Return type of getTagValues can also be configured globally via tagValuesAsArray property.

Checking for tags in the entity

To check for tags in the entity

$post = Post::findOne(1);

// through string
$result = $post->hasTagValues('foo, bar');

// through array
$result = $post->hasTagValues(['foo', 'bar']);

Search entities by any tags

To search entities by any tags

// through string
$posts = Post::find()->anyTagValues('foo, bar')->all();

// through array
$posts = Post::find()->anyTagValues(['foo', 'bar'])->all();

To search entities by any tags using custom tag model attribute

// through string
$posts = Post::find()->anyTagValues('foo-slug, bar-slug', 'slug')->all();

// through array
$posts = Post::find()->anyTagValues(['foo-slug', 'bar-slug'], 'slug')->all();

Search entities by all tags

To search entities by all tags

// through string
$posts = Post::find()->allTagValues('foo, bar')->all();

// through array
$posts = Post::find()->allTagValues(['foo', 'bar'])->all();

To search entities by all tags using custom tag model attribute

// through string
$posts = Post::find()->allTagValues('foo-slug, bar-slug', 'slug')->all();

// through array
$posts = Post::find()->allTagValues(['foo-slug', 'bar-slug'], 'slug')->all();

To search entities related by tags

// through string
$posts = Post::find()->relatedByTagValues('foo, bar')->all();

// through array
$posts = Post::find()->relatedByTagValues(['foo', 'bar'])->all();

To search entities related by tags using custom tag model attribute

// through string
$posts = Post::find()->relatedByTagValues('foo-slug, bar-slug', 'slug')->all();

// through array
$posts = Post::find()->relatedByTagValues(['foo-slug', 'bar-slug'], 'slug')->all();

Donating

Support this project and others by creocoder via gratipay.

Support via Gratipay

Main metrics

Overview
Name With Ownercreocoder/yii2-taggable
Primary LanguagePHP
Program languagePHP (Language Count: 1)
PlatformLinux, Mac, Windows
License:Other
所有者活动
Created At2015-01-06 13:17:26
Pushed At2018-10-02 11:51:11
Last Commit At2015-03-01 05:52:39
Release Count3
Last Release Name2.0.0 (Posted on )
First Release Name1.0.0 (Posted on )
用户参与
Stargazers Count131
Watchers Count23
Fork Count33
Commits Count91
Has Issues Enabled
Issues Count25
Issue Open Count12
Pull Requests Count1
Pull Requests Open Count1
Pull Requests Close Count3
项目设置
Has Wiki Enabled
Is Archived
Is Fork
Is Locked
Is Mirror
Is Private