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
Выбор мастера для ремонта и перетяжки мебели — задача, которая требует вдумчивого подхода. Ведь от…
Выбор идеального хостинга под свой сайт может быть довольно запутанным делом, особенно когда существует так…
Чтобы избегать ошибок, нужно набираться опыта; чтобы набираться опыта, надо делать ошибки Лоуренс Питер
Краткое определение Черного SEO Черное СЕО (или Черная оптимизация) — это любая практика, целью которой…
Получение водительских прав категории C открывает двери к профессиональной деятельности, связанной с управлением грузовыми автомобилями.…