繁体   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