Warum setzt die Gesamtsumme "Versand" das Zeilengewicht der Angebote auf 0, wenn der Versand kostenlos ist?


21

Vorwort: Dies soll sowohl als schriftliche Beobachtung der Magento-Architektur für die Community (und mich) als auch als eigentliche Frage dienen. Wir arbeiten mit einer stark veränderten Cart- und Checkout-Erfahrung, aber die Wurzel dieses Problems liegt in der Kernlogik von Magento.

Hintergrund

Wir haben einen kostenlosen Versandgutschein mit der Standardfunktion für Warenkorb-Preisregeln erstellt. Es gibt keine Bedingungen für den Coupon, und die einzige Aktion, die festgelegt ist, Free Shippingist For matching items only. Da es keine Bedingungen gibt, wird festgelegt dies free_shippingauf 1für alle die Angebotspositionen Umsatz.

Wie üblich haben wir auch die Versandart "Kostenloser Versand" aktiviert. Das FreeshippingCarrier-Modell liefert Preise, wenn die Anfrage versandkostenfrei ist oder die Zwischensumme dem Schwellenwert entspricht oder diesen überschreitet (wir verwenden jedoch nicht die Schwellenwertoption). Siehe 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 */
}

Und Mage_Shipping_Model_Carrier_Freeshipping::_updateFreeMethodQuotesieht so aus:

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

Solange sich alle Artikel free_shippingauf einen echten Wert eingestellt haben (der sich aufgrund des Gutscheins ergibt), sollten wir den Versand kostenlos erhalten. Und wir tun es!

Das Problem

Allerdings gibt es einen wichtigen Nebeneffekt: alle Methoden Versand , das auf ein Element der verlassen row_weight(wie es der Fall mit unserer maßgeschneiderten Version des FedEx Trägers) fehl richtig Versandkosten zu berechnen , da jedes Element row_weighteingestellt wird , 0wenn freies Verschiffen aktiv ist .

Interessanterweise verlässt sich keiner von Magentos Standardversendern tatsächlich darauf row_weight, aber wir werden darauf zurückkommen, nachdem wir herausgefunden haben, warum / wann eingestellt row_weightist 0.

Herausfinden, warum auf row_weightgesetzt ist0

Dieser Teil war eigentlich ziemlich einfach zu graben. Ein großer Teil der Versandberechnungen findet statt Mage_Sales_Model_Quote_Address_Total_Shipping::collect, einschließlich der Einstellung row_weightauf 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);
        }
    }

Warum dies nicht die Standardanbieter von Magento betrifft

Wenn Sie eine regex Suche nach tun /row_?weight/i(zB getRowWeight, setRowWeight, setData('row_weight'), etc.) in Mage_Shipping(einfachen Träger) und Mage_Usa(FedEx, UPS, und einige andere Träger), erscheint nichts auf. Warum? Da die Standardanbieter das Gesamtadressgewicht verwenden, nicht die einzelnen Artikelgewichte.

Schauen wir uns zum Beispiel an 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());
    }

Und woher bezieht die Anfrage das Paketgewicht? Die Antwort ist in 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());

Wir können die Verwendung von $item->getRowWeight()here ignorieren , da requestShippingRatesaufgerufen wird, ohne ein bestimmtes Element als Parameter anzugeben in 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();

Dies sollte Ihnen bekannt vorkommen, da dies derselbe Ort ist, auf den jeder Artikel row_weighteingestellt ist, 0wenn der Versand kostenlos ist. Beachten Sie, wie $addressWeightdie einzelnen Elemente zusammengefasst werden $rowWeight, dies wird jedoch vor dem row_weightFestlegen von festgelegt0 .

Grundsätzlich ist das Adressgewicht immer das Gesamtgewicht aller Artikel, unabhängig vom free_shippingWert jedes Artikels. Da die Standardanbieter von Magento nur auf das Adressgewicht angewiesen sind, tritt das Problem mit row_weightnicht auf.

Also warum brauchen wir row_weight

Dies ist erforderlich, row_weightda wir die FedEx-Spedition von Magento so angepasst haben, dass separate Preise für Artikel mit unterschiedlicher Herkunft berechnet werden, auch wenn sie zum selben Ziel (und damit zur selben Adresse gehören) gehen. Wenn Sie beispielsweise in NJ leben, ist es billiger (und schneller), einen Artikel von NJ aus zu versenden als von CA aus. Wenn Ihre Bestellung sowohl Artikel von NJ als auch von CA enthält, können Sie die Kosten (und geschätzten Kosten) anzeigen Liefertermin) jeder Sendung.

Alles in allem sieht es so aus, als könnten wir dieses Problem leicht umgehen, indem wir es ignorieren row_weightund weight * qtydirekt verwenden. Aber es führt uns zu:

Die Frage

Warum setzt die ShippingGesamtsumme den row_weightWert der Angebotspositionen auf, 0wenn der Versand kostenlos ist? Dies scheint nirgendwo genutzt zu werden.

Weitere Beobachtungen

Ich habe versäumt zu erwähnen, dass row_weightdas tatsächlich nicht Null sein könnte, aber immer noch kleiner als weight * qty, wenn free_shippingstattdessen eine Zahl ist true. Ich gehe davon aus, dass der Zweck darin besteht, eine Lösung für ein Szenario wie das folgende bereitzustellen:

Ich habe 3 Artikel desselben Produkts in meinem Warenkorb, wobei jeder Artikel 2 Pfund wiegt. Ich wende einen kostenlosen Versandgutschein an, der jedoch auf eine Menge von 2 Stück begrenzt ist. Daher gilt er nur für 2 Artikel. Wenn ich mir jetzt die Versandkosten anschaue, sehe ich mir die Versandkosten für 2 lbs (2 + 0 + 0) anstatt für 6 lbs (2 + 2 + 2) an.

Dies scheint sinnvoll zu sein, es gibt jedoch zwei Hauptprobleme:

  • Keiner der Standard-Magento-Carrier funktioniert so (sie verwenden das Gesamtgewicht der Adresse, siehe oben).

  • Selbst wenn einige der Spediteure so arbeiten würden, würde das bedeuten, dass ich eine beliebige Versandart (z. B. Nachtversand) auswählen und nur für das Gewicht von 1 Artikel bezahlen könnte - das heißt, der Händler müsste die Kosten für die anderen 2 Artikel tragen . Es wäre Sache des Händlers, irgendwie herauszufinden, dass ich nur für das Gewicht von einem Artikel bezahlt und dann die anderen 2 Artikel mit einer kostengünstigeren Methode versandt habe, wodurch effektiv eine Diskrepanz zwischen dem, was Magento anzeigt, und dem, was die Artikel tatsächlich sind, entsteht verschifft.


He, keine Abnehmer? :)
Agop

So viele Gegenstimmen, so wenig Diskussion! So ist das Leben der Magento-Entwicklung.
Agop

Antworten:


2

Dachte mir, ich würde es versuchen ...;)

Eine sehr interessante Frage, die Sie hier gestellt haben. Hier ist, warum ich glaube, dass sie es getan haben. Ich arbeite jedoch immer noch daran, herauszufinden, wann dieser spezielle Fall ins Spiel kommt.

Wenn man die USPS-Trägermethode betrachtet, sieht es so aus, als ob internationale Anfragen an ihre API die Einzelgewichte für jedes Produkt liefern. Dies ist der einzige Träger, den ich finden kann, der dies tut. Finden Sie die vollständige Methode unten und den hervorgehobenen Abschnitt darunter.

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

Bestimmter Abschnitt:

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

Mir scheint, dass Magento das Paketgewicht basierend auf den tatsächlichen Artikelgewichten neu berechnet und das Adressgewicht nicht nutzt. Ich frage mich, ob das Gewicht der übergebenen Paketartikel nicht auf Null gesetzt ist, da dies zu falschen Artikelgewichten führen würde, wenn man bedenkt, dass die Antwortraten auf falschen Gewichtsdaten basieren würden.

Im Dunkeln gedreht.


1

Ich hatte auch einen Stich auf diese und ich fand etwas Interessantes in dieser Codezeile

$item->setRowWeight($rowWeight);

wurde in Version 1.1.5 eingeführt, bevor die Funktion so war.

Magento Mirror Import Magento Release 1.1.5 - Versand.php

Magento Mirror Import Magento Release 1.1.1 - Versand.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;
        }
    }

Mein Verständnis ist, dass Mage_Sales_Model_Quote_Address_Total_Shipping :: collect $ addressWeight und $ freeMethodWeight berechnen / aktualisieren muss

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

und $ item-> setRowWeight sollte hier nicht verwendet werden, da es sich um den Artikel handelt, nicht um das Zitat und die Adresse.

Ich wette, das ist ein Fehler. Wahrscheinlich sollte row_total nie in Versandmethoden verwendet werden, weshalb Standardmodule es nicht verwenden.

Ich konnte kein Änderungsprotokoll ausfindig machen, das erklären könnte, warum dies in Version 1.1.5 eingeführt wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.