修复用于Joomla 1.5.26的Virtuemart 1.1.9的Flex2发布模块中的错误时出现PHP作用域问题

修复用于Joomla 1.5.26的Virtuemart 1.1.9的Flex2发布模块中的错误时出现PHP作用域问题,php,joomla,scope,virtuemart,shipping,Php,Joomla,Scope,Virtuemart,Shipping,背景 当前免费Flex2装运模块存在一个错误,导致装运金额的税务计算不正确。该错误导致在所有计算中使用国内税率,即使货物是国际的。此外,我正在尝试扩展模块的功能 在其当前形式中,Flex2允许为国内和国际销售单独设置运费。但是,税率可能仅为每个变量的特定值(即一个国内税率,一个国际税率) 我的祖国(加拿大)要求在国内市场适用不同的税率,具体取决于我将货物运至的省份。我相信还有其他国家/地区有类似的要求。我已经能够成功地更改管理屏幕,以允许设置一个指标,该指标将允许基于VirtueMart tax

背景

当前免费Flex2装运模块存在一个错误,导致装运金额的税务计算不正确。该错误导致在所有计算中使用国内税率,即使货物是国际的。此外,我正在尝试扩展模块的功能

在其当前形式中,Flex2允许为国内和国际销售单独设置运费。但是,税率可能仅为每个变量的特定值(即一个国内税率,一个国际税率)

我的祖国(加拿大)要求在国内市场适用不同的税率,具体取决于我将货物运至的省份。我相信还有其他国家/地区有类似的要求。我已经能够成功地更改管理屏幕,以允许设置一个指标,该指标将允许基于VirtueMart tax_模式值的可变税率(根据门店位置、买家位置或欧盟区域选择不同税率)

问题-在没有参数的情况下将信息从“A”类传送到“B”类

问题发生在签出期间。VirtueMart的签出模块包含在文件ps_checkout.php中。函数“calc_order_shipping”以以下代码段开头:


功能计算订单装运(&$d){

这是“核心”VirtueMart系统的一部分,所以我不想修改它

第一个函数调用从数组“$d”中提取发货总额(即在结账过程开始时执行的税务计算的结果)。第二行用于检索用于执行此计算的税率。所有装运模块的当前实现都是返回静态税率。如您所见,数组“$d”未传递给第二个函数,因此我没有足够的信息来确定客户是国外还是国内(此信息可以从$d数组中的发货地址信息派生)

不幸的是,在我要求Flex2可变税率之前,每个国内/国际区域只允许有一个税率-这是在配置装运模块时手动设置的。因此,没有“更改”值的机会。这是正常的(过去)简单地从shipping module的静态配置文件中提取事后税率。但是,使用我新需要的功能,我需要在结帐时更改税率(基于购物者可能选择默认地址以外的送货地址的可能性)

“B类”的详细信息

这两个函数都位于同一个源代码文件中:flex2.php,位于类flex2中

为了完整起见,以下是这两个函数的代码:


函数获取率(&$d){

Flex2中的“缺陷”(这不是本问题的主题)在于参数“Flex2_TAX_CLASS”仅与国内运输相关。相应的参数“Flex2_TAX_CLASS_I”对于国际运输,没有在任何地方引用。为了确定是否使用该变量的国内版本和国际版本,我必须检查运输地址,该地址存储在$d数组中

需要克服的挑战——也就是这个职位的原因

所以,这是我的问题

是否有某种方法可以定义对$d的引用,该引用具有相对于类的全局作用域;然后修改“get_rate”函数,使其在该类作用域引用变量中存储$d输入数组的副本,以便在“get_tax_rate”中引用函数?如果可能,定义类作用域变量、将&$d的值分配给该变量的正确语法是什么,以及从“get_tax_rate”函数访问新创建的变量的正确语法是什么

我之前研究过一些关于PHP变量作用域的一般性问题,并找到了一些似乎切中要害的答案,但我不敢在没有得到更具体建议的情况下尝试这些答案,因为我找到的答案没有解决函数“x”通过“引用”接收变量的具体要求从另一个类中的函数,创建一种允许函数“y”也通过引用从同一数组中检索(和更新)信息的方法

这是我在这个论坛上的第一个问题,我希望我的请求尽可能具体。谢谢你的帮助


另外,一旦我解决了这个问题,我将提交“增强版”Flex2 shipping module作为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可能在shipping模块中包含对函数“save_rate_info”的调用。目前,“flex2.php”文件中不存在此代码。但是,如果添加此代码,我将有机会更新“$d”数组中包含我希望传递给结帐模块的信息,而无需直接在“get_tax_rate”fu中执行此操作
    $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;
    }
}
    // 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);
    }