1

バックグラウンド

現在の無料の Flex2 配送モジュールにはバグがあり、配送金額の税計算が正しくありません。このバグにより、出荷が国際的なものであっても、すべての計算で国内税率が使用されます。さらに、モジュールの機能を拡張しようとしています。

Flex2 の現在の形式では、送料を国内販売と国際販売で個別に設定できます。ただし、税率は各バリアントの特定の値に限定される場合があります (つまり、国内向けの 1 つの税率、国際向けの 1 つの税率)。

私の母国 (カナダ) では、配送先の州に応じて、国内市場内で異なる税率を適用する必要があります。同様の要件を持つ他の国/管轄区域があると確信しています。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();

これは VirtueMart の「コア」システムの一部なので、変更したくありません。

最初の関数呼び出しは、配列 "$d" から配送料の合計 (つまり、チェックアウト プロセスの最初に実行された税計算の結果) を抽出します。2 行目は、この計算に使用された税率を取得するためのものです。すべての配送モジュールの現在の実装は、静的な税率を返すことです。ご覧のとおり、配列 "$d" は 2 番目の関数に渡されていないため、顧客が外国人か国内人かを判断するのに十分な情報がありません (この情報は、配送先住所情報から取得できます。 $d 配列の一部)。

残念ながら、Flex2 変動税率の要件が適用される前は、国内/国際ゾーンごとに 1 つの税率しか許可されていませんでした。これは、配送モジュールの構成中に手動で設定されていました。したがって、値が「変化する」可能性はありませんでした。(過去には)出荷モジュールの静的構成ファイルから事後に税率を単純に抽出しても問題ありませんでした。ただし、新しく必要になった機能では、チェックアウト時に税率を変更する必要がある可能性があります (買い物客がデフォルトの住所以外の配送先住所を選択する可能性に基づいて)。

「クラスB」の詳細

これらの関数は両方とも、flex2 クラス内の同じソース コード ファイル flex2.php にあります。

完全を期すために、これら 2 つの関数のコードを次に示します。

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_tax_rate」関数内で参照できるように、このクラススコープの参照変数に $d 入力配列のコピーを格納するように「get_rate」関数を変更しますか? 可能であれば、クラス スコープの変数を定義し、その変数に &$d の値を代入するための正しい構文と、「get_tax_rate」関数から新しく作成された変数にアクセスするための正しい構文は何でしょうか?

以前、PHP 変数のスコープに関するいくつかの一般的な質問を調査したところ、適切と思われる回答がいくつか見つかりました。関数 "x"が別のクラスの関数から"参照によって" 変数を受け取り、関数 "y" が参照によって同じ配列から情報を取得 (および更新) できるようにする方法を作成するという特定の要件。

これはこのフォーラムでの最初の質問であり、リクエストをできるだけ具体的にしたかったのです。ご協力ありがとうございます。

PS この問題が解決したら、「拡張」Flex2 出荷モジュールを非商用アドオンとして Joomla/Virtuemart コミュニティに提出します。Flex2 コンポーネントのオリジナルの作成者が、引き続き Flex2 コンポーネントをサポートしてくれることを願っています。私の PHP に関する知識は十分ではないためです。

4

1 に答える 1

0

提示された技術的な質問に対する回答は見つかりませんでしたが、ビジネス上の問題を解決するための実行可能な回避策を見つけました。

VirtueMart の php_checkout モジュールは、いくつかの関数を実行します。そのうちのいくつか (上記の 2 つの関数のように) は、別のクラスから関数を呼び出します。

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」ファイルには存在しません。しかし、それが追加された場合、「get_tax_rate」関数内で直接行う必要なく、チェックアウト モジュールに渡したい情報で「$d」配列を更新する機会が得られます。

最初に提起した技術的な質問に対する回答を受け取りたいと思っていますが、この回避策が、変動税率を配送料に適用することで同様の問題を抱えている人に役立つことを願っています.

于 2012-08-27T03:00:17.397 に答える