【发布时间】:2011-07-15 14:38:51
【问题描述】:
我尝试在 Magento (1.5.1.0) 的后端创建订单。
这里有一些代码:
// 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();
}
我总是收到异常“请指定运输方式。”在Mage_Sales_Model_Service_Quote::_validate 第 293 行。
异常周围行的代码:
$method= $address->getShippingMethod();
$rate = $address->getShippingRateByCode($method);
if (!$this->getQuote()->isVirtual() && (!$method || !$rate)) {
Mage::throwException($helper->__('Please specify a shipping method.'));
}
有人知道我为什么会收到这个错误吗?是因为无法加载速率吗? (产品不是虚拟的)
【问题讨论】:
-
我想我最近遇到了类似的问题。看看 Vinai Kopp 的代码如何create an order programmatically。乍一看,关于运输方式的主要区别在于,他在收取运费之前还打电话给
setCollectShippingRates(true)...也许你可以试试这个... -
我也有同样的问题。任何帮助将不胜感激。谢谢。