kit-tools / yii2-tags
标签扩展
Requires
- php: >=7.1
- kartik-v/yii2-widget-select2: ~2.0.8
- yiisoft/yii2: ~2.0.0
Requires (Dev)
- codeception/codeception: 3.1.*
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