Skip to content

Mirocow/yii2-eav

This branch is 250 commits ahead of, 1 commit behind metalagman/yii2-eav:master.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

9cd752d · Mar 1, 2020
Mar 1, 2020
Jul 8, 2016
Jun 1, 2014
Jan 16, 2018
Mar 23, 2019
Dec 28, 2016

Repository files navigation

EAV Dynamic Attributes for Yii2

Архитектура баз данных EAV(Enity-Attribute-Value, Сущность-Атрибут-Значение)

Latest Stable Version Latest Unstable Version Total Downloads License Join the chat at https://gitter.im/Mirocow/yii2-eav

Screenshots

Edit attributes

List of attributes

Edit attribute

Edit form

Install

Add github repository

"repositories": [
  {
    "type": "git",
    "url": "https://github.com/mirocow/yii2-eav.git"
  }
]

and then

php composer.phar require --prefer-dist "mirocow/yii2-eav" "*"

Configure

php ./yii migrate/up -p=@mirocow/eav/migrations

or

php ./yii migrate/up -p=@vendor/mirocow/yii2-eav/src/migrations

and then add messages settings

    'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app'       => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
            'eav' => [
                'class' => 'yii\i18n\PhpMessageSource',
                'basePath' => '@mirocow/eav/messages',
            ],
        ],
    ]

Use

Model

Simple

class Product extends \yii\db\ActiveRecord
{
    public function rules()
    {
        return [
            [['name'], 'string', 'max' => 255], // Product field
            [['c1'], 'required'], // Attribute field
            [['c1'], 'string', 'max' => 255], // Attribute field
        ];
    }
    
    public function behaviors()
    {
        return [
            'eav' => [
                'class' => \mirocow\eav\EavBehavior::className(),
                // это модель для таблицы object_attribute_value
                'valueClass' => \mirocow\eav\models\EavAttributeValue::className(),
            ]
        ];
    }
    
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getEavAttributes()
    {
        return \mirocow\eav\models\EavAttribute::find()
            ->joinWith('entity')
            ->where([
                'categoryId' => $this->categories[0]->id,
                'entityModel' => $this::className()
        ]);
    }
}

Advanced

class Product extends \yii\db\ActiveRecord
{
  
    public function rules()
    {
        return [
            [['name'], 'string', 'max' => 255], // Product field
            [['c1'], 'required'], // Attribute field
            [['c1'], 'string', 'max' => 255], // Attribute field
        ];
    }
    
    public function behaviors()
    {
        return [
            'eav' => [
                'class' => \mirocow\eav\EavBehavior::className(),
                // это модель для таблицы object_attribute_value
                'valueClass' => \mirocow\eav\models\EavAttributeValue::className(),
            ]
        ];
    }
    
    /**
     * @return \yii\db\ActiveQuery
     */
    public function getEavAttributes($attributes = [])
    {
        return \mirocow\eav\models\EavAttribute::find()
            ->joinWith('entity')
            ->where([
                //'categoryId' => $this->categories[0]->id,
                'entityModel' => $this::className()
            ])
        ->orderBy(['order' => SORT_ASC]);
    }
}

View

Insert this code for create widget or load all EAV inputs fields for model

Form edit

fo load selected field

<?=$form->field($model,'test5', ['class' => '\mirocow\eav\widgets\ActiveField'])->eavInput(); ?>

or for load all fields

Simple

<?php
foreach($model->getEavAttributes()->all() as $attr) {
    echo $form->field($model, $attr->name, ['class' => '\mirocow\eav\widgets\ActiveField'])->eavInput();
}
?>

or add sorted

<?php
foreach($model->getEavAttributes()->orderBy(['order' => SORT_ASC])->all() as $attr) {
    echo $form->field($model, $attr->name, ['class' => '\mirocow\eav\widgets\ActiveField'])->eavInput();
}
?>

Advanced

<?php
foreach($model->getEavAttributes(['entityId' => 8, 'typeId' => 3])->all() as $attr) {
    echo $form->field($model, $attr->name, ['class' => '\mirocow\eav\widgets\ActiveField'])->eavInput();
}
?>

Partial template

<p>
Encode

<?php
    foreach($model->getEavAttributes()->all() as $attr) {
        print_r($model[$attr->name]['value']);
    }
?>
</p>

<p>
String

<?php
    foreach($model->getEavAttributes()->all() as $attr){
        echo $model[$attr->name];
    }
?>

Add attribute

$attr = new mirocow\eav\models\EavAttribute();
$attr->attributes = [
    'entityId' => 1,                        // Category ID
    'typeId' => 1,                          // ID type from eav_attribute_type
    'name' => 'packing',                    // service name field
    'label' => 'Packing',                   // label text for form
    'defaultValue' => '10 kg',              // default value
    'entityModel' => Product::className(),  // work model
    'required' => false                     // add rule "required field"
];
$attr->save();

$attr->attributes = [
    'entityId' => 1,                        // Category ID
    'typeId' => 1,                          // ID type from eav_attribute_type
    'name' => 'color',                      // service name field
    'label' => 'Color',                     // label text for form
    'defaultValue' => 'white',              // default value
    'entityModel' => Product::className(),  // work model
    'required' => false                     // add rule "required field"
];
$attr->save();

Add/Update values

$model = Product::find()->where(['id' => 1])->one();
$model->color = "blue";
$model->packing = "12 kg";
$model->save();

Administrate GUI

Config module EAV for managment of fields

In main config file:

$modules = [
        ...,
        'eav' => [
            'class' => 'mirocow\eav\Module',
        ],
];

Form

Add / Edit attribute

<?= \mirocow\eav\admin\widgets\Fields::widget([
    'model' => $model,
    'categoryId' => $model->id,
    'entityName' => 'Продукт',
    'entityModel' => 'app\models\Product',
])?>

Packages

No packages published

Languages

  • JavaScript 75.6%
  • PHP 18.6%
  • CSS 5.8%