背景
当前免费的 Flex2 运输模块存在一个错误,该错误会导致对运输金额的税收计算不正确。该错误导致所有计算中都使用国内税率,即使货物是国际的。另外,我正在尝试扩展模块的功能。
在目前的形式中,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.php,在类 flex2 中。
为了完整起见,这里是这两个函数的代码:
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 中的“bug”(不是本题的主题)在于参数“FLEX2_TAX_CLASS”仅与国内运输相关。国际运输的相应参数“FLEX2_TAX_CLASS _I ”未在任何地方引用。为了确定是使用国内版本还是国际版本的变量,我必须检查存储在 $d 数组中的送货地址。
要克服的挑战 - 也就是这篇文章的原因
所以,这是我的问题...
有什么方法可以定义对 $d 的引用,其具有相对于类的全局范围;然后修改“get_rate”函数,以便将其 $d 输入数组的副本存储在这个类范围的引用变量中,以便可以在“get_tax_rate”函数中引用?如果可能的话,定义类范围变量的正确语法是什么,将 &$d 的值分配给该变量,以及从“get_tax_rate”函数访问新创建的变量的正确语法是什么?
我之前研究过一些关于 PHP 变量作用域的通用问题,并找到了一些似乎是正确的答案,但我不敢在没有得到更具体建议的情况下尝试它们,因为我找到的答案没有解决函数“x”的特定要求从不同类中的函数“通过引用”接收变量,并创建一种允许函数“y”也通过引用从同一数组中检索(和更新)信息的方式。
这是我在这个论坛上的第一个问题,我想尽可能具体地提出我的要求。感谢您的任何帮助。
PS 一旦我解决了这个问题,我将把“增强的”Flex2 运输模块作为非商业附件提交给 Joomla/Virtuemart 社区。我希望 Flex2 组件的原作者能够继续支持它,因为我对 PHP 的了解并没有达到应有的水平。