Поиск…


замечания

В Magento имеется шесть различных типов продуктов.

  • просто

Единый складской агрегат

  • конфигурируемый

Первый из составных продуктов. Позвольте клиентам настроить свой продукт и добавить в корзину один простой продукт.

  • Сгруппированные

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

  • сверток

Третий тип составного продукта, комплект связывает простые продукты вместе для покупки как одного элемента.

  • виртуальный

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

  • Загружаемые

Цифровой, а не физический продукт. Большинство типов продуктов реализованы как часть модуля Mage_Catalog, кроме Mage_Bundle и Mage_Downloadable.

Сгруппированные, Bundle и Configurable продукты реализуют отношения родитель-потомок, когда ряд других (по умолчанию, простых, виртуальных или загружаемых) продуктов привязывается к основному продукту. Затем обрабатываются данные продукта для всей коллекции (например, группа, комплект или конфигурируемое имя продукта, цена и статус).

У загружаемых и Bundle продуктов есть дополнительные таблицы в базе данных, между тем остальные доступны среди всех других типов продуктов. Настраиваемые продукты имеют дополнительную таблицу для ссылки на дочерние продукты, catalog_product_super_link.

Пользовательский тип продукта

Чтобы создать тип продукта, который расширяет один из встроенных типов продуктов, следует расширить модель соответствующего типа продукта. В противном случае новый тип продукта должен расширить класс Mage_Catalog_Model_Product_Type_Abstract.

Также требуется запись в файле config.xml модуля:

Для более сложных продуктов могут потребоваться другие настраиваемые области, такие как модель цены и индексный ресивер данных.

Расчет цены

При работе с одним продуктом цена всегда рассчитывается «на лету». Атрибут цены EAV загружается продуктом, а конечная цена рассчитывается по ценовой модели, 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, которые используют блоки фильтров для отдельных фильтров.

Слоистая навигация использует индексную таблицу для большинства фильтров, например, цена, индекс атрибута продукта, индекс десятичного продукта.

категории

Категории в базе данных

Управление иерархией категорий осуществляется путем хранения родительского идентификатора категории. Полная иерархия показана в столбце пути (идентификаторы с разделением слэш). Существует специальная категория с parent_id из 0. Это истинная корневая категория, и каждая из других корневых категорий, как определено в Magento, использует это как общий родитель.

Для чтения и управления деревом категорий из базы данных используются два разных класса, в зависимости от того, включен ли стандартный каталог, Mage_Catalog_Model_Resource_Category_Tree и Mage_Catalog_Model_Resource_Category_Flat.

Преимущество плоских категорий заключается в том, что он быстрее запрашивает. Тем не менее, он должен быть перестроен из таблиц EAV каждый раз, когда происходит изменение.

getChildren()

возвращает целую строку с идентификаторами мгновенных детей

getAllChildren()

возвращает строку или массив всех дочерних идентификаторов

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>

Mage_Catalog_Model_Product_Type

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Product type model
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @author      Magento Core Team 
 */
class Mage_Catalog_Model_Product_Type
{
    /**
     * Available product types
     */
    const TYPE_SIMPLE       = 'simple';
    const TYPE_BUNDLE       = 'bundle';
    const TYPE_CONFIGURABLE = 'configurable';
    const TYPE_GROUPED      = 'grouped';
    const TYPE_VIRTUAL      = 'virtual';

    const DEFAULT_TYPE      = 'simple';
    const DEFAULT_TYPE_MODEL    = 'catalog/product_type_simple';
    const DEFAULT_PRICE_MODEL   = 'catalog/product_type_price';

    static protected $_types;
    static protected $_compositeTypes;
    static protected $_priceModels;
    static protected $_typesPriority;

    /**
     * Product type instance factory
     *
     * @param   Mage_Catalog_Model_Product $product
     * @param   bool $singleton
     * @return  Mage_Catalog_Model_Product_Type_Abstract
     */
    public static function factory($product, $singleton = false)
    {
        $types = self::getTypes();
        $typeId = $product->getTypeId();

        if (!empty($types[$typeId]['model'])) {
            $typeModelName = $types[$typeId]['model'];
        } else {
            $typeModelName = self::DEFAULT_TYPE_MODEL;
            $typeId = self::DEFAULT_TYPE;
        }

        if ($singleton === true) {
            $typeModel = Mage::getSingleton($typeModelName);
        }
        else {
            $typeModel = Mage::getModel($typeModelName);
            $typeModel->setProduct($product);
        }
        $typeModel->setConfig($types[$typeId]);
        return $typeModel;
    }

    /**
     * Product type price model factory
     *
     * @param   string $productType
     * @return  Mage_Catalog_Model_Product_Type_Price
     */
    public static function priceFactory($productType)
    {
        if (isset(self::$_priceModels[$productType])) {
            return self::$_priceModels[$productType];
        }

        $types = self::getTypes();

        if (!empty($types[$productType]['price_model'])) {
            $priceModelName = $types[$productType]['price_model'];
        } else {
            $priceModelName = self::DEFAULT_PRICE_MODEL;
        }

        self::$_priceModels[$productType] = Mage::getModel($priceModelName);
        return self::$_priceModels[$productType];
    }

    static public function getOptionArray()
    {
        $options = array();
        foreach(self::getTypes() as $typeId=>$type) {
            $options[$typeId] = Mage::helper('catalog')->__($type['label']);
        }

        return $options;
    }

    static public function getAllOption()
    {
        $options = self::getOptionArray();
        array_unshift($options, array('value'=>'', 'label'=>''));
        return $options;
    }

    static public function getAllOptions()
    {
        $res = array();
        $res[] = array('value'=>'', 'label'=>'');
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptions()
    {
        $res = array();
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptionText($optionId)
    {
        $options = self::getOptionArray();
        return isset($options[$optionId]) ? $options[$optionId] : null;
    }

    static public function getTypes()
    {
        if (is_null(self::$_types)) {
            $productTypes = Mage::getConfig()->getNode('global/catalog/product/type')->asArray();
            foreach ($productTypes as $productKey => $productConfig) {
                $moduleName = 'catalog';
                if (isset($productConfig['@']['module'])) {
                    $moduleName = $productConfig['@']['module'];
                }
                $translatedLabel = Mage::helper($moduleName)->__($productConfig['label']);
                $productTypes[$productKey]['label'] = $translatedLabel;
            }
            self::$_types = $productTypes;
        }

        return self::$_types;
    }

    /**
     * Return composite product type Ids
     *
     * @return array
     */
    static public function getCompositeTypes()
    {
        if (is_null(self::$_compositeTypes)) {
            self::$_compositeTypes = array();
            $types = self::getTypes();
            foreach ($types as $typeId=>$typeInfo) {
                if (array_key_exists('composite', $typeInfo) && $typeInfo['composite']) {
                    self::$_compositeTypes[] = $typeId;
                }
            }
        }
        return self::$_compositeTypes;
    }

    /**
     * Return product types by type indexing priority
     *
     * @return array
     */
    public static function getTypesByPriority()
    {
        if (is_null(self::$_typesPriority)) {
            self::$_typesPriority = array();
            $a = array();
            $b = array();

            $types = self::getTypes();
            foreach ($types as $typeId => $typeInfo) {
                $priority = isset($typeInfo['index_priority']) ? abs(intval($typeInfo['index_priority'])) : 0;
                if (!empty($typeInfo['composite'])) {
                    $b[$typeId] = $priority;
                } else {
                    $a[$typeId] = $priority;
                }
            }

            asort($a, SORT_NUMERIC);
            asort($b, SORT_NUMERIC);

            foreach (array_keys($a) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
            foreach (array_keys($b) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
        }
        return self::$_typesPriority;
    }
}

Опишите стандартные типы продуктов (простые, настраиваемые, в комплекте)

просто

Для этого должен использоваться тип Simple Products, который обычно имеет одну конфигурацию (одноразмерное для всех). Это может включать такие элементы, как:

  • Коробка мелки, малая (24 цвета)
  • Коробка мелок, большая (64 цвета)
  • Компьютерный монитор SuperHighTech 26 "HD
  • Показатель Барака Обамы (6 ")

Сгруппированные

Сгруппированные продукты позволяют создавать новый продукт с использованием одного или нескольких существующих продуктов в вашем магазине. Например, предположим, что у вас есть «Барака Обамы» и «Рисунок действия Джорджа Буша» уже в вашем магазине, и вы хотели продать их в виде пакета. Вы просто создадите новый Grouped Product (назовем его «Obama + Bush (Get Both and Spend Twice as Much!)», Затем добавьте обе цифры действий в группу через вкладку «Ассоциированные продукты».

Примечание. К сожалению, вы не можете установить специальную цену «группы» непосредственно со страницы продукта. Чтобы предлагать скидку на покупку предметов вместе, вам нужно будет создать новое правило цены корзины.

конфигурируемый

Настраиваемый продукт: этот продукт позволяет вашим клиентам выбирать желаемый вариант, выбирая варианты. Например, вы можете продавать футболки двух цветов и трех размеров. Вы создадите шесть простых продуктов в виде отдельных продуктов (каждый со своими собственными SKU), а затем добавьте эти шесть в настраиваемый продукт, где клиенты могут выбрать размер и цвет, а затем добавить его в свою корзину. Очень похожая функциональность возможна с помощью пользовательских опций для простых продуктов. Разница между настраиваемым продуктом и продуктом, включая настраиваемые параметры, заключается в том, что инвентарь не проверяется или не обновляется для отдельных опций при покупке пользовательских опций.

виртуальный

Виртуальные продукты - это те, у которых нет физического или цифрового аналога. Они не отправляются, и у них нет ссылки для скачивания. Этот тип продукта может использоваться для таких услуг, как:

  • Уборка дома
  • Подписка на 1 год

Примечание. При использовании виртуальных продуктов для «подписки» важно отметить, что нет встроенного способа автоматического обновления подписки. Все покупки в Magento, независимо от типа продукта, являются разовыми покупками.

сверток

Этот тип продукта также известен как «комплект» в другом программном обеспечении для электронной коммерции. Этот тип продукта идеально подходит для ситуаций, когда пользователю необходимо выбрать несколько настраиваемых параметров, но по крайней мере один вариант. Это может включать в себя такие продукты, как:

  • Настраиваемые компьютерные системы
  • Настраиваемые смокинги / костюмы
  • Нажмите здесь, чтобы получить видео-учебник по использованию пакетов

Загружаемые

Загружаемые продукты похожи на виртуальные продукты, за исключением того, что они включают возможность добавления одного или нескольких цифровых файлов для загрузки. Файлы можно либо загружать через интерфейс администратора, либо загружать непосредственно на сервер по FTP, а затем добавлять по URL-адресу. Когда клиент покупает загружаемый продукт, Magento будет генерировать безопасную, зашифрованную ссылку (чтобы клиенты не могли видеть реальное местоположение файла) для этого клиента, чтобы загрузить их файл.

Эта категория может включать такие продукты, как:

  • Музыка / МР3
  • Программное обеспечение

Примечание . Если у вас включен SSL для вашего сайта, загрузка может завершиться неудачно во всех версиях IE, поскольку IE содержит ошибку, которая запрещает загрузку через безопасные соединения, если установлен заголовок без кэша. Это можно легко зафиксировать в файле htaccess, удалив заголовки no-cache и no-store или принудительно отключив ссылки для загрузки.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow