Автоматические покупки… футуризм?
Нет, реальность.
Очень часто разработчики сталкиваются с задачей создания «Заказа» в автоматическом режиме, примеров можно привести кучу, но это не суть важно. Есть много методов по реализации этого. Я делал это как минимум 2-мя методами, но вот нашел еще один, решил позаимствовать, конечно же со ссылочкой на источник.
Итак, перед нами задача – автоматически (программно), создать order в Magento.
Источник
Создание нового заказа(order) программного может потребоваться если Вы захотели переделать логику процесса оформления товара или Вам необходимо произвести импорт заказов с другого сайта.
При создания функции модели мы будем полностью проходить процесс checkout на клиентской части.
В данном примере я буду рассматривать создание заказа как «Гость». Для создания заказа от зарегистрированного пользователя необходимо дополнительно создать пользователя и войти им в систему.
/** * Manual create orders * * @param array $productInCardList list of product that customer add card. Structure: * [][id] => Product id in magento store * [][price] => Special price for one qty of product * [][qty] => Number of buy product * * @param array $billingAddress customer billingAddress * @param array $shippingAddress customer shippingAddress, if false use same as billing * @return int create order ID * */ public function createOrder($productInCardList, $billingAddress, $shippingAddress) { // Get checkout model $checkout = Mage::getSingleton('checkout/type_onepage'); $checkout->getCheckout()->clear(); $checkout->initCheckout(); // Customer cart items $quote = $checkout->getQuote(); // Clear asigned customer $quote->setCustomer(Mage::getModel('customer/customer')); /* ---- FOR TEST --- */ /* -- Adding testing product to card -- */ $productInCardList = array(); $productInCardList[0]['id'] = 87; $productInCardList[0]['price'] = 22; $productInCardList[0]['qty'] = 1; /* ---- FOR TEST --- */ // Adding product to customer card // All products adding by id $result = null; foreach ($productInCardList as $productItem) { $product = Mage::getModel('catalog/product')->load($productItem['id']); $product->setPrice($productItem['price']); $request = new Varien_Object(); $request->setQty($productItem['qty']); // Product exist (no error while load by ID) if ($product->getId()) { // Add product to card $result = $quote->addProduct($product, $request); if (is_string($result)) { // Error of adding product to card // @todo Log exception into DB and skip throw new Exception("Error adding product to card"); } } else { // Error of load product by id throw new Exception("Cant load product"); // @todo Log exception into DB and skip } } // Start checkout steps // STEP(1) - Checkout method guest/register $checkout->saveCheckoutMethod('guest'); //STEP(2) - Save Billing Address // vvvv -------------------- For testing - this variable get from params $billingAddress = array(); $billingAddress['firstname'] = 'Alex'; $billingAddress['lastname'] = 'SpiRi7'; $billingAddress['company'] = 'OOO'; $billingAddress['email'] = 'alexandr.otchenashev@gmail.com'; $billingAddress['street'] = array(); $billingAddress['street'][0] = "Address part 21"; $billingAddress['street'][1] = "Address part 31"; $billingAddress['city'] = "Dnepropetrovsk"; $billingAddress['region_id'] = 1; $billingAddress['region'] = ""; $billingAddress['postcode'] = "49000"; $billingAddress['country_id'] = "UA"; $billingAddress['telephone'] = "0238559322"; $billingAddress['fax'] = "0838559111"; // ^^^^ -------------------- For testing - this variable get from params if (!isset($billingAddress['telephone']) || $billingAddress['telephone'] == "") { $billingAddress['telephone'] = "0000000"; } $billingAddress['save_in_address_book'] = 0; // Save billing information $result = array(); $result = $checkout->saveBilling($billingAddress, false); if (is_array($result) && isset($result['message'])) { throw new Exception($result['message']); } if ($shippingAddress!=false) { // Save shipping address, also calculate sippings rate $result = $checkout->saveShipping($shippingAddress, false); } else { // Shipping address same as billing $result = $checkout->saveShipping($billingAddress, false); } // Select already calulated shipping method $result = $checkout->saveShippingMethod('flatrate_flatrate'); // Save payment details $result = $checkout->savePayment(array('method'=>'checkmo')); // Create order $return = array(); // for guest checkout use original method $checkout->saveOrder(); // Change order status. Create Invoice and Shipping // Get last order ID $lastOrderId = $checkout->getCheckout()->getLastOrderId(); return $lastOrderId; } /** * Create invoice for selected order * * @param int $orderId order id */ public function createInvoiceForOrder($orderId, $commentToInvoice, $notifyCustomer = false) { // Load Order $order = Mage::getModel('sales/order')->load($orderId); // Conver order to invoice $convertor = Mage::getModel('sales/convert_order'); $invoice = $convertor->toInvoice($order); /* @var $orderItem Mage_Sales_Model_Order_Item */ foreach ($order->getAllItems() as $orderItem) { if (!$orderItem->isDummy() && !$orderItem->getQtyToInvoice() && $orderItem->getLockedDoInvoice()) { continue; } if ($order->getForcedDoShipmentWithInvoice() && $orderItem->getLockedDoShip()) { continue; } $item = $convertor->itemToInvoiceItem($orderItem); if ($orderItem->isDummy()) { $qty = 1; } else { $qty = $orderItem->getQtyToInvoice(); } $item->setQty($qty); $invoice->addItem($item); } $invoice->collectTotals(); /* Text, Need Notify customer */ $invoice->addComment($commentToInvoice, $notifyCustomer); $invoice->register(); $invoice->getOrder()->setIsInProcess(true); $transactionSave = Mage::getModel('core/resource_transaction') ->addObject($invoice) ->addObject($invoice->getOrder()); $transactionSave->save(); } public function createShippingForOrder($orderId, $commentToShipping, $notifyCustomer = false) { // Load Order $order = Mage::getModel('sales/order')->load($orderId); /** * Check shipment create availability */ if (!$order->canShip()) { return false; } // Convert order to shipping $convertor = Mage::getModel('sales/convert_order'); $shipment = $convertor->toShipment($order); foreach ($order->getAllItems() as $orderItem) { if (!$orderItem->isDummy(true) && !$orderItem->getQtyToShip()) { continue; } if ($orderItem->getIsVirtual()) { continue; } $item = $convertor->itemToShipmentItem($orderItem); if ($orderItem->isDummy(true)) { $qty = 1; } else { $qty = $orderItem->getQtyToShip(); } $item->setQty($qty); $shipment->addItem($item); } $shipment->register(); if ($commentToShipping!='') { $shipment->addComment($commentToShipping, $notifyCustomer); } $shipment->getOrder()->setIsInProcess(true); $transactionSave = Mage::getModel('core/resource_transaction') ->addObject($shipment) ->addObject($shipment->getOrder()) ->save(); } |
Обратите внимание на два дополнительных метода – createInvoiceForOrder и createShippingForOrder. Эти методы позволяют создать Invoice и Shipping для созданного заказа.
Метод $checkout->saveShippingMethod(‘flatrate_flatrate’); производит уcтановку метода доставки используемого при checkout. Вы можете установить другой метод, или создать собственный.
Например если Вам необходимо использовать метод доставки с произвольным описанием и ценой, данные в него можно передавать используя сессию.
Похожие Magento-статьи:
- Групповой продукт – показ картинок из привязанных продуктов
- Создание Shipping Method Module – часть 1, заглушка
- Как отправить письмо в Magento?
- Наворачиваем свой модуль. Вывод коллекции данных в грид.
- Создание нового модуля с нуля.
- SEO оптимизация поисковых урлов в Magento
- Простой пример кода начинающим разработчикам













