यदि कुल शिपिंग प्रभाव में है, तो शिपिंग कुल बिक्री का आइटम पंक्ति का वजन 0 पर सेट क्यों करता है?


21

प्रस्तावना: इसका अर्थ समुदाय के लिए मैगेंटो की वास्तुकला के लिखित अवलोकन के रूप में सेवा करना है (और स्वयं), साथ ही साथ एक वास्तविक प्रश्न भी। हम एक भारी संशोधित कार्ट और चेकआउट अनुभव के साथ काम कर रहे हैं, लेकिन इस समस्या की जड़ Magento के मुख्य तर्क के भीतर है।

पृष्ठभूमि

हमने मानक खरीदारी कार्ट मूल्य नियमों की कार्यक्षमता का उपयोग करके एक मुफ़्त शिपिंग कूपन बनाया है। कूपन पर कोई शर्तें नहीं हैं, और केवल वही कार्रवाई है जो Free Shippingसेट की गई है For matching items only। के बाद से कोई शर्त नहीं है, इस सेट हो जाएगा free_shippingकरने के लिए 1बिक्री उद्धरण आइटम के सभी के लिए।

जैसा कि प्रथागत है, हमने मुफ़्त शिपिंग शिपिंग विधि भी सक्षम की है। Freeshippingवाहक मॉडल दरें प्रदान करेगा जब भी अनुरोध मुफ्त शिपिंग या उप-योग मिलान हैं या सीमा से अधिक है (लेकिन हम सीमा विकल्प का उपयोग नहीं कर रहे हैं)। देखें 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::_updateFreeMethodQuoteइस तरह दिखता है:

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

इसलिए, जब तक कि सभी आइटम free_shippingएक सत्य मान पर सेट हो जाते हैं (जो वे कूपन के कारण करेंगे), हमें मुफ्त शिपिंग चाहिए। और हम करते हैं!

समस्या

हालांकि, इसका एक प्रमुख दुष्प्रभाव है: किसी भी शिपिंग तरीके जो किसी आइटम पर निर्भर करते हैं row_weight(जैसा कि हमारे FedEx वाहक के अनुकूलित संस्करण के साथ होता है) उचित शिपिंग दरों की गणना करने में विफल रहेगा क्योंकि प्रत्येक आइटम तब row_weightहोता है 0जब मुफ़्त शिपिंग सक्रिय होता है।

दिलचस्प रूप से पर्याप्त है, मैगेंटो के डिफ़ॉल्ट शिपिंग वाहक में से कोई भी वास्तव में भरोसा नहीं करता है row_weight, लेकिन हम इस बात पर विचार करेंगे कि हम क्यों / कब निकालते हैंrow_weight सेट होते हैं 0

यह पता लगाना कि क्यों row_weightसेट किया गया है0

यह हिस्सा वास्तव में खुदाई करने के लिए बहुत आसान था। शिपिंग गणनाओं का एक बड़ा हिस्सा Mage_Sales_Model_Quote_Address_Total_Shipping::collectइसमें शामिल row_weightहै 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);
        }
    }

यह Magento के डिफ़ॉल्ट वाहक को प्रभावित क्यों नहीं करता है

आप के लिए एक regex खोज करते हैं /row_?weight/i(उदाहरण के लिए getRowWeight, setRowWeight, setData('row_weight')में, आदि)Mage_Shipping (सरल वाहक) और Mage_Usa(FedEx, UPS, और कुछ अन्य वाहक), कुछ भी दिखाई नहीं देता। क्यूं कर? क्योंकि डिफ़ॉल्ट वाहक कुल पता भार का उपयोग करते हैं, न कि व्यक्तिगत मद भार।

उदाहरण के लिए, आइए देखें 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());
    }

और अनुरोध को पैकेज का वजन कहां से मिलता है? जवाब में है 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());

हम $item->getRowWeight()यहाँ के उपयोग को अनदेखा कर सकते हैं क्योंकि requestShippingRatesएक विशिष्ट वस्तु को एक पैरामीटर के रूप में प्रदान किए बिना कहा जाता है 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();

यह परिचित दिखना चाहिए, क्योंकि यह वही स्थान है जो प्रत्येक आइटम के row_weightलिए निर्धारित है 0यदि मुफ्त शिपिंग प्रभावी है। ध्यान दें कि $addressWeightप्रत्येक आइटम पर रकम कैसे लगाई जाती है $rowWeight, लेकिन यह निर्धारित करने से पहलेrow_weight0 किया जाता है

मूल रूप से, पता वजन हमेशा सभी वस्तुओं का कुल वजन होगा, चाहे free_shippingप्रत्येक आइटम का मूल्य हो। चूंकि Magento के डिफ़ॉल्ट वाहक केवल पते के वजन पर निर्भर करते हैं, इसलिए समस्या row_weightदिखाई नहीं देती है।

तो हमें आवश्यकता क्यों है row_weight

हमें जरूरत है row_weightक्योंकि हमने विभिन्न मूल से आने वाली वस्तुओं के लिए अलग-अलग दरों की गणना करने के लिए Magento के FedEx वाहक को अनुकूलित किया है, भले ही वे एक ही गंतव्य पर जा रहे हों (और इस तरह एक ही पते का हिस्सा हैं)। उदाहरण के लिए, यदि आप एनजे में रहते हैं, तो एनए की तुलना में एनजे से एक आइटम जहाज करना सस्ता (और तेज) है - और यदि आपके पास ऑर्डर में एनजे और सीए दोनों से आइटम हैं, तो आप लागत (और अनुमानित) देख सकते हैं प्रत्येक शिपमेंट की डिलीवरी की तारीख)।

सब सब में, ऐसा लगता है कि हम इस मुद्दे को आसानी से अनदेखा row_weightऔर weight * qtyसीधे उपयोग करके काम कर सकते हैं । लेकिन, यह हमें निम्न करता है:

प्रश्न

अगर मुफ्त शिपिंग प्रभाव में है, तो बिक्री उद्धरण वस्तुओं का Shippingकुल सेट क्यों होता है? यह कहीं भी उपयोग किया जाना प्रतीत नहीं होता है।row_weight0

इसके अलावा अवलोकन

मैंने यह उल्लेख करने की उपेक्षा की कि row_weightवास्तव में गैर-शून्य हो सकता है, लेकिन फिर भी इससे कम है weight * qty, अगर free_shippingइसके बजाय एक संख्या है true। मेरा मानना ​​है कि इसका उद्देश्य इस तरह से परिदृश्य का समाधान प्रदान करना है:

मेरी गाड़ी में एक ही उत्पाद के 3 आइटम हैं, प्रत्येक आइटम का वजन 2 पाउंड है। मैं एक मुफ्त शिपिंग कूपन लागू करता हूं, लेकिन यह 2 की मात्रा तक सीमित है, इसलिए यह केवल 2 आइटमों पर लागू होता है। अब, जब मैं शिपिंग दरों को देखता हूं, तो मैं 6 पाउंड (2 + 2 + 2) के बजाय 2 एलबीएस (2 + 0 + 0) के लिए शिपिंग दरों को देखूंगा।

यह समझ में आता है, लेकिन इसके साथ दो प्रमुख समस्याएं हैं:

  • कोई भी डिफ़ॉल्ट Magento के वाहक इस तरह से काम नहीं करते हैं (वे पते के कुल वजन का उपयोग करते हैं, ऊपर देखें)।

  • यहां तक ​​कि अगर कुछ वाहक इस तरह से काम करते हैं, तो इसका मतलब है कि मैं किसी भी शिपिंग विधि (जैसे रात भर शिपिंग) को चुन सकता हूं और केवल 1 आइटम के वजन के लिए भुगतान कर सकता हूं - मतलब, व्यापारी को अन्य 2 वस्तुओं की लागत को कवर करना होगा । यह व्यापारी पर निर्भर होगा कि मैं केवल 1 आइटम के वजन के लिए भुगतान करता हूं, और फिर अन्य 2 वस्तुओं को अधिक लागत प्रभावी विधि का उपयोग करके जहाज करता हूं, जो प्रभावी रूप से मैगेंटो प्रदर्शित करता है और आइटम वास्तव में कैसे थे के बीच एक बेमेल निर्माण करता है। बाहर भेज दिया।


हे, कोई लेने वाला नहीं? :)
अगोप

इतने अप-वोट, इतनी कम चर्चा! इस तरह के Magento के विकास का जीवन है।
अगोप

जवाबों:


2

मुझे लगा कि इस पर छुरा लूँगा ...;)

काफी दिलचस्प सवाल यह है कि आपने यहां ऐसा क्यों किया है, तो मुझे लगता है कि उन्होंने ऐसा क्यों किया, हालांकि जब मैं इस विशेष मामले को खेलने के लिए आता हूं, तब भी मैं इसे ट्रैक करने के लिए काम कर रहा हूं।

यूएसपीएस वाहक विधि के ऊपर जाते हुए, ऐसा लगता है कि उनके एपीआई के अंतर्राष्ट्रीय अनुरोध प्रत्येक उत्पाद के लिए आइटम प्रदान करते हैं। यह एकमात्र वाहक है जिसे मैं पा सकता हूं जो ऐसा करता है। नीचे पूर्ण विधि और उसके नीचे हाइलाइट किए गए अनुभाग का पता लगाएं।

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

विशेष खंड:

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

मेरे लिए, ऐसा प्रतीत होता है कि मैगेंटो वास्तविक आइटम वज़न के आधार पर पैकेज के वजन का पुन: संयोजन कर रहा है, और पते के वजन का लाभ नहीं उठा रहा है। मुझे आश्चर्य है कि अगर पैकेज आइटम को पारित किया जा रहा है, तो उनका वजन शून्य नहीं है, क्योंकि यह गलत प्रतिक्रिया के कारण खराब वजन डेटा पर आधारित होगा।

हालांकि अंधेरे में गोली मार दी।


1

मुझे इस पर एक छुरा भी था और मुझे कुछ दिलचस्प लगा कि यह कोड ऑफ लाइन है

$item->setRowWeight($rowWeight);

1.1.5 संस्करण पर पेश किया गया था इससे पहले कि फ़ंक्शन इस तरह था।

Magento मिरर आयात Magento रिलीज 1.1.5 - Shipping.php

मैगेंटो मिरर आयात मैगनेटो रिलीज 1.1.1 - जहाजरानी.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;
        }
    }

मेरी समझ यह है कि Mage_Sales_Model_Quote_Address_Total_Shipping :: $ addressWeight और $ freeMethodWeight की गणना / अपडेट करने की आवश्यकता है

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

और $ आइटम-> setRowWeight शॉड का उपयोग यहां नहीं किया जाना चाहिए क्योंकि यह आइटम से संबंधित है न कि बोली और पते के साथ।

मेरी शर्त है कि यह एक गलती है। संभवतः row_total को कभी भी शिपिंग विधियों में उपयोग करने का इरादा नहीं था यही कारण है कि डिफ़ॉल्ट मॉड्यूल इसका उपयोग नहीं कर रहे हैं।

मैं किसी भी परिवर्तन लॉग को ट्रैक करने में सक्षम नहीं था जो समझा सकता है कि यह v 1.1.5 में क्यों पेश किया गया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.