EAV – частка в екзамені: 10%.
hello@example.com
.
Схема бази даних
eav_entity
: таблиця сутностейeav_entity_attribute
: таблиця атрибутівeav_entity_{type}
: таблиці значень. Типи – datetime
, decimal
, int
, text
і varchar
Важливо відзначити, що таблиця eav_entity_varchar
має тип varchar
для значень, навіть якщо date
або integer
цілком відповідали б значенню.
Моделі проти Моделей Ресурсів
Всі моделі всередині Mage/Eav/Model/Resource
є Mysql4 і моделями ресурсів.
На додачу і Entity/Abstract.php
та Entity/Setup.php
.
Flat проти EAV
Моделі EAV є більш складними, забезпечуючи логіку для збереження та завантаження з декількох таблиць, тоді як флет або стандартні моделі відносно прямолінійні (традиційні), тобто, працюють з однією таблицею.
Стандартні моделі в основному керують своїми властивостями за допомогою сеттерів і геттерів даних, що працюють з єдиною таблицею. Моделі EAV переважно керують своїми моделями атрибутів. Стандартні моделі лише зберігають свої дані до таблиці та завантажують дані з неї. EAV моделі завантажують всі атрибути (або певні набори) після завантаження базових даних і зберігають атрибути після збереження даних (включаючи вставку, оновлення та видалення атрибутів).
Приклади EAV ресурсів моделей
Для пошуку сутностей, що використовують схему зберігання EAV, може бути використаний пошук рядка, що розширює Mage_Eav_Model_Entity_Abstract
.
Це має виявити всі ресурси моделей на основі структури EAV. Проте, в результуючий списку буде включено багато застарілих класів з модуля Mage_Sales
, які більше не використовуються.
Єдиними модулями, що містять сутності, які використовують схему зберігання EAV, є Mage_Catalog
(категорії та товари) та Mage_Customer
(клієнти та адреси).
Для Групи клієнтів використовується схема зберігання пласких (flat) таблиць. Усі сутності продажів були конвертовані у сутності флет-таблиці починаючи з релізу Magento 1.4.
Причина того, чому використовується EAV, полягає в тому, що сутності можуть мати невизначену кількість властивостей і тому мають залишатися гнучкими. Наприклад, якщо ви додаєте новий атрибут до сутності Клієнта (який є EAV сутністю), таблицю бази даних не потрібно змінювати для цього нового атрибута.
Переваги:
Недоліки:
Mage_Eav
зазвичай не використовує приєднання для завантаження даних значення атрибута. Замість цього використовуються вибірки. Приєднання використовуються лише для фільтрації колекцій EAV.
Для обробки значень атрибутів веб-сайтів та магазину в межах EAV існує значення store_id
у таблицях значень атрибутів сутностей каталогу для показу області, яка в свою чергу посилається на core_store
. Окрім звичайних магазинів (вигляд магазинів) є також магазин “0”, який є глобальним значенням. В певному магазині система спочатку перевірятиме значення атрибута сутності для поточного магазину, а потім повернеться до глобального значення. Значення таблиць сутностей атрибутів EAV для Mage_Customer
не містять стовпчика області scope_id
.
Щоб визначити, чи потрібно виконати вставку, оновлення чи видалення атрибуту, відбувається порівняння з оригінальним об’єктом. Оригінальний об’єкт – це, в основному, дублікат об’єкта даних, коли сутність булі отримана з бази даних.
Моделі атрибутів
getUrl()
для зображень.catalog/product_status
має опції включено (enabled
) та вимкнено (disabled
).
Ресурсна Модель вимагає:
public function getAllOptions(); public function getOptionText($value);
Зазвичай тільки getAllOptions()
потрібно реалізовувати, хоча реалізація getOptionText()
вже присутня в абстрактній моделі ресурсу Mage_Eav_Model_Entity_Attribute_Source_Abstract
.
Модель фронтенду не вимагає методу getValue()
.
Модель бекенду вимагає:
public function getTable(); public function isStatic(); public function getType(); public function getEntityIdField(); public function setValueId($valueId); public function getValueId(); public function afterLoad($object); public function beforeSave($object); public function afterSave($object); public function beforeDelete($object); public function afterDelete($object); public function getEntityValueId($entity); public function setEntityValidId($entity, $valueId);
Всі ці методи реалізовані в абстрактній бекенд-моделі Mage_Eav_Model_Entity_Attribute_Backend_Abstract
. Для користувацьких бекенд-моделей потрібно лише перевизначити методи, що потребує додаткового налаштування.
Системна конфігурація Моделі ресурсу
Не може бути використана для EAV атрибутів. Вихідні моделі EAV реалізують метод getAllOptions
, тоді як ресурс моделі adminhtml реалізують метод toOptionArray()
.
Дефолтну системну конфігурацію ресурсних моделей можна знайти в Mage/Adminhtml/Model/System/Config/Source/
.
Метою ресурсних Моделей атрибутів є постачання списку параметрів та значень для атрибутів типу select
і multiselect
. Вони також надають інформацію стосовно колонок для індексатора флет таблиці каталогу, якщо це потрібно.
Щоб отримати список усіх параметрів атрибута, виконайте наступне:
$options = $attribute->getSource()->getAllOptions(false); // або для адмінки $options = $_attribute->getSource()->getAllOptions(true, true);
Типові моделі атрибута
Якщо не вказано клас ресурсу моделі для фронтенду, бекенду або для атрибутів select
і multiselect
, використовується клас за замовчанням.
Дефолтний клас для фронтенд моделі атрибуту – це Mage_Eav_Model_Entity_Attribute_Frontend_Default
.
Дефолтний клас для бекенд моделі атрибуту залежить від коду атрибута і визначається методом Mage_Eav_Model_Entity_Attribute::_getDefaultBackendModel()
.
protected function _getDefaultBackendModel() { switch ($this->getAttributeCode()) { case 'created_at': return 'eav/entity_attribute_backend_time_created'; case 'updated_at': return 'eav/entity_attribute_backend_time_updated'; case 'store_id': return 'eav/entity_attribute_backend_store'; case 'increment_id': return 'eav/entity_attribute_backend_increment'; } return parent::_getDefaultBackendModel(); }
Якщо метод переходить до останнього рядка, використовується Mage_Eav_Model_Entity_Attribute_Backend_Default
.
Дефолтний ресурс моделі встановлений в Mage_Eav_Model_Entity_Attribute_Source_Table
. Це встановлено в моделі атрибуту модулів каталогу. Типова модель джерела конфігурації, вказана в модулі eav, ніколи не використовується.
Щоб додати EAV атрибути, використовуйте Mage_Eav_Model_Entity_Setup
, розширюючи клас встановлення.
addAttribute()
: створює атрибути, додає його до груп та наборів (у тому числі за замовчуванням) або оновлює, якщо він вже існуєupdateAttribute()
: лише оновлює дані атрибутів
Користувацькі класи встановлення можна використовувати для розширення цих методів, додавання додаткових даних або спрощення необхідних аргументів.
Атрибути флет таблиці каталогу керуються індексаторами:
Mage_Catalog_Model_Resource_Product_Flat_Indexer::updateAttribute()
Mage_Catalog_Model_Resource_Category_Flat::synchronise()
Атрибути товару додаються до флет таблиці, якщо вони (див. Mage_Catalog_Model_Resource_Product_Flat_Indexer::getAttributeCodes()
):
Для кожного магазину є своя флет таблиця, кожна з яких містить інше значення сутності атрибута, що залежить від області магазину. Значення багатомовних сутностей керуються наявністю різних магазинів для кожної мови.
Переклад українською: SebWeo
Алмазна мозаїка вимагає дбайливого поводження як у процесі її створення, так і після завершення роботи.…
Насіння чіа – це маленькі зернятка, які містять у собі велику кількість корисних речовин. Вони…
Ви ніколи не перетнете океан, якщо не наберетеся мужності залишити берег позаду Христофор Колумб
Турбота про ноги – це не лише питання здоров'я, а й основа щоденного комфорту. Адже…