Yii2: taggable — простая реализация тегов

yii2 простая реализация теговОтличное расширение для создания и управления тегами.

Установка

Здесь ничего нового, используем composer, добавляем строку:

"creocoder/yii2-taggable": "dev-master"

в раздел require файла composer.json приложения и выполняем команду:

composer update

или сразу выполняем команду:

php composer.phar require creocoder/yii2-taggable:dev-master

Настройка

Модифицируем модель подобным образом:

use creocoder\taggable\TaggableBehavior;

/**
 * ...
 * @property string $tagNames
 */
class Post extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            TaggableBehavior::className(),
        ];
    }

    public function rules()
    {
        return [
            //...
            ['tagNames', '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']);
    }
}

И класс query следующим образом:

use creocoder\taggable\TaggableQueryBehavior;

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

Использование

Установка тегов записи

$post = new Post();

// Задание тегов строкой
$post->tagNames = 'foo, bar, baz';

// Задание тегов массивом
$post->tagNames = ['foo', 'bar', 'baz'];

Добавление тегов записи

$post = Post::findOne(1);

// Добавление тегов строкой
$post->addTagNames('bar, baz');

// Добавление тегов массивом
$post->addTagNames(['bar', 'baz']);

Удаление тегов записи

$post = Post::findOne(1);

// Удаление тегов строкой
$post->removeTagNames('bar, baz');

// Удаление тегов массивом
$post->removeTagNames(['bar', 'baz']);

Получение тегов записи

$posts = Post::find()->with('tags')->all();
foreach ($posts as $post) {
    echo $post->tagNames;
}

Поиск записей по одному из тегов

Поиск по одному из тегов строкой
$posts = Post::find()->anyTagNames('foo, bar')->all();

// Поиск по одному из тегов массивом
$posts = Post::find()->anyTagNames(['foo', 'bar'])->all();

Поиск записей по всем тегам

Поиск по всем тегам строкой
$posts = Post::find()->allTagNames('foo, bar')->all();

// Поиск по всем тегам массивом
$posts = Post::find()->allTagNames(['foo', 'bar'])->all();

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *