Бесплатная доставка Magento только для товаров с соответствием - используя таблицу тарифов, основанную на общей сумме заказа - PullRequest
5 голосов
/ 01 июля 2011

Могу ли я достичь следующего с Magento:

Я использую систему тарифных ставок цены против пункта назначения. И у меня есть правило цены бесплатной доставки в корзине для продуктов с атрибутом free_shipping -> для установки yes.

Это прекрасно работает, если у вас есть нормальные продукты в корзине ИЛИ бесплатная доставка продуктов в корзине. Однако, если у вас в корзине есть как обычный товар, так и продукт бесплатной доставки. Он рассчитывает стоимость доставки на основе общей суммы заказа, включая продукт с бесплатной доставкой.

Как я могу исправить это, чтобы доставка относилась только к сумме заказа товаров, не включая бесплатную доставку, если в корзине есть оба типа товаров?

Есть ли для этого плагин Magento? Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 20 февраля 2012

У меня была та же проблема, и я сделал небольшое изменение кода, чтобы оно заработало.

В основном забыли правило продвижения. Отключи это. Кажется, он не работает должным образом с таблицей тарифов доставки при применении бесплатной доставки к отдельным элементам. Правила доставки, как представляется, имеют приоритет и рассчитываются на основе общей суммы корзины.

Хитрость заключается в том, чтобы вычесть элементы бесплатной доставки из общей суммы корзины в тот момент, когда модуль «Расценки на доставку» производит расчет.

В моем случае все внутри определенной категории (id: 15) должно было получить бесплатную доставку. Но вы можете изменить логику в соответствии с вашими потребностями.

Вам нужно будет изменить следующий файл (или скопировать его в локальную кодовую базу, чтобы сделать все правильно).

Приложение \ код \ ядро ​​\ Mage \ Доставка \ Модель \ 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());
                }
        }
    }
2 голосов
/ 01 июля 2011

В вашем правиле продаж установите для бесплатной доставки значение ТОЛЬКО ДЛЯ СООТВЕТСТВУЮЩИХ ЭЛЕМЕНТОВ.

1 голос
/ 08 июля 2011

Если я правильно понял ваш вопрос, решение действительно простое и быстрое, вот как я его решил:

В файле: Validator.php (/ app / code / core / Mage /)SalesRule / Model /) поиск строки "case Mage_SalesRule_Model_Rule :: FREE_SHIPPING_ITEM:" и непосредственно перед "break;"добавьте эту простую вещь "$ item-> setWeight (0);"

. Это приведет к тому, что вес элемента будет равен 0, поэтому стоимость доставки не будет рассчитываться, и если вы отключите бесплатную доставкудля шапки пункт вес учитывается и все отлично работает.

0 голосов
/ 20 марта 2015

Я знаю, что на этот вопрос ответили и приняли, но я хотел бы предложить способ сделать это без программирования или изменения основных файлов, если это возможно

Если вы хотите создать свой элемент как«Виртуальный» элемент, вы можете исключить виртуальные элементы из стоимости доставки

Если элемент уже создан

Перейдите в свою базу данных с помощью программы, такой как phpMyAdmin, и перейдите к catalog_product_entity, найдите свой SKU продукта и измените type_id на virtual

Если элемент не создан

Создать элемент как Virtual Product на первом шагесоздание продукта (вместо Simple Product или Bundled Product и т. д.)

Для исключения Virtual Products из стоимости доставки

Перейдите к System > Configuration > Shipping Methods и подTable Rates заголовок установлен Include Virtual Products in Price Calculation в Нет

  • Обратите внимание, это будет работать только для Table Rates способа доставки
...