chemezov/yii2-dynamic-fields

为 Yii2 框架提供与自定义(动态)字段交互的行为

2.0 2022-05-20 17:40 UTC

This package is auto-updated.

Last update: 2024-09-20 22:43:18 UTC


README

为 Yii2 框架提供与自定义(动态)字段交互的行为。

安装

安装此扩展的最佳方式是通过 composer

运行以下命令

php composer.phar require --prefer-dist chemezov/yii2-dynamic-fields "*"

或在您的 composer.json 文件的 require 部分添加以下内容

"chemezov/yii2-dynamic-fields": "*"

应用迁移

yii migrate --migrationPath=@vendor/chemezov/yii2-dynamic-fields/migrations

用法

use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior;

class User extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'dynamicFields' => [
                'class' => DynamicFieldsBehavior::class,
                'fields' => ['my_custom_string_1', 'my_custom_string_2'],
            ],
        ];
    }
        
    public function rules() {
        return [
            [['my_custom_string_1', 'my_custom_string_2'], 'string', 'max' => 255],
        ];
    }
        
    public function attributeLabels()
    {
        return [
            'my_custom_string_1' => 'My string 1',
            'my_custom_string_2' => 'My string 2',
        ];
    }
}

现在您可以使用自定义属性了

$model = new User();
$value = $model->my_custom_string_1; // get value
$model->my_custom_string_1 = 'some value'; // set value
$model->save();

其他类型

如果您想使用字符串以外的其他类型,可以使用 AttributeTypecastBehavior。在 DynamicFieldsBehavior 之后添加 AttributeTypecastBehavior请注意!

use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior;
use yii\behaviors\AttributeTypecastBehavior;

class User extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'dynamicFields' => [
                'class' => DynamicFieldsBehavior::class,
                'fields' => ['my_boolean_attribute'],
            ],
            'typecast' => [
                'class' => AttributeTypecastBehavior::class,
                'attributeTypes' => [
                    'my_boolean_attribute' => AttributeTypecastBehavior::TYPE_BOOLEAN,
                ],
                'typecastAfterFind' => true,
            ],
        ];
    }
        
    public function rules() {
        return [
            [['my_boolean_attribute'], 'default', 'value' => null],
            [['my_boolean_attribute'], 'boolean'],
        ];
    }
        
    public function attributeLabels()
    {
        return [
            'my_boolean_attribute' => 'My boolean attribute',
        ];
    }
}

示例

例如,您有一个用户模型。您想要存储地址和其他值,例如 is_client,但不想扩展您的数据库表。因此,您可以使用此行为。以下是一个用户模型的示例

use chemezov\yii2_dynamic_fields\DynamicFieldsBehavior;
use yii\behaviors\AttributeTypecastBehavior;

/**
 * Class User
 *
 * @property string $address
 * @property boolean $is_client
 */
class User extends \yii\db\ActiveRecord
{
    public function rules()
    {
        return [
        ...
            [$this->getAdditionalFieldsNamesString(), 'string', 'max' => 255],
            [$this->getAdditionalFieldsNamesBoolean(), 'default', 'value' => null],
            [$this->getAdditionalFieldsNamesBoolean(), 'boolean'],
        ];
    }
    
    public function behaviors()
    {
        return [
            'dynamicFields' => [
                'class' => DynamicFieldsBehavior::class,
                'fields' => $this->getAdditionalFieldsNames(),
            ],
            'typecast' => [
                'class' => AttributeTypecastBehavior::class,
                'attributeTypes' => [
                    'is_client' => AttributeTypecastBehavior::TYPE_BOOLEAN,
                ],
                'typecastAfterFind' => true,
            ],
        ];
    }
    
    public function getAdditionalFieldsNamesString()
    {
        return [
            'address',
        ];
    }

    public function getAdditionalFieldsNamesBoolean()
    {
        return [
            'is_client',
        ];
    }

    public function getAdditionalFieldsNames()
    {
        return array_merge($this->getAdditionalFieldsNamesString(), $this->getAdditionalFieldsNamesBoolean());
    }

    public function fields()
    {
        return array_merge(parent::fields(), $this->getAdditionalFieldsNames());
    }
}

JsonDynamicFieldsBehavior 的用法

使用此行为与使用 DynamicFieldsBehavior 类似。此行为将动态字段存储在模型表的不同列中,格式为 json。

您应该在您的模型表中创建一个列,例如 additional_data,类型为 text,并允许 null 值。迁移示例

$this->addColumn('your_table', 'additional_data', $this->text()->null());
use chemezov\yii2_dynamic_fields\JsonDynamicFieldsBehavior;
use yii\behaviors\AttributeTypecastBehavior;

class User extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
        return [
            'dynamicFields' => [
                'class' => JsonDynamicFieldsBehavior::class,
                'fields' => ['my_boolean_attribute'],
            ],
            'typecast' => [
                'class' => AttributeTypecastBehavior::class,
                'attributeTypes' => [
                    'my_boolean_attribute' => AttributeTypecastBehavior::TYPE_BOOLEAN,
                ],
                'typecastAfterFind' => true,
            ],
        ];
    }
        
    public function rules() {
        return [
            [['my_boolean_attribute'], 'default', 'value' => null],
            [['my_boolean_attribute'], 'boolean'],
        ];
    }
        
    public function attributeLabels()
    {
        return [
            'my_boolean_attribute' => 'My boolean attribute',
        ];
    }
}