了解产品类型

Magento 内置了六种不同的产品类型。

  • 简单

单个库存单位

  • 配置

首先是复合产品。允许客户配置他们的产品并将一个简单的产品添加到购物篮中。

  • 分组

第二个复合产品,分组产品涉及简单的产品,并为客户提供选择每个项目的数量的能力。

第三种复合产品类型,绑定将简单产品一起作为单个项目购买。

  • 虚拟

交付不需要实际物品,例如服务

  • 下载

数字而非物理产品。除 Mage_Bundle 和 Mage_Downloadable 外,大多数产品类型都是作为 Mage_Catalog 模块的一部分实现的。

Grouped,Bundle 和 Configurable 产品实现父子关系,其中许多其他(默认情况下,简单,虚拟或可下载)产品被分配给主产品。然后,它处理整个集合的产品数据(例如,组,绑定或可配置的产品名称,价格和状态)。

可下载和绑定产品在数据库中有额外的表,其余的在所有其他产品类型中共享。可配置产品有一个额外的表链接到子产品 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 块呈现,这些块使用过滤器块用于各个过滤器。

分层导航使用索引表来处理大多数过滤器,例如价格,产品属性索引,十进制产品索引。

分类

数据库中的类别

通过存储类别的父 ID 来管理类别层次结构。完整层次结构显示在路径列中(斜杠分隔的 ID)。有一个 parent_id 为 0 的特殊类别。这是真正的根类别,Magento 中定义的每个其他根类别都将其用作共享父类。

要从数据库中读取和管理类别树,将使用两个不同的类,具体取决于是否启用了平面目录,Mage_Catalog_Model_Resource_Category_Tree 和 Mage_Catalog_Model_Resource_Category_Flat。

扁平类别的优点是查询速度更快。但是,每次发生变化时,都需要从 EAV 表重建。

getChildren()

返回逗号分隔的直接子 ID 字符串

getAllChildren()

返回所有子 ID 的字符串或数组

getChildrenCategories()

返回直接子类别的集合 NB 如果启用了平面目录,则返回的唯一子类别将是 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>