简体   繁体   English

Magento:在后端代码中以编程方式创建订单

[英]Magento: Create an order programmatically in backend code

I try to create an order in the backend in Magento (1.5.1.0).我尝试在 Magento (1.5.1.0) 的后端创建一个订单。

Here is some code:这是一些代码:

        // Get the product id stored in the optionValue of the widget
        $productId = $order['customIdNumber'];

        // Load the product
        $product = Mage::getModel('catalog/product')->load($productId);

        // Check whether the product could be loaded
        if($product->getId())
        {
            // Get the customer model
            $customer = Mage::getModel('customer/customer');

            // Set the website id associated with the customer
            $customer->setWebsiteId(Mage::app()->getWebsite()->getId());

            // Try to load the customer by email
            $customer->loadByEmail($order['personAddresses'][0]['email']);

            // Check whether the customer not exists
            if(!$customer->getId())
            {
                // Create the customer
                $customer->setEmail($order['personAddresses'][0]['email']);
                $customer->setFirstname($order['personAddresses'][0]['firstName']);
                $customer->setLastname($order['personAddresses'][0]['lastName']);
                $customer->save();
            }

            // Set the esstial order data
            $orderData = array(
                'currency' => $order['currencyCode'],
                'account'  => array(
                    'group_id' => Mage_Customer_Model_Group::NOT_LOGGED_IN_ID,
                    'email'    => $order['personAddresses'][0]['email']
                ),
                'billing_address' => 
                    'firstname'  => $order['personAddresses'][0]['firstName'],
                    'lastname'   => $order['personAddresses'][0]['lastName'],
                    'street'     => $order['personAddresses'][0]['street'],
                    'city'       => $order['personAddresses'][0]['city'],
                    'country_id' => $order['personAddresses'][0]['country'],
                    'region_id'  => 'BW',
                    'postcode'   => $order['personAddresses'][0]['postalCode'],
                    'telephone'  => '0123456789',
                ),
                'comment' => array(
                    'customer_note' => "[Order has been created by the sellaround widget module]\nCustomer message:\n".
                                       $order['personAddresses'][0]['message']
                ),
                'send_confirmation' => false // does that something?
            );

            // Set the shipping address to the billing address
            $orderData['shipping_address'] = $orderData['billing_address'];

            // Set the payment method
            $paymentMethod = 'checkmo';

            // Set the shipping method
            $shippingMethod = 'flatrate_flatrate';


            // Get the backend quote session
            $quoteSession = Mage::getSingleton('adminhtml/session_quote');

            // Set the session store id
            $quoteSession->setStoreId(Mage::app()->getStore('default')->getId());

            // Set the session customer id
            $quoteSession->setCustomerId($customer->getId());


            // Get the backend order create model
            $orderCreate = Mage::getSingleton('adminhtml/sales_order_create');

            // Import the data
            $orderCreate->importPostData($orderData);

            // Calculate the shipping rates
            $orderCreate->collectShippingRates();

            // Set the shipping method
            $orderCreate->setPaymentMethod($paymentMethod);

            // Set the payment method to the payment instance
            $orderCreate->getQuote()->getPayment()->addData(array('method' => $paymentMethod));

            // Set the shipping method
            $orderCreate->setShippingMethod($shippingMethod);

            // Set the quote shipping address shipping method
            $orderCreate->getQuote()->getShippingAddress()->setShippingMethod($shippingMethod);

            // Add the product
            $orderCreate->addProducts(array($product->getId() => array('qty' => 0)));

            // Initialize data for price rules
            $orderCreate->initRuleData();

            // Save the quote
            $orderCreate->saveQuote(); // neccessary?

            // Create the order
            $order = $orderCreate->createOrder();
        }

I always get the exception 'Please specify a shipping method.'我总是收到“请指定运输方式”的例外情况。 in Mage_Sales_Model_Service_Quote::_validate in line 293.在第 293 行的Mage_Sales_Model_Service_Quote::_validate中。

Code of the lines around the exception:异常周围的代码:

    $method= $address->getShippingMethod();
    $rate  = $address->getShippingRateByCode($method);
    if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
        Mage::throwException($helper->__('Please specify a shipping method.'));
    }

Does anybody know why I get this error?有人知道我为什么会收到此错误吗? Is it because the rate could not be loaded?是因为无法加载速率吗? (The product is not virtual) (产品不是虚拟的)

I solves this times ago by using a shipping method i created myself.我以前通过使用我自己创建的运输方法解决了这个问题。

The code to create the order also changed from the backend singleton a 'frontend method' like this:创建订单的代码也从后端 singleton 更改为“前端方法”,如下所示:

// Get the Quote to save the order
$quote = Mage::getModel('sales/quote')->setStoreId($storeId);

// Set the customer
$quote->setCustomer($customer);

// Add the product with the product options
$quote->addProduct($product, new Varien_Object($productOptions));

// Add the address data to the billing address
$billingAddress  = $quote->getBillingAddress()->addData($addressData);

// Add the adress data to the shipping address
$shippingAddress = $quote->getShippingAddress()->addData($addressData);

// Collect the shipping rates
$shippingAddress->setCollectShippingRates(true)->collectShippingRates();

// Set the shipping method /////////// Here i set my own shipping method
$shippingAddress->setShippingMethod($shippingMethod);

// Set the payment method
$shippingAddress->setPaymentMethod($paymentMethod);

// Set the payment method
$quote->getPayment()->importData(array('method' => $paymentMethod));

// Collect the prices
$quote->collectTotals()->save();

// Get the service to submit the order
$service = Mage::getModel('sales/service_quote', $quote);

// Submit the order
$service->submitAll();

// Get the new order
$newOrder = $service->getOrder();


// Get payment instance
$payment = $newOrder->getPayment();

// Set the buyer data
$this->_importPaymentInformation($payment, $order);

// Set the transaction data
$payment->setData('last_trans_id', $order['transNrPurchaseForReceiver']);

// Save the payment changes
$payment->save();

// Set the order state and save the order
$newOrder->setState(Mage_Sales_Model_Order::STATE_PROCESSING, true, $comment)->save();

I've been cracking my head around this problem.我一直在努力解决这个问题。 In a number of ways, programmatically creating the order results in that.在许多方面,以编程方式创建订单会导致这种情况。 I've achieved to bypass that problem with an override of method _validate of the class Mage_Sales_Model_Service_Quote.我已经通过覆盖 class Mage_Sales_Model_Service_Quote 的方法 _validate 来绕过这个问题。

Hello try setting the shipping method like this and see if it solve your problem你好试试这样设置运输方式看看能不能解决你的问题

// set shipping method 
$shippingAddress=$quote->getShippingAddress();
$shippingAddress->setCollectShippingRates(true)
->collectShippingRates()->setShippingMethod('flatrate_flatrate'); 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM