簡體   English   中英

修正Virtuemart 1.1.9 for Joomla 1.5.26的Flex2運輸模塊中的錯誤時,PHP范圍問題

[英]PHP scope issue while fixing error in the Flex2 shipping module of Virtuemart 1.1.9 for Joomla 1.5.26

背景

當前的免費Flex2送貨模塊有一個錯誤,該錯誤會導致錯誤計算送貨金額。 該錯誤導致即使在國際運輸中,也將在所有計算中使用DOMESTIC稅率。 另外,我正在嘗試擴展模塊的功能。

在當前形式下,Flex2允許針對國內和國際銷售獨立設置運費。 但是,稅率只能是每個變體的特定值(即,國內稅率為一種,國際稅率為一種)。

我的祖國(加拿大)要求在國內市場上應用不同的稅率,具體取決於我要運送到的省份。 我敢肯定還有其他國家/地區也有類似的要求。 我已經能夠成功更改管理屏幕,以允許設置指示器,該指示器將允許根據VirtueMart TAX_MODE值(根據商店位置,買方位置或歐盟區域選擇不同的稅率)來選擇可變的稅率。 )。

問題-在沒有參數的情況下將信息從“ A”類傳遞到“ B”類

在結帳時出現問題。 VirtueMart的簽出模塊包含在文件ps_checkout.php中。 函數“ calc_order_shipping”以以下代碼段開頭:

function calc_order_shipping( &$d ) {

  $auth = $_SESSION['auth']; $shipping_total = $this->_SHIPPING->get_rate( $d ); $shipping_taxrate = $this->_SHIPPING->get_tax_rate(); 

這是“核心” VirtueMart系統的一部分,因此我不想對其進行修改。

第一個函數調用從數組“ $ d”中提取裝運總計(即,在結帳過程開始時執行的稅收計算的結果)。 第二行用於檢索用於進行此計算的稅率。 所有運輸模塊的當前實現是返回靜態稅率。 如您所見,數組“ $ d”沒有傳遞給第二個函數,因此我沒有足夠的信息來確定客戶是外國的還是國內的(此信息可以從送貨地址信息中得出$ d數組的一部分)。

不幸的是,在我對Flex2可變稅率提出要求之前,每個國內/國際區域僅允許使用一種稅率-這是在配置運輸模塊時手動設置的。 因此,沒有機會“改變”價值。 (過去)可以簡單地從運輸模塊的靜態配置文件中提取事實之后的稅率。 但是,使用我新需要的功能,我需要在結帳時更改稅率(基於購物者可能選擇默認地址以外的收貨地址的可能性)。

“ B級”的詳細信息

這兩個函數都位於類flex2中的相同源代碼文件:flex2.php中。

為了完整起見,這里是這兩個函數的代碼:

function get_rate( &$d ) {

  $shipping_rate_id = $d["shipping_rate_id"]; $is_arr = explode("|", urldecode(urldecode($shipping_rate_id)) ); $order_shipping = (float)$is_arr[3]; return $order_shipping; } function get_tax_rate() { /** Read current Configuration ***/ require_once(CLASSPATH ."shipping/".__CLASS__.".cfg.php"); if( intval(FLEX2_TAX_CLASS)== 0 ) { return( 0 ); } else { require_once( CLASSPATH. "ps_tax.php" ); $tax_rate = ps_tax::get_taxrate_by_id( intval(FLEX2_TAX_CLASS) ); return $tax_rate; } } 

Flex2中的“錯誤”(不是本問題的主題)在於,參數“ FLEX2_TAX_CLASS”僅與國內運輸相關。 國際運輸的相應參數“ FLEX2_TAX_CLASS _I ”未在任何地方引用。 對於我來說,要確定是否使用該變量的國內版本還是國際版本,我必須檢查送貨地址,該地址存儲在$ d數組中。

要克服的挑戰-也就是發布該帖子的原因

所以,這是我的問題...

有什么辦法可以定義相對於該類具有全局作用域的$ d引用? 然后修改“ get_rate”函數,以便將其$ d輸入數組的副本存儲在此類作用域的引用變量中,以便可以在“ get_tax_rate”函數中對其進行引用? 如果可能的話,用於定義類作用域變量,將&$ d的值分配給該變量的正確語法,以及用於從“ get_tax_rate”函數訪問該新創建的變量的正確語法是什么?

and creating a way that will allow function "y" to also retrieve (and update) information from the same array by reference. 之前,我已經研究了有關PHP變量范圍的一些通用問題,並發現了一些似乎很對的答案,但是我很害怕在沒有得到更具體建議的情況下嘗試這些問題,因為我發現的答案沒有解決函數“ x”的特定要求是接收“通過引用”變量,並創建一種方式,以允許函數“ y”也可以通過引用從同一數組中檢索(和更新)信息。

這是我在這個論壇上的第一個問題,我想對我的要求盡可能具體。 感謝您的協助。

PS:解決此問題后,我將把“增強型” Flex2運輸模塊作為非商業附件提交給Joomla / Virtuemart社區。 我希望Flex2組件的原始作者能夠繼續支持它,因為我對PHP的了解不如應有的好。

我沒有找到所提出的技術問題的答案,但是我發現了解決業務問題的可行解決方法。

VirtueMart中的php_checkout模塊執行許多函數,其中一些函數(如上述兩個函數)從不同的類調用函數。

我在php_checkout.php文件中發現了一個顯示了一些承諾的代碼段。 如下所示以供參考:

  // Export the order_id so the checkout complete page can get it $d["order_id"] = $order_id; /* * Let the shipping module know which shipping method * was selected. This way it can save any information * it might need later to print a shipping label. */ if( is_callable( array($this->_SHIPPING, 'save_rate_info') )) { $this->_SHIPPING->save_rate_info($d); } 

顯然,ps_checkout.php 可能包含對運輸模塊中的函數“ save_rate_info”的調用。 當前,該代碼在“ flex2.php”文件中不存在。 但是,如果要添加它,這將使我有機會使用我想要傳遞給checkout模塊的信息來更新“ $ d”數組,而不必直接在“ get_tax_rate”函數中進行操作。

我仍然希望收到我最初提出的技術問題的答案,但是我希望這種解決方法可以對在將可變稅率應用於運費中有類似問題的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM