Magento: Créer un programme en arrière-plan code

J'essaie de créer une commande dans le backend de Magento (1.5.1.0).

Voici un 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();
}

J'ai toujours de l'exception "s'il vous Plaît spécifier une méthode d'expédition." dans Mage_Sales_Model_Service_Quote::_validate dans la lignée 293.

Code de l'lignes autour de l'exception:

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

Quelqu'un sait pourquoi j'ai cette erreur? Est-ce parce que le taux n'a pas pu être chargé?
(Le produit n'est pas virtuel)

  • Je pense que j'ai récemment eu un problème similaire. Regarder le code de Vinai Kopp comment créer un bon de commande par programmation. Sur un premier point de vue, la principale différence concerne le mode d'expédition est qu'il appelle aussi setCollectShippingRates(true) avant de recueillir les tarifs d'expédition... Peut-être vous pouvez essayer ce...
  • J'ai le même problème ici, trop. Toute aide serait très appréciée. thx.
InformationsquelleAutor michiruf | 2011-07-15