Magento: Creare un ordine a livello di programmazione in backend codice

Cerco di creare un ordine nel backend di Magento (1.5.1.0).

Qui è un po ‘ di codice:

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

Ho sempre l’eccezione ‘, si Prega di specificare un metodo di spedizione.’ in Mage_Sales_Model_Service_Quote::_validate in linea 293.

Codice delle linee intorno eccezione:

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

Qualcuno di voi sa perché ricevo questo errore? È perché il tasso non può essere caricato?
(Il prodotto non è virtuale)

  • Penso che di recente ho avuto un problema simile. Guardare il codice di Vinai Kopp come creare un ordine a livello di programmazione. A prima vista, la differenza principale per quanto riguarda il metodo di spedizione è che anche lui si chiama setCollectShippingRates(true) prima di raccogliere le tariffe di spedizione… Forse si potrebbe provare questo…
  • Ho lo stesso problema anche qui. Qualsiasi aiuto sarebbe molto apprezzato. thx.
InformationsquelleAutor michiruf | 2011-07-15



2 Replies
  1. 2

    Mi risolve questo tempo fa, utilizzando un metodo di spedizione che io stesso ho creato.

    Il codice per creare l’ordine ha anche cambiato dal backend singleton un ‘frontend metodo come questo:

    //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();
    • $quote->collectTotals()->save(); strisce di carta di credito info, quindi è necessario impostare il numero di carta di credito nel preventivo solo dopo questo o il $service->submitAll() chiamata si lamenta non valido numeri di carta di credito
  2. 0

    Ho cracking la mia testa intorno a questo problema. In un certo numero di modi, a livello di programmazione la creazione dell’ordine risultati. Ho realizzato per bypassare il problema con un override del metodo _validate della classe Mage_Sales_Model_Service_Quote.

    • Io ho risolto creando un nuovo metodo di spedizione risultante ho dovuto modificare l’output per i blocchi nel frontend come bene. Questo ha funzionato per me, perché non avevo tutti i dati di spedizione ho bisogno di troppo. Vi posto la mia soluzione al di sotto, perché questo problema esisteva già al lavoro.

Lascia un commento