ZenCart類庫-shipping.php解讀實現原理

本篇文章解讀 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 zone

enabled--該模塊是否被啓用

_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


 

發佈了103 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章