JavaScript PHP CSS
Clone or download
Pull request Compare This branch is 232 commits ahead, 1 commit behind russianlagman:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
.gitignore
LICENSE
README-ru.md
README.md
composer.json

README.md

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
				];
		}

		/**
		 * create_time, update_time to now()
		 * crate_user_id, update_user_id to current login user id
		 */
		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
				];
		}

		/**
		 * create_time, update_time to now()
		 * crate_user_id, update_user_id to current login user id
		 */
		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',
])?>