PHP范围问题,同时在Joirtla 1.5.26的Virtuemart 1.1.9的Flex2发货模块中修复错误

时间:2012-08-19 07:10:36

标签: php joomla scope virtuemart shipping

背景

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

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

我的祖国(加拿大)要求在国内市场适用不同的税率,具体取决于我运往哪个省。我确定还有其他国家/司法管辖区有类似的要求。我已经能够成功更改管理屏幕,以允许设置一个指标,该指标将允许基于VirtueMart TAX_MODE值的可变税率(根据商店位置,买方位置或EU区域选择不同的税率) )。

问题 - 来自班级" 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();

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

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

第一个函数调用从数组" $ d"中提取Shipping Total(即在结帐过程开始时执行的税务计算的结果)。第二行用于检索用于执行此计算的税率。所有运输模块的当前实施是返回静态税率。如你所见,数组" $ d"没有通过第二个功能,所以我没有足够的信息来确定客户是国外的还是国内的(这些信息可以从作为$ d数组一部分的送货地址信息中获得)。 / p>

不幸的是,在我对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;
    }
}

" bug"在Flex2中(这不是这个问题的主题)在于参数" FLEX2_TAX_CLASS"仅与国内运输相关联。相应的参数" FLEX2_TAX_CLASS _I "国际航运没有在任何地方参考。为了确定是否使用变量的国内版本和国际版本,我必须检查发货地址,该地址存储在$ d数组中。

要克服的挑战 - 也就是这篇文章的原因

所以,这是我的问题......

我是否可以通过某种方式定义对$ d的引用,并使用相对于该类的全局范围;然后修改" get_rate"函数,以便它将其$ d输入数组的副本存储在此类范围的引用变量中,以便可以在" get_tax_rate"中引用它。功能?如果可能,那么定义类范围变量的正确语法是什么,将& $ d的值分配给该变量,以及从" get_tax_rate&#34访问新创建的变量的正确语法;功能

我之前曾研究过一些关于PHP变量范围的一般性问题,并且发现了几个看似合适的答案,但是我太害怕在没有得到更具体的建议的情况下尝试它们,因为我发现的答案没有解决功能的具体要求" x"接收变量"通过引用" 来自不同类别的函数并创建一种允许函数" y"还可以通过引用从同一数组中检索(和更新)信息。

这是我在这个论坛上的第一个问题,我想尽可能具体地说明我的要求。感谢您的帮助。

P.S。一旦我解决了这个问题,我将提交" Enhanced" Flex2运输模块是Joomla / Virtuemart社区的非商业附加组件。我希望Flex2组件的原作者能够继续支持它,因为我对PHP的了解并不像它应该的那样好。

1 个答案:

答案 0 :(得分:0)

我没有找到所提出的技术问题的答案,但我发现了解决业务问题的可行解决办法。

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);
    }

// 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”函数中执行。

我仍然希望得到我最初提出的技术问题的答案,但我希望这项工作可以帮助那些将可变税率应用于运费的类似问题的人。