magento
EAV (wartość atrybutu podmiotu)
Szukaj…
Uwagi
Jednostka
Przechowuje informacje o rodzaju przechowywanych danych. W przypadku Magento jest to klient, produkt, kategoria itp.
Atrybut
Indywidualne właściwości każdego z podmiotów, np. Imię, waga, adres e-mail itp.
Wartość
Wartość danego bytu i atrybutu. Na przykład możemy określić podmiot klienta i atrybut e-mail, a następnie nadać mu wartość [email protected].
Schemat bazy danych
eav_entity
Tabela encji.
eav_entity_attribute
Tabela atrybutów
eav_entity_ {type}
Tabele wartości. Typy to data-godzina, dziesiętne, int, tekst i varchar.
Należy zauważyć, że tabela eav_entity_varchar ma typ varchar dla wartości, nawet jeśli data lub liczba całkowita lepiej pasowałyby do wartości.
Modele a modele zasobów
Wszystkie modele w Mage / Eav / Model / Resource to Mysql4 i modele zasobów.
Ponadto Entity / Abstract.php i Entity / Setup.php.
Płaski kontra EAV
Modele EAV są bardziej złożone, zapewniając logikę zapisywania i ładowania z wielu tabel, podczas gdy modele płaskie lub standardowe są stosunkowo proste (tradycyjne).
Standardowe modele zarządzają głównie swoimi właściwościami za pomocą zestawów danych i modułów pobierających dane pracujących z jedną tabelą. Modele EAV zarządzają głównie swoimi modelami atrybutów. Standardowe modele zapisują tylko swoje dane w tabeli i ładują z niej. Modele EAV ładują wszystkie (lub określony zestaw) atrybuty po załadowaniu danych podstawowych i zapisują atrybuty po zapisaniu danych (w tym wstawianie, aktualizowanie i usuwanie atrybutów).
Przykłady modeli zasobów EAV
Aby znaleźć jednostki korzystające ze schematu pamięci EAV, można wyszukać ciąg znaków Mage_Eav_Model_Entity_Abstract. Powinno to ujawnić wszystkie modele zasobów oparte na strukturze EAV. Jednak wynikowa lista będzie zawierać wiele przestarzałych klas z modułu Mage_Sales, które nie są już używane.
Jedynymi modułami zawierającymi podmioty korzystające ze schematu pamięci EAV są Mage_Catalog (kategorie i produkty) oraz Mage_Customer (klienci i adresy).
Grupy klientów używają płaskiego schematu przechowywania tabeli. Wszystkie jednostki sprzedaży zostały przekształcone w jednostki z płaskim stołem wraz z wydaniem Magento 1.4.
Powodem użycia EAV jest to, że podmioty mogą mieć nieokreśloną liczbę właściwości, a zatem pozostać elastyczne. Na przykład po dodaniu nowego atrybutu do jednostki klienta (która jest jednostką EAV) tabela bazy danych nie musi być zmieniana w celu dodania tego nowego atrybutu.
Zalety
Schemat bazy danych elastyczności nie musi się zmieniać wraz z modelem Szybki do wdrożenia
Niedogodności
- Nieskuteczny
Zapytanie zwracające 20 kolumn normalnie składałoby się z 20 samodzielnych połączeń w EAV. Jednak moduł Mage_Eav zasadniczo nie używa połączeń do ładowania danych wartości atrybutu. Zamiast tego stosowane są selekcje unii. Połączenia są używane tylko do filtrowania kolekcji EAV.
- Brak mechanizmu relacji między podtypami
- Brak grupowania podtypów encji
Zakresy witryn i sklepów
Aby obsługiwać wartości atrybutów zakresu witryny i sklepu w EAV, w encji katalogu istnieje wartość store_id, która pokazuje zakres, który prowadzi z powrotem do core_store. Oprócz zwykłych sklepów (widoki sklepu) istnieje również sklep „0”, który jest wartością globalną. W konkretnym sklepie system najpierw sprawdzi wartość jednostki w bieżącym sklepie, a następnie wróci do jednostki globalnej. Jednostki EAV Mage_Customer nie mają kolumny zakresu store_id.
Wstaw, zaktualizuj i usuń
Aby ustalić, czy należy wstawić, zaktualizować lub usunąć atrybut, wykonuje się porównanie z oryginalnym obiektem. Oryginalny obiekt jest w zasadzie duplikatem obiektu danych, gdy jednostka została pobrana z bazy danych.
- Jeśli atrybut istnieje pierwotnie, a jego nowa wartość nie jest pusta; aktualizuje się.
- Jeśli atrybut istnieje pierwotnie, ale jego nowa wartość jest ustawiona na pustą; usuwa. - Jeśli atrybut nie istnieje pierwotnie, a jego nowa wartość nie jest pusta; wstawia.
Zarządzanie atrybutami
Modele atrybutów
Model atrybutu Reprezentuje atrybut w formie bazy danych, jego logika jest standardowa dla wszystkich atrybutów i jest trudna do zmiany .
Model frontendu
Interfejs atrybutu do interfejsu użytkownika i zapewnia dowolną logikę wymaganą przez interfejs, np. Metodę getUrl () na obrazach.
Model zaplecza
Wykonują one weryfikację atrybutu przed zapisaniem go w bazie danych. Na przykład model zaplecza hasła przekształca hasło w skrót przed zapisaniem. Sprawdza również, czy hasło i potwierdzenie hasła są zgodne przed zapisaniem.
Modele źródłowe
Służy do wypełniania opcji dostępnych dla atrybutu, np. Katalog / status_produktu został włączony i wyłączony.
Wymagane metody
Model źródłowy wymaga:
<?php
public function getAllOptions();
public function getOptionText($value);
?>
Zwykle jednak należy zaimplementować tylko getAllOptions (), ponieważ implementacja getOptionText () już istnieje w abstrakcyjnym modelu źródłowym Mage_Eav_Model_Entity_Attribute_Source_Abstract.
Model interfejsu użytkownika nie wymaga metody getValue ().
Model zaplecza wymaga:
<?php
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);
?>
Wszystkie te metody są zaimplementowane w abstrakcyjnym modelu zaplecza Mage_Eav_Model_Entity_Attribute_Backend_Abstract. W przypadku niestandardowych modeli zaplecza należy zastąpić tylko metody wymagające dostosowania.
Modele źródeł konfiguracji systemu
Nie można stosować dla atrybutów EAV. Modele źródłowe EAV implementują metodę getAllOptions, a modele źródłowe adminhtml implementują metodę toOptionArray ().
Domyślne modele źródeł konfiguracji systemu można znaleźć w Mage / Adminhtml / Model / System / Config / Source /.
Modele źródeł atrybutów
Celem modeli źródłowych atrybutów jest dostarczenie listy opcji i wartości dla atrybutów select i multiselect. W razie potrzeby dostarczają również informacje o kolumnach do indeksatora płaskiej tabeli katalogu.
Aby uzyskać listę wszystkich opcji dla atrybutu, wykonaj następujące czynności:
<?php
$options = $attribute->getSource()->getAllOptions(false);
// or for admin
$options = $_attribute->getSource()->getAllOptions(true, true);
?>
Domyślne modele atrybutów
Jeśli żadna klasa nie jest określona jako interfejs, backend lub - w przypadku atrybutów select lub multiselect - modele źródłowe, używana jest klasa domyślna.
Domyślny model frontendu atrybutu to Mage_Eav_Model_Entity_Attribute_Frontend_Default.
Domyślny model zaplecza atrybutów zależy od kodu atrybutu i jest określony w metodzie Mage_Eav_Model_Entity_Attribute :: _ getDefaultBackendModel ().
<?php
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();
}
?>
Jeśli metoda dojdzie do ostatniego wiersza, zostanie użyty Mage_Eav_Model_Entity_Attribute_Backend_Default.
Domyślny model źródłowy jest ustawiony w Mage_Eav_Model_Entity_Attribute_Source_Table. Jest to ustawione w modelu atrybutu modułów katalogu. Domyślny model źródła konfiguracji określony w module eav nigdy nie jest używany.
Dodaj atrybut
Aby dodać atrybuty EAV, użyj Mage_Eav_Model_Entity_Setup, rozszerzając klasę konfiguracji.
addAttribute () Tworzy atrybuty, dodaje je do grup i zestawów (w tym domyślne) lub aktualizuje, jeśli już istnieje updateAttribute () Aktualizuje tylko dane atrybutów. Niestandardowe klasy instalacji można wykorzystać do rozszerzenia tych metod, dodania dodatkowych danych lub uproszczenia wymaganych argumentów.
Płaskie stoły
Atrybutami płaskiego katalogu zarządzają indeksatorzy:
Mage_Catalog_Model_Resource_Product_Flat_Indexer :: updateAttribute () Mage_Catalog_Model_Resource_Category_Flat :: synchronize () Atrybuty produktu zostaną dodane do płaskiej tabeli, jeśli są (patrz Mage_Catalog_Model_Resource_Product_Flat_ttndexer): get
Statyczny (typ zaplecza) Filtrowalny Używany na liście produktów Używany do reguł promocji Używany do sortowania według atrybutów systemowych Dla każdego sklepu istnieje inna płaska tabela, z których każda zawiera inną wartość atrybutu encji o zasięgu sklepowym. Wielojęzycznymi wartościami zarządza się poprzez posiadanie różnych sklepów dla każdego języka.
zaimplementuj interfejs modeli frontendowych, źródłowych i backendowych
Interfejs frontendowy
/**
* Entity attribute frontend interface
*
* Frontend is providing the user interface for the attribute
*
*/
interface Mage_Eav_Model_Entity_Attribute_Frontend_Interface
{
}
Interfejs źródłowy
/**
* Entity attribute select source interface
*
* Source is providing the selection options for user interface
*
*/
interface Mage_Eav_Model_Entity_Attribute_Source_Interface
{
/**
* Retrieve All options
*
* @return array
*/
public function getAllOptions();
/**
* Retrieve Option value text
*
* @param string $value
* @return mixed
*/
public function getOptionText($value);
}
Interfejs zaplecza
/**
* Entity attribute backend interface
*
* Backend is responsible for saving the values of the attribute
* and performing pre and post actions
*
*/
interface Mage_Eav_Model_Entity_Attribute_Backend_Interface
{
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);
/**
* Get entity value id
*
* @param Varien_Object $entity
*/
public function getEntityValueId($entity);
/**
* Set entity value id
*
* @param Varien_Object $entity
* @param int $valueId
*/
public function setEntityValueId($entity, $valueId);
}