EAV Dynamic Attributes for Yii2
See github https://github.com/Mirocow/yii2-eav
========
Архитектура баз данных EAV(Enity-Attribute-Value, Сущность-Атрибут-Значение)
Screenshots ¶
- Edit attributes
 - Edit form
 - Add github repository
 - Configure
 - Use
 - Administrate GUI
 - Config module EAV for managment of fields
 - Form
 - Add / Edit attribute
 
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
				'name' => 'AttrCategory1',  // service name field
				'label' => 'Attr1',         // label text for form
				'defaultValue' => 'attr1',  // default value
				'entityModel' => SampleModel::className(), // work model
				'required'=>false           // add rule "required field"
		];
$attr->save();
Administrate GUI ¶
Config module EAV for managment of fields ¶
In main config file:
`php
$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',
])?>
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.