5

Magento で次のことを達成できますか。

私は、価格対目的地のテーブル レート システムを使用しています。そして、属性 free_shipping を持つ製品の送料無料のショッピング カート価格ルールを持っています -> yes に設定します。

バスケットに通常の商品または送料無料の商品が入っている場合、これは問題なく機能します。ただし、バスケットに通常の商品と送料無料の商品の両方がある場合。送料無料の商品を含めたご注文合計金額で送料を計算します。

カートに両方のタイプの商品が入っている場合、送料無料を含まない商品の注文合計にのみ送料が適用されるようにするにはどうすればよいですか?

このための Magento プラグインはありますか? 前もって感謝します。

4

4 に答える 4

2

私は同じ問題を抱えていて、それを機能させるために小さなコード変更を実装しました。

基本的にプロモーションルールを忘れてください。無効にします。個々の商品に送料無料を適用すると、送料表では正しく機能しないようです。配送ルールが優先され、カートの合計に基づいて計算されるようです。

秘訣は、送料モジュールが計算を行っている時点で、カートの合計から送料無料のアイテムを差し引くことです。

私の場合、特定のカテゴリ(id:15)内のすべては、無料配送を取得することでした。ただし、ニーズに合わせてロジックを修正できます。

次のファイルを修正する必要があります(または、適切に実行するには、ローカルコードベースにコピーします)。

app \ code \ core \ Mage \ Shipping \ Model \ Carrier \ Tablerate.php

これを変える:

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
    {
        if (!$this->getConfigFlag('active')) {
            return false;
        }

        // exclude Virtual products price from Package value if pre-configured
        if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
            foreach ($request->getAllItems() as $item) {
                if ($item->getParentItem()) {
                    continue;
                }
                if ($item->getHasChildren() && $item->isShipSeparately()) {
                    foreach ($item->getChildren() as $child) {
                        if ($child->getProduct()->isVirtual()) {
                            $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                        }
                    }
                } elseif ($item->getProduct()->isVirtual()) {
                    $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
                }
            }
        }

これに:

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    if (!$this->getConfigFlag('active')) {
        return false;
    }

    // exclude Virtual products price from Package value if pre-configured
    //And Exclude items which should have Free Shipping
    if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {

       $freeshipping_category_id = 15;

        foreach ($request->getAllItems() as $item) {
            if ($item->getParentItem()) {
                continue;
            }
            if ($item->getHasChildren() && $item->isShipSeparately()) {
                foreach ($item->getChildren() as $child) {
                    if ($child->getProduct()->isVirtual()) {
                        $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                    }
                        //If it's in the free shipping, remove it's value from the basket
                        $arr_category_ids = $child->getProduct()->getCategoryIds();
                        if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
                            $request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
                        }
                }
            } elseif ($item->getProduct()->isVirtual()) {
                $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
            }
                //If it's in the free shipping category, remove it's value from the basket
                $arr_category_ids = $item->getProduct()->getCategoryIds();
                if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
                    $request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
                }
        }
    }
于 2012-02-20T13:04:07.010 に答える
2

販売ルールで、送料無料を「一致するアイテムのみ」に設定します。

于 2011-07-01T10:09:16.297 に答える
1

あなたの質問を正しく理解していれば、解決策は非常に簡単で迅速です。これが私が解決した方法です。

ファイル内: Validator.php (/app/code/core/Mage/SalesRule/Model/) で、文字列「case Mage_SalesRule_Model_Rule::FREE_SHIPPING_ITEM:」と「break;」の直前を検索します。この単純なこと「$item->setWeight(0);」を追加します。

これにより、アイテムの重量が強制的に 0 になるため、配送料は計算されません。帽子アイテムの送料無料オプションを無効にすると、重量が考慮され、すべてが正常に機能します。

于 2011-07-08T14:19:59.967 に答える