lav45/yii2-target-behavior

此扩展允许您在多个对象之间建立链接。

安装次数: 2,247

依赖项: 0

建议者: 0

安全: 0

星级: 2

关注者: 3

分支: 4

类型:yii2-extension

1.3.1 2020-12-21 14:52 UTC

This package is auto-updated.

Last update: 2024-09-23 14:44:17 UTC


README

Yii2 Latest Stable Version License Total Downloads Build Status

此扩展提供通过关系链接两个元素的行为函数。

安装

安装此扩展的首选方式是通过 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 许可证。请参阅 许可文件 获取更多信息。