Tại sao tổng Vận chuyển đặt hàng_ weight của các mục báo giá bán hàng thành 0 nếu giao hàng miễn phí có hiệu lực?


21

Lời nói đầu: Điều này có nghĩa là đóng vai trò là một quan sát bằng văn bản về kiến ​​trúc của Magento cho cộng đồng (và bản thân tôi), cũng như một câu hỏi thực tế. Chúng tôi đang làm việc với một giỏ hàng được sửa đổi nhiều và trải nghiệm thanh toán, nhưng gốc rễ của vấn đề này nằm trong logic cốt lõi của Magento.

Lý lịch

Chúng tôi đã tạo một phiếu giảm giá vận chuyển miễn phí bằng cách sử dụng chức năng quy tắc giá mua sắm tiêu chuẩn. Không có điều kiện trên phiếu giảm giá, và hành động duy nhất là Free Shippingđược đặt thành For matching items only. Vì không có điều kiện, điều này sẽ được đặt free_shippingthành 1cho tất cả các mục báo giá bán hàng.

Theo thông lệ, chúng tôi cũng đã kích hoạt phương thức Giao hàng miễn phí. Các Freeshippingmô hình hãng sẽ cung cấp giá bất cứ khi nào theo yêu cầu có miễn phí vận chuyển hoặc các trận đấu tổng phụ hoặc vượt quá ngưỡng (nhưng chúng tôi không sử dụng tùy chọn ngưỡng). Xem Mage_Shipping_Model_Carrier_Freeshipping::collectRates:

$this->_updateFreeMethodQuote($request);

if (($request->getFreeShipping()) // <-- This is the condition we're relying on
    || ($request->getBaseSubtotalInclTax() >=
        $this->getConfigData('free_shipping_subtotal'))
) {
    /* Snip: Add $0.00 method to the result */
}

Mage_Shipping_Model_Carrier_Freeshipping::_updateFreeMethodQuotetrông như thế này:

protected function _updateFreeMethodQuote($request)
{
    $freeShipping = false;
    $items = $request->getAllItems();
    $c = count($items);
    for ($i = 0; $i < $c; $i++) {
        if ($items[$i]->getProduct() instanceof Mage_Catalog_Model_Product) {
            if ($items[$i]->getFreeShipping()) {
                $freeShipping = true;
            } else {
                return;
            }
        }
    }
    if ($freeShipping) {
        $request->setFreeShipping(true);
    }
}

Vì vậy, miễn là tất cả các mặt hàng đã free_shippingđược đặt thành một giá trị trung thực (mà chúng sẽ, do phiếu giảm giá), chúng tôi sẽ được giao hàng miễn phí. Và chúng tôi làm!

Vấn đề

Tuy nhiên, có một tác dụng phụ lớn: mọi phương thức vận chuyển phụ thuộc vào một mặt hàng row_weight(như trường hợp với phiên bản tùy chỉnh của hãng vận chuyển FedEx) sẽ không tính được mức giá vận chuyển phù hợp vì mỗi mặt hàng row_weightđược đặt thành 0khi vận chuyển miễn phí được kích hoạt.

Thật thú vị, không có nhà vận chuyển mặc định nào của Magento thực sự dựa vào row_weight, nhưng chúng ta sẽ hiểu điều đó sau khi chúng ta tìm hiểu tại sao / khi nào row_weightđược đặt thành 0.

Tìm hiểu tại sao row_weightđược đặt thành0

Phần này thực sự khá dễ dàng để đào lên. Một phần lớn các tính toán vận chuyển xảy ra Mage_Sales_Model_Quote_Address_Total_Shipping::collect, bao gồm cài đặt row_weightthành 0:

public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

Tại sao điều này không ảnh hưởng đến các nhà mạng mặc định của Magento

Nếu bạn thực hiện tìm kiếm regex cho /row_?weight/i(ví dụ getRowWeight, setRowWeight, setData('row_weight'), vv) trong Mage_Shipping(tàu sân bay đơn giản) và Mage_Usa(FedEx, UPS, và một số hãng khác), không có gì bật lên. Tại sao? Bởi vì các nhà mạng mặc định sử dụng tổng trọng lượng địa chỉ, không phải trọng lượng vật phẩm riêng lẻ.

Ví dụ: chúng ta hãy nhìn vào Mage_Usa_Model_Shipping_Carrier_Fedex::setRequest:

public function setRequest(Mage_Shipping_Model_Rate_Request $request)
{
    $this->_request = $request;

    $r = new Varien_Object();

    /* Snip */

    $weight = $this->getTotalNumOfBoxes($request->getPackageWeight());
    $r->setWeight($weight);
    if ($request->getFreeMethodWeight()!= $request->getPackageWeight()) {
        $r->setFreeMethodWeight($request->getFreeMethodWeight());
    }

Và yêu cầu có được trọng lượng gói từ đâu? Câu trả lời là trong Mage_Sales_Model_Quote_Address::requestShippingRates:

public function requestShippingRates(Mage_Sales_Model_Quote_Item_Abstract $item = null)
{
    /** @var $request Mage_Shipping_Model_Rate_Request */
    $request = Mage::getModel('shipping/rate_request');
    /* Snip */
    $request->setPackageWeight($item ? $item->getRowWeight() : $this->getWeight());

Chúng ta có thể bỏ qua việc sử dụng $item->getRowWeight()ở đây vì requestShippingRatesđược gọi mà không cung cấp một mục cụ thể làm tham số trong Mage_Sales_Model_Quote_Address_Total_Shipping::collect:

public function collect(Mage_Sales_Model_Quote_Address $address)
{
    parent::collect($address);

    foreach ($items as $item) {
        /* Snip: Handling virtual items and parent items */

        if ($item->getHasChildren() && $item->isShipSeparately()) {
            /* Snip: Handling items with children */
        }
        else {
            if (!$item->getProduct()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
            $item->setRowWeight($rowWeight);
        }
    }

    $address->setWeight($addressWeight);
    $address->setFreeMethodWeight($freeMethodWeight);

    $address->collectShippingRates();

Điều này sẽ trông quen thuộc, vì đây là cùng một nơi mà mỗi mặt hàng row_weightđược đặt 0nếu giao hàng miễn phí có hiệu lực. Lưu ý cách tính $addressWeighttổng của từng mục $rowWeight, nhưng điều đó được thực hiện trước đó row_weightđược đặt thành0 .

Về cơ bản, trọng lượng địa chỉ sẽ luôn là tổng trọng lượng của tất cả các mặt hàng, bất kể free_shippinggiá trị của từng mặt hàng. Vì các nhà mạng mặc định của Magento chỉ dựa vào trọng lượng địa chỉ, nên vấn đề row_weightkhông xuất hiện.

Vậy tại sao chúng ta cần row_weight

Chúng tôi cần row_weightbởi vì chúng tôi đã tùy chỉnh nhà cung cấp dịch vụ FedEx của Magento để tính giá riêng cho các mặt hàng đến từ các nguồn gốc khác nhau, ngay cả khi chúng sẽ đến cùng một đích (và do đó là một phần của cùng một địa chỉ). Ví dụ: nếu bạn sống ở NJ, việc gửi một mặt hàng từ NJ rẻ hơn (và nhanh hơn) từ CA - và nếu bạn có các mặt hàng từ cả NJ và CA trong đơn đặt hàng của mình, bạn có thể thấy chi phí (và ước tính ngày giao hàng) của từng lô hàng.

Nói chung, có vẻ như chúng ta có thể dễ dàng giải quyết vấn đề này bằng cách bỏ qua row_weightvà sử dụng weight * qtytrực tiếp. Nhưng, nó dẫn chúng ta đến:

Câu hỏi

Tại sao Shippingtổng số đặt các row_weightmục báo giá bán hàng 0nếu vận chuyển miễn phí có hiệu lực? Điều này dường như không được sử dụng ở bất cứ đâu.

Quan sát thêm

Tôi đã bỏ qua đề cập rằng row_weightthực sự có thể là khác không, nhưng vẫn ít hơn weight * qty, nếu free_shippinglà một số thay vì true. Tôi giả sử mục đích của việc này là cung cấp giải pháp cho một kịch bản như thế này:

Tôi có 3 mặt hàng của cùng một sản phẩm trong giỏ hàng của tôi, mỗi mặt hàng nặng 2 lbs. Tôi áp dụng phiếu giảm giá vận chuyển miễn phí, nhưng nó giới hạn ở số lượng 2, vì vậy nó chỉ áp dụng cho 2 trong số các mặt hàng. Bây giờ, khi tôi nhìn vào giá vận chuyển, tôi sẽ xem giá vận chuyển cho 2 lbs (2 + 0 + 0) thay vì 6 lbs (2 + 2 + 2).

Điều này có vẻ có ý nghĩa, nhưng có hai vấn đề lớn với nó:

  • Không có nhà mạng Magento mặc định nào hoạt động như thế này (họ sử dụng tổng trọng lượng địa chỉ, xem ở trên).

  • Ngay cả khi một số hãng vận chuyển hoạt động như vậy, điều đó có nghĩa là tôi có thể chọn bất kỳ phương thức vận chuyển nào (ví dụ: vận chuyển qua đêm) và chỉ trả cho trọng lượng của 1 mặt hàng - có nghĩa là, thương gia sẽ phải trả chi phí cho 2 mặt hàng khác . Người bán sẽ tùy thuộc vào việc bằng cách nào đó tôi nhận ra rằng tôi chỉ trả cho trọng lượng của 1 mặt hàng, sau đó vận chuyển 2 mặt hàng khác bằng phương pháp hiệu quả hơn về chi phí, tạo ra sự không phù hợp giữa những gì Magento hiển thị và cách các mặt hàng thực sự vận chuyển ra.


Heh, không có người nhận? :)
Bắt đầu

Rất nhiều phiếu bầu, rất ít thảo luận! Đó là cuộc sống phát triển của Magento.
Agop

Câu trả lời:


2

Hình tôi sẽ đâm sau này ...;)

Một câu hỏi thú vị mà bạn đã đặt ra ở đây vì vậy đây là lý do tại sao tôi nghĩ rằng họ đã làm nó, tuy nhiên tôi vẫn đang làm việc để theo dõi khi trường hợp cụ thể này xuất hiện.

Theo phương pháp của nhà cung cấp USPS, có vẻ như các Yêu cầu quốc tế đối với API của họ cung cấp các trọng số được chia thành từng khoản cho từng sản phẩm. Đây là hãng duy nhất mà tôi có thể tìm thấy làm điều này. Tìm phương pháp đầy đủ bên dưới và phần được tô sáng bên dưới.

protected function _formIntlShipmentRequest(Varien_Object $request)
    {
        $packageParams = $request->getPackageParams();
        $height = $packageParams->getHeight();
        $width = $packageParams->getWidth();
        $length = $packageParams->getLength();
        $girth = $packageParams->getGirth();
        $packageWeight = $request->getPackageWeight();
        if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
            $packageWeight = Mage::helper('usa')->convertMeasureWeight(
                $request->getPackageWeight(),
                $packageParams->getWeightUnits(),
                Zend_Measure_Weight::POUND
            );
        }
        if ($packageParams->getDimensionUnits() != Zend_Measure_Length::INCH) {
            $length = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getLength(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $width = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getWidth(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
            $height = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getHeight(),
                $packageParams->getDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }
        if ($packageParams->getGirthDimensionUnits() != Zend_Measure_Length::INCH) {
            $girth = round(Mage::helper('usa')->convertMeasureDimension(
                $packageParams->getGirth(),
                $packageParams->getGirthDimensionUnits(),
                Zend_Measure_Length::INCH
            ));
        }

        $container = $request->getPackagingType();
        switch ($container) {
            case 'VARIABLE':
                $container = 'VARIABLE';
                break;
            case 'FLAT RATE ENVELOPE':
                $container = 'FLATRATEENV';
                break;
            case 'FLAT RATE BOX':
                $container = 'FLATRATEBOX';
                break;
            case 'RECTANGULAR':
                $container = 'RECTANGULAR';
                break;
            case 'NONRECTANGULAR':
                $container = 'NONRECTANGULAR';
                break;
            default:
                $container = 'VARIABLE';
        }
        $shippingMethod = $request->getShippingMethod();
        list($fromZip5, $fromZip4) = $this->_parseZip($request->getShipperAddressPostalCode());

        // the wrap node needs for remove xml declaration above
        $xmlWrap = new SimpleXMLElement('<?xml version = "1.0" encoding = "UTF-8"?><wrap/>');
        $method = '';
        $service = $this->getCode('service_to_code', $shippingMethod);
        if ($service == 'Priority') {
            $method = 'Priority';
            $rootNode = 'PriorityMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else if ($service == 'First Class') {
            $method = 'FirstClass';
            $rootNode = 'FirstClassMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        } else {
            $method = 'Express';
            $rootNode = 'ExpressMailIntlRequest';
            $xml = $xmlWrap->addChild($rootNode);
        }

        $xml->addAttribute('USERID', $this->getConfigData('userid'));
        $xml->addAttribute('PASSWORD', $this->getConfigData('password'));
        $xml->addChild('Option');
        $xml->addChild('Revision', self::DEFAULT_REVISION);
        $xml->addChild('ImageParameters');
        $xml->addChild('FromFirstName', $request->getShipperContactPersonFirstName());
        $xml->addChild('FromLastName', $request->getShipperContactPersonLastName());
        $xml->addChild('FromFirm', $request->getShipperContactCompanyName());
        $xml->addChild('FromAddress1', $request->getShipperAddressStreet2());
        $xml->addChild('FromAddress2', $request->getShipperAddressStreet1());
        $xml->addChild('FromCity', $request->getShipperAddressCity());
        $xml->addChild('FromState', $request->getShipperAddressStateOrProvinceCode());
        $xml->addChild('FromZip5', $fromZip5);
        $xml->addChild('FromZip4', $fromZip4);
        $xml->addChild('FromPhone', $request->getShipperContactPhoneNumber());
        if ($method != 'FirstClass') {
            if ($request->getReferenceData()) {
                $referenceData = $request->getReferenceData() . ' P' . $request->getPackageId();
            } else {
                $referenceData = $request->getOrderShipment()->getOrder()->getIncrementId()
                                 . ' P'
                                 . $request->getPackageId();
            }
            $xml->addChild('FromCustomsReference', 'Order #' . $referenceData);
        }
        $xml->addChild('ToFirstName', $request->getRecipientContactPersonFirstName());
        $xml->addChild('ToLastName', $request->getRecipientContactPersonLastName());
        $xml->addChild('ToFirm', $request->getRecipientContactCompanyName());
        $xml->addChild('ToAddress1', $request->getRecipientAddressStreet1());
        $xml->addChild('ToAddress2', $request->getRecipientAddressStreet2());
        $xml->addChild('ToCity', $request->getRecipientAddressCity());
        $xml->addChild('ToProvince', $request->getRecipientAddressStateOrProvinceCode());
        $xml->addChild('ToCountry', $this->_getCountryName($request->getRecipientAddressCountryCode()));
        $xml->addChild('ToPostalCode', $request->getRecipientAddressPostalCode());
        $xml->addChild('ToPOBoxFlag', 'N');
        $xml->addChild('ToPhone', $request->getRecipientContactPhoneNumber());
        $xml->addChild('ToFax');
        $xml->addChild('ToEmail');
        if ($method != 'FirstClass') {
            $xml->addChild('NonDeliveryOption', 'Return');
        }
        if ($method == 'FirstClass') {
            if (stripos($shippingMethod, 'Letter') !== false) {
                $xml->addChild('FirstClassMailType', 'LETTER');
            } else if (stripos($shippingMethod, 'Flat') !== false) {
                $xml->addChild('FirstClassMailType', 'FLAT');
            } else{
                $xml->addChild('FirstClassMailType', 'PARCEL');
            }
        }
        if ($method != 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        $shippingContents = $xml->addChild('ShippingContents');
        $packageItems = $request->getPackageItems();
        // get countries of manufacture
        $countriesOfManufacture = array();
        $productIds = array();
        foreach ($packageItems as $itemShipment) {
                $item = new Varien_Object();
                $item->setData($itemShipment);

                $productIds[]= $item->getProductId();
        }
        $productCollection = Mage::getResourceModel('catalog/product_collection')
            ->addStoreFilter($request->getStoreId())
            ->addFieldToFilter('entity_id', array('in' => $productIds))
            ->addAttributeToSelect('country_of_manufacture');
        foreach ($productCollection as $product) {
            $countriesOfManufacture[$product->getId()] = $product->getCountryOfManufacture();
        }

        $packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }
        $additionalPackagePoundsWeight = floor($packageOuncesWeight / self::OUNCES_POUND);
        $packagePoundsWeight += $additionalPackagePoundsWeight;
        $packageOuncesWeight -= $additionalPackagePoundsWeight * self::OUNCES_POUND;
        if ($packagePoundsWeight + $packageOuncesWeight / self::OUNCES_POUND < $packageWeight) {
            list($packagePoundsWeight, $packageOuncesWeight) = $this->_convertPoundOunces($packageWeight);
        }

        $xml->addChild('GrossPounds', $packagePoundsWeight);
        $xml->addChild('GrossOunces', $packageOuncesWeight);
        if ($packageParams->getContentType() == 'OTHER' && $packageParams->getContentTypeOther() != null) {
            $xml->addChild('ContentType', $packageParams->getContentType());
            $xml->addChild('ContentTypeOther ', $packageParams->getContentTypeOther());
        } else {
            $xml->addChild('ContentType', $packageParams->getContentType());
        }

        $xml->addChild('Agreement', 'y');
        $xml->addChild('ImageType', 'PDF');
        $xml->addChild('ImageLayout', 'ALLINONEFILE');
        if ($method == 'FirstClass') {
            $xml->addChild('Container', $container);
        }
        // set size
        if ($packageParams->getSize()) {
            $xml->addChild('Size', $packageParams->getSize());
        }
        // set dimensions
        $xml->addChild('Length', $length);
        $xml->addChild('Width', $width);
        $xml->addChild('Height', $height);
        if ($girth) {
            $xml->addChild('Girth', $girth);
        }

        $xml = $xmlWrap->{$rootNode}->asXML();
        return $xml;
    }

Phần cụ thể:

$packagePoundsWeight = $packageOuncesWeight = 0;
        // for ItemDetail
        foreach ($packageItems as $itemShipment) {
            $item = new Varien_Object();
            $item->setData($itemShipment);

            $itemWeight = $item->getWeight() * $item->getQty();
            if ($packageParams->getWeightUnits() != Zend_Measure_Weight::POUND) {
                $itemWeight = Mage::helper('usa')->convertMeasureWeight(
                    $itemWeight,
                    $packageParams->getWeightUnits(),
                    Zend_Measure_Weight::POUND
                );
            }
            if (!empty($countriesOfManufacture[$item->getProductId()])) {
                $countryOfManufacture = $this->_getCountryName(
                    $countriesOfManufacture[$item->getProductId()]
                );
            } else {
                $countryOfManufacture = '';
            }
            $itemDetail = $shippingContents->addChild('ItemDetail');
            $itemDetail->addChild('Description', $item->getName());
            $ceiledQty = ceil($item->getQty());
            if ($ceiledQty < 1) {
                $ceiledQty = 1;
            }
            $individualItemWeight = $itemWeight / $ceiledQty;
            $itemDetail->addChild('Quantity', $ceiledQty);
            $itemDetail->addChild('Value', $item->getCustomsValue() * $item->getQty());
            list($individualPoundsWeight, $individualOuncesWeight) = $this->_convertPoundOunces($individualItemWeight);
            $itemDetail->addChild('NetPounds', $individualPoundsWeight);
            $itemDetail->addChild('NetOunces', $individualOuncesWeight);
            $itemDetail->addChild('HSTariffNumber', 0);
            $itemDetail->addChild('CountryOfOrigin', $countryOfManufacture);

            list($itemPoundsWeight, $itemOuncesWeight) = $this->_convertPoundOunces($itemWeight);
            $packagePoundsWeight += $itemPoundsWeight;
            $packageOuncesWeight += $itemOuncesWeight;
        }

Đối với tôi, có vẻ như Magento đang tính toán lại trọng lượng gói dựa trên trọng lượng vật phẩm thực tế và không tận dụng trọng lượng địa chỉ. Tôi tự hỏi nếu các mục gói được thông qua không có trọng số bằng không, bởi vì điều đó sẽ dẫn đến trọng lượng của mục sai khi xem xét phản hồi tỷ lệ sẽ dựa trên dữ liệu trọng lượng xấu.

Bắn trong bóng tối mặc dù.


1

Tôi cũng có một cú đâm về điều này và tôi đã tìm thấy một điều thú vị dòng mã này

$item->setRowWeight($rowWeight);

đã được giới thiệu trên phiên bản 1.1.5 trước đó, chức năng là như thế này.

Magento Mirror Nhập khẩu Magento 1.1.5 - Shipping.php

Magento Mirror Nhập Magento Phiên bản 1.1.1 - Shipping.php

            else {
            if (!$item->getProduct()->getTypeInstance()->isVirtual()) {
                $addressQty += $item->getQty();
            }
            $itemWeight = $item->getWeight();
            $rowWeight  = $itemWeight*$item->getQty();
            $addressWeight+= $rowWeight;
            if ($freeAddress || $item->getFreeShipping()===true) {
                $rowWeight = 0;
            } elseif (is_numeric($item->getFreeShipping())) {
                $freeQty = $item->getFreeShipping();
                if ($item->getQty()>$freeQty) {
                    $rowWeight = $itemWeight*($item->getQty()-$freeQty);
                }
                else {
                    $rowWeight = 0;
                }
            }
            $freeMethodWeight+= $rowWeight;
        }
    }

Tôi hiểu rằng Mage_Sales_Model_Quote_Address_Total_Shipping :: thu thập cần phải tính toán / cập nhật $ address Weight và $ freeMethodweight

    $addressWeight      = $address->getWeight();
    $freeMethodWeight   = $address->getFreeMethodWeight();

và $ item-> setRow WEight shod không được sử dụng ở đây vì có liên quan đến mục không có trích dẫn và địa chỉ.

Đặt cược của tôi là đây là một sai lầm. Có lẽ row_total không bao giờ được sử dụng trong các phương thức vận chuyển, tại sao các mô-đun mặc định không sử dụng nó.

Tôi không thể theo dõi bất kỳ nhật ký thay đổi nào có thể giải thích tại sao điều này được giới thiệu trong phiên bản 1.1.5.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.