Catalog – доля в экзамене: 10%.
Есть 6 различных типов товаров, которые поддерживаются в дефолтной установке Magento:
Большинство типов товаров реализуются как часть модуля Mage_Catalog
, кроме Mage_Bundle
и Mage_Downloadable
.
Сгруппированный, Привязанный и Настраиваемый товары реализуют отношения между предками и потомками, когда другие товары (по умолчанию, простые, виртуальные или загружаемые) назначаются главному товару. Затем он обрабатывает данные о товарах для всей коллекции (например, для Сгруппированного, Привязанного или Настраиваемого их названия товаров, цены и статус).
Загружаемые и Привязанные товары имеют дополнительные таблицы в базе данных, а остальные распределены между другими типами товаров. Настроенные товары имеют дополнительную таблицу для ссылки на товары потомки, catalog_product_super_link
.
Чтобы создать свой тип товара, который расширяет один из встроенных типов товаров, должна быть расширена соответствующая модель типа товара. В противном случае новый тип товара должен расширить класс Mage_Catalog_Model_Product_Type_Abstract
.
Необходимо также добавить запись в config.xml модуля:
<global> <catalog> <product> <type> <{name}> <label></label> <model></model> <composite></composite> <index_priority></index_priority> </{name}> </type> </product> </catalog> </global>
Более сложные товары могут потребовать других индивидуальных областей, таких как ценовая модель и обработчик индексных данных.
Когда дело относится к одному товару, цена всегда рассчитывается на лету. EAV атрибут price
загружается вместе с товаром, а окончательная цена рассчитывается за ценовой моделью Mage_Catalog_Model_Product_Type_Price
.
Некоторые типы товаров решают это по-разному. В таком случае они расширяют этот класс и реализуют свою собственную логику. Например, Настраиваемый товар перезаписывает getFinalPrice()
и добавляет дополнительную логику. Эту пользовательскую модель можно указать в config.xml с помощью тега <price_model>
.
Коллекции товаров, однако, используют индекс цен для получения предварительно рассчитанных цен, исключающий необходимость рассчитывать их для каждого товара.
Окончательная цена может быть откорректирована обсерверами (наблюдателями события) catalog_product_get_final_price
. По умолчанию только модуль Mage_CatalogRule
следит за этим событием.
Другим способом переписать цену на продукцию есть простое назначение ее для товара. Если цена установлена, товар не будет пересчитывать ее.
Цена на уровне товара отличается от обычной цены (хотя учитывается при расчете цены). Она реализуется на базе перечня групп клиентов и значения минимального количества для каждого уровня. Уровни цен отражаются в таблице, используя шаблон catalog/product/view/tierprices.phtml
.
Специальные параметры товара обрабатываются при вычислении конечной цены. Каждая опция имеет свое собственное определение цены, которое добавляется к конечной цене.
Групповые цены, уровни цен и специальные цены рассматриваются одновременно ($priceModel->getBasePrice()
), и самая маленькая из трех (или четырех, если вы включаете обычную цену) выбирается в качестве базовой цены товара.
Модуль Mage_Tax
использует налоговый класс товара и определяет, учтено/не учтено в цене товара налог, чтобы определить правильную ставку, которую нужно применить.
Для расчета налога на товар используются следующие факторы:
Классы, отвечающие за рендеринг многоуровневой навигации:
Mage_Catalog_Block_Layer_View
: фильтры и параметрыMage_Catalog_Block_Layer_State
: контролирует текущие фильтрыДля внедрения многоуровневой навигации по атрибутам с собственными оригинальными моделями нужно будет перезаписать метод Mage_Catalog_Model_Layer_Filter_Abstract::apply()
, чтобы определить способ фильтрации коллекции товаров.
Многоуровневая навигация рендерится блоками Mage_Catalog_Block_Layer_View
и Mage_Catalog_Block_Layer_State
, которые используют блоки фильтров для отдельных фильтров.
Многоуровневая навигация использует индексные таблицы для большинства фильтров, например, цена, индекс атрибутов товара, индекс decimal товара.
Категории в базе данных
Иерархия категорий руководствуется путем сохранения идентификатора (ID) родительской категории. Полная иерархия отображается в столбце path
(ID, разделенные косой чертой). Существует специальная категория parent_id
с 0
. Это настоящая корневая (root
) категория, а каждая из других корневых категорий, определенных в Magento, использует ее как общую родительскую.
Для чтения и управления деревом категорий из базы данных используются два разных класса в зависимости от того, включен ли плоский каталог (flat catalog), Mage_Catalog_Model_Resource_Category_Tree
и Mage_Catalog_Model_Resource_Category_Flat
.
Преимущество плоских категорий заключается в том, что они быстрее обрабатывают запросы. Однако они должны перестраиваться с EAV таблиц каждый раз, когда происходит изменение.
getChildren()
: возвращает строку с ближайшими потомками, разделенные запятымиgetAllChildren()
: возвращает строку или массив всех идентификаторов (ID) потомковgetChildrenCategories()
: возвращает коллекцию ближайших дочерних категорийВажно. Если включить плоский каталог, то будет возвращены только дочерние категории с настройкой include_in_menu = 1
. В обоих случаях возвращаются только активные категории.
Ценовые правила каталога
Ценовые правила каталога применяют скидки для товаров на основе даты, товара, сайта и группы клиентов.
Когда для товара вызывается getFinalPrice()
, срабатывает событие catalog_product_get_final_price
. Оно наблюдается с помощью Mage_CatalogRule_Model_Observer
, который потом будет искать любое ценовое правило каталога, которое применяется к товару. В случае необходимости, он затем просматривает таблицу цен базы данных и заносит цену обратно в модель товара как Varien поле данных final_price
.
В базе данных таблица catalogrule
описывает правила, их условия и действия. Таблица catalogrule_product
содержит соответствующие товары и некоторую информацию о правилах. Между тем catalogrule_product_price
содержит цену после применения правила.
Таблицы с плоским каталогом руководствуются индексаторами каталогов. При включении автоматического восстановления индексов, индексаторы каталогов перестраиваются каждый раз, когда товар, категория или связанные объекты обновляются. Метод _afterSave()
вызывает процесс индексации. В противном случае они должны быть переиндексированы вручную через панель администратора.
Тип товара влияет на индекс цен и индекс запаса, где товары могут определять свои собственные индексаторы (в config.xml) для обработки своих данных для этих индексов.
Модуль Mage_Index
обеспечивает структуру, с помощью которой могут быть созданы индивидуальные индексы, которые помогут оптимизировать работу сайта. Класс Mage_Index_Model_Indexer_Abstract
должен быть расширен, чтобы создать новый индекс, реализуя методы _registerEvent()
и _processEvent()
. И не забывая зарегистрировать его в config.xml:
<global> <index> <indexer> <{name}>{model}</{name}> </indexer> </index> </global>
Перевод: SebWeo
Извинение — не означает, что ты не прав, а другой человек прав. Это всего лишь…
Атмосферу бумажной книги, запах свежих чернил и чуть залежавшейся бумаги сложно заменить гаджетами. Но электронные…
Действуй так, словно неудача просто невозможна, а успех обеспечен Робин Шарма
Во-первых, чтобы не допустить подобных ситуаций, вам заранее нужно присваивать уникальные значения в таблицах. Так…