Контрольні нотатки для сертифікаційного екзамену Мадженто-розробника – ч.5
EAV – частка в екзамені: 10%.
Основні поняття
- Сутність (Entity): зберігає інформацію про тип даних. У випадку з Magento це клієнт, товар, категорія тощо.
- Атрибут (Attribute): індивідуальні властивості кожної сутності, наприклад, назва, вага, адреса електронної пошти тощо.
- Значення (Value): значення певної сутності та атрибута. Наприклад, ми можемо вказати сутність клієнта та атрибут електронної пошти, а потім надати йому значення
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 сутністю), таблицю бази даних не потрібно змінювати для цього нового атрибута.
Переваги:
- Гнучкість
- Схему бази даних не потрібно змінювати в моделі
- Швидко реалізується
Недоліки:
- Неефективність
- Запит, що повертає 20 стовпців, зазвичай буде складатися з 20 приєднань у EAV. Проте, модуль
Mage_Eav
зазвичай не використовує приєднання для завантаження даних значення атрибута. Замість цього використовуються вибірки. Приєднання використовуються лише для фільтрації колекцій EAV.
- Запит, що повертає 20 стовпців, зазвичай буде складатися з 20 приєднань у EAV. Проте, модуль
- Немає механізму взаємозв’язку між підтипами
- Немає групування субтипів сутностей
Веб-сайт і область Магазинів
Для обробки значень атрибутів веб-сайтів та магазину в межах EAV існує значення store_id
у таблицях значень атрибутів сутностей каталогу для показу області, яка в свою чергу посилається на core_store
. Окрім звичайних магазинів (вигляд магазинів) є також магазин “0”, який є глобальним значенням. В певному магазині система спочатку перевірятиме значення атрибута сутності для поточного магазину, а потім повернеться до глобального значення. Значення таблиць сутностей атрибутів EAV для Mage_Customer
не містять стовпчика області scope_id
.
Вставка, оновлення та видалення
Щоб визначити, чи потрібно виконати вставку, оновлення чи видалення атрибуту, відбувається порівняння з оригінальним об’єктом. Оригінальний об’єкт – це, в основному, дублікат об’єкта даних, коли сутність булі отримана з бази даних.
- Якщо атрибут вже існує, а його нове значення не пусте – відбувається оновлення
- Якщо атрибут вже існує, але його нове значення порожнє – відбувається видалення
- Якщо атрибута не існує, а його нове значення не пусте – відбувається вставка
Керування атрибутами
Моделі атрибутів
- Модель атрибута: представляє атрибут у формі бази даних, його логіка є стандартною для всіх атрибутів і її важко змінити
- Модель Frontend: інтерфейс атрибута для фронтенду, і забезпечує будь-яку логіку, яку вимагає атрибут у фронтенді, наприклад метод
getUrl()
для зображень. - Модель Backend: вона виконує перевірку атрибуту, перш ніж він буде збережений до бази даних. Наприклад, бекенд модель пароля конвертує пароль у хеш, перш ніж він буде збережений. Він також перевіряє відповідність пароля та підтвердження паролю перед збереженням.
- Моделі ресурсів: використовуються для заповнення опцій, доступних для атрибута, наприклад
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