Контрольные заметки для сертификационного экзамена Мадженто-разработчика – ч.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