了解产品类型
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>