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

Catalog – доля в экзамене: 10%.

 

Товары

Есть 6 различных типов товаров, которые поддерживаются в дефолтной установке Magento:

  • Простой (simple): Простая единица физического товара
  • Настраиваемый (configurable): Первый тип композиционных товаров. Позволяет клиентам настроить свой товар и добавить один простой товар в корзину
  • Сгруппированный (grouped): Второй тип композиционных товаров – сгруппированный товар, который состоит из простых товаров и предоставляет клиентам возможность выбрать необходимое количество каждого товара
  • Привязанный (bundle): Третий тип композитного товара – это совокупность простых товаров для покупки в едином товаре
  • Виртуальный (virtual): Поддержка нефизических товаров (которые нельзя доставить физически), например, таких как услуги
  • Загружаемый (downloadable): цифровой, а не физический товар (например, компьютерная игра, музыкальный файл и т.п.).

Большинство типов товаров реализуются как часть модуля 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

 

Tolyanich

Recent Posts

Эрих Мария Ремарк

Извинение — не означает, что ты не прав, а другой человек прав. Это всего лишь…

6 дней ago

Джим Керри

Тот, кто умеет улыбаться каждый день, умеет жить Джим Керри  

2 недели ago

Хань Сян-цзы

Помогая ленивым людям, ты помогаешь им сесть на свою шею Хань Сян-цзы  

2 недели ago

Как работает электронная книга

Атмосферу бумажной книги, запах свежих чернил и чуть залежавшейся бумаги сложно заменить гаджетами. Но электронные…

2 недели ago

Робин Шарма

Действуй так, словно неудача просто невозможна, а успех обеспечен Робин Шарма  

3 недели ago

Уроки SQL — как найти повторяющиеся записи (дубли) в базе данных

Во-первых, чтобы не допустить подобных ситуаций, вам заранее нужно присваивать уникальные значения в таблицах. Так…

4 недели ago