瞭解產品型別

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>