2016-07-14 21 views
0

Ich verwende den folgenden Code als Teil eines Skripts, um Magento Orders programmatisch zu erstellen. Das Skript funktioniert gut, wenn ich die VersandmethodeMagento Auftragserstellung Programmatisch nur mit einer Versandart arbeiten

als Versandmethode verwende. Allerdings, wenn ich andere Lieferweg wie eine benutzerdefinierte Versandart, flatrate_flatrate oder usps_1 e.t.c wählen, es gibt mir den Fehler:

"Please Specify a shipping method"

Ich habe überall gesucht, aber war nicht in der Lage, eine Lösung zu finden. Jede Hilfe würde sehr geschätzt werden, danke.

$shippingAddress->setCollectShippingRates(true)->collectShippingRates() 
    ->setShippingMethod($shipping_method); 

Edit:

Ich habe es für nicht US-Aufträge mit flatrate zu arbeiten und eine Verlängerung freeadminshipping sowohl auf US- und Nicht-US-Aufträge. Sie können jedoch immer noch keine der Versandmethoden von UPS oder USPS verwenden.

Antwort

0

Diese Methode erstellen Bestellung und ich habe dies in meinem Projekt funktioniert. In Ihrem Code entfernen Sie bitte den Code für die Versandmethode und versuchen Sie, dass es Ihnen gut geht. Ansonsten kannst du unter meinem Code verwenden.

public function createOrderAction($paymentMethod) { 
    try { 
    $checkout_session = Mage::getSingleton('checkout/session'); 
    $cq = $checkout_session->getQuote(); 
    $cq->assignCustomer(Mage::getSingleton('customer/session')->getCustomer()); 
    $quoteObj = Mage::getModel('sales/quote')->load($checkout_session->getQuoteId()); // Mage_Sales_Model_Quote 
    //Mage::getSingleton('checkout/session')->getQuote()->getShippingAddress() 

    $items = $quoteObj->getAllItems();     

    $quoteObj->reserveOrderId(); 

     // set payment method 

    $quotePaymentObj = $quoteObj->getPayment(); // Mage_Sales_Model_Quote_Payment 
    $quotePaymentObj->setMethod($paymentMethod); 

    $quoteObj->setPayment($quotePaymentObj); 


    // convert quote to order 
    $convertQuoteObj = Mage::getSingleton('sales/convert_quote'); 

    $quoteObj->setShippingAddress($cq->getShippingAddress()); 
    $quoteObj->setBillingAddress($cq->getBillingAddress()); 
    $orderObj = $convertQuoteObj->addressToOrder($quoteObj->getShippingAddress()); 

    $orderPaymentObj = $convertQuoteObj->paymentToOrderPayment($quotePaymentObj); 


    // convert quote addresses 
    $orderObj->setBillingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getBillingAddress())); 

    $orderObj->setShippingAddress($convertQuoteObj->addressToOrderAddress($quoteObj->getShippingAddress())); 

    // set payment options 
    $orderObj->setPayment($convertQuoteObj->paymentToOrderPayment($quoteObj->getPayment())); 

    // convert quote items 
    foreach ($items as $item) { 
     // @var $item Mage_Sales_Model_Quote_Item 
     $orderItem = $convertQuoteObj->itemToOrderItem($item); 
     $orderItem->setWholesaler($item->getWholesaler()); 
     $orderItem->setComment($item->getComment()); 
     $options = array(); 
     if ($productOptions = $item->getProduct()->getTypeInstance(true)->getOrderOptions($item->getProduct())) { 
      $options = $productOptions; 
     } 
     if ($addOptions = $item->getOptionByCode('additional_options')) { 
      $options['additional_options'] = unserialize($addOptions->getValue()); 
     } 
     if ($options) { 
      $orderItem->setProductOptions($options); 
     } 
     if ($item->getParentItem()) { 
      $orderItem->setParentItem($orderObj->getItemByQuoteItemId($item->getParentItem()->getId())); 
     } 
     $orderObj->addItem($orderItem); 
    } 
     $orderObj->setCanShipPartiallyItem(false); 
     $orderObj->place(); 
     $quoteObj->setIsActive(0)->save(); 
     $orderObj->save(); 
     $orderObj->sendNewOrderEmail(); 
     return $orderObj->getId(); 
    } catch (Exception $e){  
     Mage::log($e->getMessage()); 
     Mage::log($e->getTraceAsString()); 
    } 
} 
+0

Hallo Sunny, danke für deine Antwort. Ich verwende die Bestellungserstellung in einer API-Datei, die die Produktartikel, Zahlungsdaten und Versandart erhält, um die Bestellung zu erstellen. Ich benutze die Checkout-Sitzung nicht, sondern benutze 'sales/service_quote', um die Bestellung zu erstellen. Ich kann nicht herausfinden, wo die Versandart in Ihrem Code festgelegt ist, da ich den Kunden dafür ebenfalls belasten muss. –