本篇文章解讀 includes/classes/shipping.php shipping類的實現
關於MODULE_SHIPPING_INSTALLED
表示系統中已經安裝的模塊,在後臺配置中描述如下
Installed Modules
List of shipping module filenames separated by a semi-colon. This is automatically updated. No need to edit. (Example: ups.php;flat.php;item.php)請進行必要的更改
已安裝的模塊
裝運模塊文件名列表,以分號分隔。
這會自動更新。 無需編輯。 (例如:ups.php; flat.php; item.php)
關於構造函數的作用
1.加載你安裝的模塊
加載原理就是上面MODULE_SHIPPING_INSTALLED,這個數據庫配置,此配置在隱藏配置組id=6裏面,後臺其實沒有顯示,但是可以通過http://localhost/ZenCart156cDev/sprAy-Dsk-birtH/configuration.php?gID=6 訪問這個配置組
另外此字段的配置是在includes/init_includes/init_db_config_read.php 初始化時加載到系統中的。
分割此字段的值,得到數組
循環數組--得到類名和文件的名字
然後在DIR_WS_MODULES . 'shipping/'目錄下加載
先加載模塊對應的語言文件,然後加載模塊本身
最後註冊到 $GLOBALS變量中去,類名字作爲索引,類實例作爲值
2.加載模塊對應的語言
3.根據模塊屬性,確定模塊是否開啓or關閉
檢查的原理是使用check_enabled函數,該函數的參數類型--使用類實例作爲 輸入參數。其內部使用method_exists方法檢查類實例對象是否有指定的方法,然後調用類實例的方法check_enabled_for_zone或者check_enabled。
至此shipping其實已經實現了,類似的.net反射的特性,也是實現插件機制的原理。
通過shipping可以調用某一個具體實現類,比如flat類中的函數,實現了易於擴展的特性。
按照以下的優先次序返回插件是否啓用
第一:默認$enabled = $class->enabled;默認的,其實就是flat類構造函數執行時初始化的屬性,其內部調用了zen_get_shipping_enabled函數,並對區域做了檢查
第二:$enabled = $class->check_enabled_for_zone();
第三:$enabled = $class->check_enabled();
4.實例化模塊,構造實例對象,並註冊到全局變量【這是最終的目的】
$modules
構造函數中定義了此屬性
這個屬性只是單純的安裝模塊“MODULE_SHIPPING_INSTALLED”分割之後的結果,除此之外再無其他
MODULE_SHIPPING_INSTALLED
在初始化過程中,只是讀取了配置組2和3的配置,MODULE_SHIPPING_INSTALLED在配置組6裏面,那麼它是如何讀取的呢?
此問題已經解答了,從上面看
關於flat類--模塊的屬性
code--模塊的標識代碼,通常就是類名字,和類文件同名,同時在$GLOBALS變量中引用它
title--模塊標題,在語言文件中定義
description--模塊本身描述,在語言文件中定義
sort_order--排序,排序字段是否定義決定了模塊是否啓用,也是非常重要的
icon---圖標
tax_class--使用的稅種
tax_basis--稅種基於什麼計算 一下是說明
On what basis is Shipping Tax calculated. Options are
Shipping - Based on customers Shipping Address
Billing Based on customers Billing address
Store - Based on Store address if Billing/Shipping Zone equals Store zoneenabled--該模塊是否被啓用
_check--屬性用來讀取插件的MODULE_SHIPPING_FLAT_STATUS 狀態值
關於zen_get_shipping_enabled的作用
disable only when entire cart is free shipping
僅當整個購物車免費送貨時禁用
此函數內部註釋先列出來
for admin always true if installed
對於管理員,如果已安裝,則始終爲true
Free Shipping when 0 weight - enable freeshipper - ORDER_WEIGHT_ZERO_STATUS must be on
0重量時免費送貨-啓用freeshipper-訂單重量必須爲0狀態
Free Shipping when 0 weight - disable everyone - ORDER_WEIGHT_ZERO_STATUS must be on
0重量時免費送貨-禁用所有人-訂單重量必須爲0
Always free shipping only true - enable freeshipper
始終免費送貨-啓用freeshipper
Always free shipping only true - disable everyone
始終免費送貨-禁用所有人
Always free shipping only is false - disable freeshipper
總是免費送貨是錯誤的-禁用免費送貨
同時牽連出一下函數
$_SESSION['cart']->in_cart_check('product_is_always_free_shipping','1');
檢查指定字段的產品數
$_SESSION['cart']->count_contents();
統計購物item總數
$_SESSION['cart']->show_weight();
統計購物車總重量
關於quote方法
返回對方法的引用,此方法可以返回所有模塊的引用,也可以單獨返回某一個模塊的引用
內部實現機制是:
首先引用$shipping_weight, $uninsurable_value;$uninsurable_value表示的是運費險,看某一具體的類是否有get_uninsurable_value方法
定義$quotes_array,這是我們最終要返回的數組對象,這個數組對象是隻包含已經啓用的模塊
通過兩個循環,從$this->modules屬性中分析你要的模塊
第一個foreach循環實現了從$GLOBALS檢查,判斷模塊的啓用狀態,只將滿足啓用狀態的模塊存入到$quotes_array
第二個循環,更新狀態;調用某一具體shipping的quote方法,重新賦值計算重量的全局變量
接下來一個問題是:flat的運費是如何被計算出來的呢?
$shipping_weight是在何時定義的?
會話$_SESSION['shipping']是在什麼地方被寫入的?
shipping模塊在實例化的時候,就已經確定並檢查好哪些模塊是可以使用的
關於設想的需求環境
所有訂單免郵費
所有訂單固定一個郵費
所有訂單固定一個郵費,但是對某一個區域單獨啓用
訂單滿多少金額,就免郵費
訂單金額設置區間範圍,在不用的範圍內,運費不一樣
訂單安裝數量免郵費
關於flat類
這是一個提供統一費率的運輸模塊,所有的訂單運費都是一樣的,但是還可以設置在某個地區開啓
關於flat類quote方法
quote中文意思是引用,此方法就是返回對此類的相關信息的引用
存儲在quotes數組內,結構如下
id--模塊的唯一標識符,全局內不要重複
module--模塊的標題,被定義在語言包內
methods--這是一個數組,其中包含了關於運費的計算
tax--稅率
icon--運費圖標
結合分析 flat.php模塊和freeshipper.php模塊,兩者編寫方式高度相同
flat.php----表示所有的訂單採用統一的運費,稅率
freeshipper.php----表示免郵費
flat配置模塊的區域是在什麼地方設置的?暫時未知
zen_cfg_pull_down_zone_classes