"Bitte geben Sie eine Versandart an", wenn Sie programmgesteuert eine Bestellung erstellen


7

Ich erstelle programmgesteuert eine Bestellung mit Code, den ich vor einiger Zeit geschrieben habe und der bei Verwendung der kostenlosen Versandmethode (dh freeshipping_freeshipping) korrekt funktioniert.

Jetzt versuche ich jedoch, die Bestellung mithilfe einer Versandmethode aufzugeben (die aus einem Modul von WebShopApps stammt ).

$shipping_address->setCollectShippingRates(true)->collectShippingRates()
        ->setShippingMethod($delivery)
        ->setPaymentMethod($payment);

Wo $deliveryist der Versandartcode? Wenn ich die Bestellung aufgebe, erhalte ich eine Fehlermeldung

a:5:{i:0;s:33:"Please specify a shipping method.";i:1;s:1554:"#0 /chroot/home/site/site/html/app/code/core/Mage/Sales/Model/Service/Quote.php(303): Mage::throwException('Please specify ...')

Beim Navigieren zu dieser Datei ( Quote.php) in Zeile 303:

protected function _validate()
{
    if (!$this->getQuote()->isVirtual()) {
        $address = $this->getQuote()->getShippingAddress();
        $addressValidation = $address->validate();
        if ($addressValidation !== true) {
            Mage::throwException(
                Mage::helper('sales')->__('Please check shipping address information. %s', implode(' ', $addressValidation))
            );
        }
        $method= $address->getShippingMethod();
        $rate  = $address->getShippingRateByCode($method);
        if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
            Mage::throwException(Mage::helper('sales')->__('Please specify a shipping method.')); //this is line 303
        }
    }
    ....

Um dies zu lösen, habe ich eine Bestellung über Adminhtml erstellt und Quote.phpzu Testzwecken geändert , um:

echo ($method . " and " . $rate);die();

Ich bekomme dann eine leere Seite mit der Methode, die Magento erwartet, sowie der Rate (die leer ist), aber die Bestellung wird immer noch gut erstellt. Die Methode, die Magento ausgibt, entspricht genau dem Wert, den meine $deliveryVariable festgelegt hat.

Was mache ich falsch?


1
Bitte überprüfen Sie, ob der kostenlose Versand in admin aktiviert ist
Amit Bera

Kostenloser Versand ist aktiviert
Moose

Haben Sie versucht, die Versandmethode festzulegen, bevor Sie collectShippingRates () aufgerufen haben?
David Manners

Antworten:


2

Sie sollten $ quote-> getShippingAddress () -> collectTotals () hinzufügen. vor Ihrem obigen Code. Es wird klappen :

/* Important*/
 $quote->getShippingAddress()->collectTotals();// if not will show Please specify shipping methods.
 /* Important*/

$shipping_address->setCollectShippingRates(true)->collectShippingRates()
        ->setShippingMethod($delivery)
        ->setPaymentMethod($payment);

2
versuchte es auch. Die Rate wurde nicht berechnet, daher wird die Rate immer falsch / leer zurückgegeben. Magento 1.9.x
Osify

1
$shipping_method = "flatrate_flatrate";
$shipping_address->setShippingMethod($shipping_method)    
$shipping_address->setCollectShippingRates(true)->collectShippingRates();

$quoteObj->collectTotals()->save();

Oben hat es für mich funktioniert.


Das Hinzufügen Ihrer Lösung zu sales_quote_collect_totals_before führt zu einem schwerwiegenden Fehler: Maximale Funktionsverschachtelungsstufe von '500' erreicht, Abbruch!
Rbncha

2
versucht, nicht funktioniert ... setCollectShippingRates die Rate nicht berechnet, so dass Rate immer false / leer zurückgeben. Magento 1.9.x
Osify

0

Dies scheint völlig unabhängig vom WebShopApps-Anbieter selbst zu sein. Es scheint, dass für Ihre Anfrage keine Versandkosten zurückgegeben werden.

Können Sie untersuchen, ob Ihre Versandadresse und Ihr Angebotsobjekt beim programmgesteuerten Erstellen korrekt ausgefüllt sind? Ich empfehle, mit einem anderen Magento-Anbieter wie Tablerates zu testen, da der Träger free_shipping keine Felder in der Anfrage verwendet, um die Versandkosten zurückzugeben.


0

für jeden Angebotsposten:

$quoteItem->setFreeShipping(true);

Dann können Sie die Freeshipping-Methode für Ihr Angebot festlegen

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.