kit-tools/yii2-tags

标签扩展

安装: 0

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分叉: 0

开放问题: 0

类型:yii2-extension

1.0.0 2019-08-26 09:32 UTC

This package is auto-updated.

Last update: 2024-09-26 21:47:01 UTC


README

此扩展允许您为不同的模型添加标签。计算每个模型的标签权重和每个标签的点击次数。还有一个管理面板用于添加标签。还有一些小部件用于显示标签。

安装

安装此扩展的首选方式是通过composer。

运行以下命令

composer require kittools/yii2-tags "^1.0.0"

或添加以下内容

"kittools/yii2-tags": "^1.0.0"

到您的composer.json文件的要求部分。

使用方法

管理员

添加到配置(config/main.php 或 config/web.php)

'controllerMap' => [
    'tag' => 'kittools\tags\controllers\TagController'
],

属性 $tagList

在您想要关联标签的模型中添加

<?php
...
/**
 * @var array list of tags entered by the user.
 */
public $tagList = [];
...

验证规则

<?php
public function rules(){
    ...
    ['tagList', 'required', 'skipOnEmpty' => false],
    ['tagList', 'each', 'rule' => ['string'], 'message' => 'Tags are filled incorrectly.'],
    ...
}

如果标签是可选的,则需要删除以下行

    ['tagList', 'required'],

行为

public function behaviors()
{
    return [
        ...
        'tagBehavior' => [
            'class' => TagBehavior::className(),
        ],
        ...
    ];
}

TagBehavior 与事件协同工作

  • ActiveRecord :: EVENT_AFTER_INSERT, ActiveRecord :: EVENT_AFTER_UPDATE - 添加新标签,建立/删除模型与标签关系。
  • ActiveRecord :: EVENT_AFTER_DELETE - 当删除模型时,删除与标签的链接。链接的标签不会被删除。

重要!!!如果模型中有连接的标签,并且在保存时标签不会传递,则所有与标签的链接将被删除!为了避免这种情况,在保存模型之前,您需要取消TagBehavior的绑定

$model->detachBehavior('tagBehavior');

一对一关系

<?php
use kittools\tags\models\Tag;
use kittools\tags\models\TagEntityRelation;
...
public function getTags()
{
    return $this->hasMany(Tag::class, ['id' => 'tag_id'])
        ->viaTable(TagEntityRelation::tableName(), ['entity_id' => 'id'], function($query){
            $query->andWhere([TagEntityRelation::tableName() . '.entity' => static::class]);
        });
}

此方法通过中间表将模型链接添加到多对多标签。

在创建/编辑模型时添加标签的表单

添加标签小部件

<?php
use kittools\tags\widgets\TagInputWidget;
...
?>

...
<?= $form->field($model, 'tagList')
    ->widget(TagInputWidget::className(), [
        'pluginOptions' => [
            // maximum number of tags that can be selected
            'maximumSelectionLength'=> 5,
        ]
    ])
    ->hint('Press "Space", "," or Enter to separate tags from each other.')
    ->label('Tags'); ?>
...

小部件通过Ajax请求加载标签。标签加载的最小单词长度为2个字符。

<?php
use kittools\tags\widgets\TagInputWidget;
use yii\helpers\ArrayHelper;
use kittools\tags\models\Tag;
...
?>
...
<?= $form->field($model, 'tagList')
    ->widget(TagInputWidget::className(), [
        'pluginOptions' => [
            // maximum number of tags that can be selected
            'maximumSelectionLength'=> 2,
            // Minimum tag length for listing tags, default 2
            'minimumInputLength' => 0,
            // disabling tag loading by ajax request
            'ajax' => null,
        ],
        // Tags list
        'data' => ArrayHelper::map(Tag::find()->all(), 'title', 'title')
    ])
    ->hint('Press "," or "Enter" to separate tags from each other')
    ->label('Tags'); ?>
...

小部件不通过Ajax请求加载标签。页面加载时加载标签列表。

标签小部件继承自 kartik\select2\Select2

有关小部件设置的更多信息,请参阅 https://select2.org/

标签输出小部件

在使用小部件显示材料列表时,请勿忘记“N + 1查询问题”。

<?php
use kittools\tags\widgets\TagsEntityWidget;
...
echo TagsEntityWidget::widget([
    'model' => $model,
    'caseRegister' => 'upper',
    'tagUrl' => ['site/tag'],
    'delimiter' => ', ',
 ]);
...

在文件 kittools\tags\widgets\TagsEntityWidget 中详细描述小部件设置

标签云小部件

<?php
use kittools\tags\widgets\CloudTagsWidget;
use app\models\News;
...
echo CloudTagsWidget::widget([
    'entity' => News::className(),
    'type' => CloudTagsWidget::TYPE_WEIGHT,
    'shuffleTags' => false,
    'tagUrl' => ['/news/tag'],
    'coefficientIncreaseFont' => 1,
    'tagPrefix' => '',
    'tagUrlOptions' => ['style' => 'color: #003366;', 'target' => '_blank']
]);
...

有关小部件设置的更多信息,请参阅 kittools\tags\widgets\CloudTagsWidget