lav45 / yii2-target-behavior
此扩展允许您在多个对象之间建立链接。
1.3.1
2020-12-21 14:52 UTC
Requires
- yiisoft/yii2: ~2.0
This package is auto-updated.
Last update: 2024-09-23 14:44:17 UTC
README
此扩展提供通过关系链接两个元素的行为函数。
安装
安装此扩展的首选方式是通过 composer。
运行以下命令之一:
$ composer require lav45/yii2-target-behavior
或者
"lav45/yii2-target-behavior": "^1.3"
将以下内容添加到您的 composer.json
文件的 require
部分中。
配置
首先您需要按照以下方式配置模型:
use lav45\behavior\Target; class Post extends ActiveRecord { public function behaviors() { return [ [ 'class' => Target::className(), 'targetAttribute' => 'tagNames', // 'targetRelation' => 'tags', // 'targetRelationAttribute' => 'name', // 'delimiter' => ',', ], ]; } }
使用方法
首先您需要创建一个 tbl_tag
(您可以选择您想要的名称) 表,其格式如下,并构建相应的 ActiveRecord
类(即 Tag
)
+-----------+
| tbl_tag |
+-----------+
| id |
| name |
+-----------+
之后,如果您希望将标签链接到某个 ActiveRecord
(例如 Tour
),您需要创建将 Tour
模型链接到 Tag
的表
+-------------------+
| tbl_tour_tag_assn |
+-------------------+
| tour_id |
| tag_id |
+-------------------+
接下来,我们需要配置与 Tour
的关系
/** * @return \yii\db\ActiveQuery */ public function getTags() { return $this->hasMany(Tag::className(), ['id' => 'tag_id']) ->viaTable('tbl_tour_tag_assn', ['tour_id' => 'id']); }
需要注意的是,如果您使用不同的名称,行为函数的 $relation
属性也应相应更改。
最后,在 Tour
类中设置行为,以及与之一起工作的属性 + 规则,在这个例子中我们将使用默认的 tagNames
/** * @inheritdoc */ public function rules() { return [ // ... [['tagNames'], 'safe'], // ... ]; } /** * @inheritdoc */ public function behaviors() { return [ // for different configurations, please see the code // we have created tables and relationship in order to // use defaults settings 'class' => Target::className(), 'targetAttribute' => 'tagNames', ]; }
这就完成了,我们现在可以开始使用模型中的标签了。例如,这是在我们的表单中使用它的方式,与我们的 Selectize Widget 一起
// On TagController (example) // actionList to return matched tags public function actionList($query) { // We know we can use ContentNegotiator filter // this way is easier to show you here :) Yii::$app->response->format = Response::FORMAT_JSON; return Tag::find() ->select(['name']) ->where(['like', 'name', $query]) ->asArray() ->limit(10) ->all(); } // On our form <?= $form->field($model, 'tagNames')->widget(SelectizeTextInput::className(), [ // calls an action that returns a JSON object with matched // tags 'loadUrl' => ['tag/list'], 'options' => ['class' => 'form-control'], 'clientOptions' => [ 'plugins' => ['remove_button'], 'valueField' => 'name', 'labelField' => 'name', 'searchField' => ['name'], 'create' => true, ], ])->hint('Use commas to separate tags') ?>
如你所见,tagNames
是一个属性(默认),通过它我们可以访问我们的标签,如果您的属性 tagNames
被定义为字符串或 null,则标签将作为以逗号分隔的名称存储在其中;如果将 tagNames
定义为数组,它将填充相关的标签。
一旦提交包含上述字段的表单,标签将被自动保存并链接到我们的 Tour
模型。
测试
$ composer global require phpunit/phpunit $ composer global require phpunit/dbunit $ export PATH="$PATH:~/.composer/vendor/bin" $ phpunit
许可
BSD 3-Clause 许可证。请参阅 许可文件 获取更多信息。