瞭解產品型別
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>