sjaakp / yii2-taggable
管理Yii2中ActiveRecord的标签。
Requires
README
管理PHP框架Yii 2.0中ActiveRecords的标签
本包包含五个类,用于处理ActiveRecords的标签化,标签可以与或从模型(ActiveRecord)关联,并可排序。标签通过Pixabay开发的优秀jQuery tagEditor进行操作。
yii2-taggable 的四个主要类如下
- TagBehavior - 使ActiveRecord表现得像标签;
- TaggableBehavior - 为ActiveRecord添加标签处理;
- TagEditor - 用于操作标签的部件;
- TagSuggestAction - 为TagEditor的自动完成功能提供数据。
还有一个名为 TagEditorAsset 的类,它是TagEditor的辅助类。
yii2-taggable 套件的一个演示 在这里。
请注意,版本2的API与版本1略有不同。
安装
安装 yii2-taggable 的首选方法是使用 Composer。您可以将以下内容添加到 composer.json
文件的 require 部分
"sjaakp/yii2-taggable": "*"
或者运行
composer require sjaakp/yii2-taggable "*"
您可以通过 下载ZIP格式的源代码 来手动安装 yii2-taggable。
设置
假设我们有一个可以标记的类(ActiveRecord)Article
,它是一个文章类,还有一个类 Tag
用于存储标签。
标签至少有以下属性
id
: 主键;name
: 存储实际的标签关键词;
连接表
Article
和 Tag
通过一个连接表以多对多关系相连。让我们称这个表为 article_tag
。它有以下字段
model_id
: 存储一个Article
的主键值;tag_id
: 存储一个Tag
的主键值;ord
: 存储一个Tag
的排序顺序。
连接表不需要有主键。在 model_id
和 tag_id
上设置索引是个好主意。
TaggableBehavior
类 Article
是 可标记的,应该这样设置
<?php
namespace app\models;
use sjaakp\taggable\TaggableBehavior;
class Article extends ActiveRecord {
public function behaviors()
{
return [
'taggable' => [
'class' => TaggableBehavior::class,
'junctionTable' => 'article_tag',
'tagClass' => Tag::class,
]
];
}
// ...
}
TagBehavior
类 Tag
表现得像 标签,看起来像这样
<?php
namespace app\models;
use sjaakp\taggable\TagBehavior;
class Tag extends ActiveRecord {
public function behaviors()
{
return [
'tag' => [
'class' => TagBehavior::class,
'junctionTable' => 'article_tag',
'modelClass' => Article::class,
]
];
}
// ...
}
附加 TagBehavior 后,类 Tag
增加了一些新的属性和方法。可以通过以下方式获得标签视图的链接
$link = $tag->link;
models
获取所有被 $tag
标记的文章
$taggedArticles = $tag->models;
如果您想使用 ActiveDataProvider 来访问它们,请使用
$providerOfTaggedArticles = $tag->getModels();
标记文章的数量
$countTaggedArticles = $tag->modelCount;
文章视图
在 Article
视图中,我们现在可以这样显示标签
<?php
// ...
/**
* @var yii\web\View $this
* @var ap\models\Article $model
*/
?>
<!-- Display article title and body here. -->
<h4>Tags</h4>
<p><?= $model->tagLinks ?></p>
tagLinks
是一个新虚拟属性,由 TaggableBehavior 添加到 Article
。
可以通过以下方式检索所有 Tag
$allTags = $article->tagModels;
要获取一个 ActiveQuery
,例如用于一个 ActiveDataProvider
,请使用以下方法:
$provider = new ActiveDataProvider([
'query' => $article->getTagModels()
]);
如果您想知道一个 Article
是否有一个具有特定名称的 Tag
,比如 'politics',您可以这样查询类:
if ($article->hasTag('politics')) {
// ...
}
文章更新
为了让创建和更新 Tag
更加容易,我们还需要设置 TagController
<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\Tag;
use sjaakp\taggable\TagSuggestAction;
class TagController extends Controller {
public function actions() {
return [
'suggest' => [
'class' => TagSuggestAction::class,
'tagClass' => Tag::class,
],
];
}
// ...
}
标签编辑器
在 Article
的更新和创建视图中,我们现在可以使用 TagEditor 小部件。将以下内容添加到 views\article\_form.php
:
<?php
use yii\helpers\Url;
use sjaakp\taggable\TagEditor;
/**
* @var yii\web\View $this
* @var app\models\Article $model
* @var yii\widgets\ActiveForm $form
*/
?>
...
<?= $form->field($model, 'tags')->widget(TagEditor::class, [
'clientOptions' => [
'autocomplete' => [
'source' => Url::toRoute(['tag/suggest'])
],
]
]) ?>
...
tags
是 Article
的新虚拟属性,由 TaggableBehavior 添加。'tag/suggest' 是指向 TagController
中之前定义的 suggest
动作的路线的基础。从 Pixabay 了解更多关于 clientOptions
的信息。
修改
yii2-taggable 的基本设置可以通过多种方式进行修改。请参阅源文件以了解其他可用选项。以下是一些选项:
- nameAttribute:标签类的名称属性。在 TagBehavior、TaggableBehavior 和 TagSuggestAction 中定义。默认:
'name'
。 - tagKeyColumn 和 modelKeyColumn:连接表的外键字段。在 TagBehavior 和 TaggableBehavior 中定义。默认分别为:
'tag_id'
和'model_id'
。 - orderColumn:在连接表中保存排序信息。在 TaggableBehavior 中定义。
- renderLink:可调用的,
function($tag, $options)
,返回单个标签链接的 HTML 代码。由 TagBehavior 定义。如果没有设置(默认),TagBehaviour 将标签链接渲染为简单的 HTML a。