yii2-eav EAV Dynamic Attributes for Yii2

EAV Dynamic Attributes for Yii2

See github https://github.com/Mirocow/yii2-eav

========

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

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

Screenshots

  1. Edit attributes
  2. Edit form
  3. Add github repository
  4. Configure
  5. Use
  6. Administrate GUI
  7. Config module EAV for managment of fields
  8. Form
  9. 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',
])?>
1 0
3 followers
0 downloads
Yii Version: 2.0
License: BSD-2-Clause
Category: User Interface
Developed by: Mirocow
Created on: Oct 20, 2015
Last updated: 7 years ago

Related Extensions