Мне нужно изменить рабочий процесс Magento по умолчанию. Поэтому я должен автоматически создавать доставку, как только покупатели покупают что-нибудь (когда клиенты видят страницу «Получение»). Я не уверен, с чего начать. Я начал заниматься поиском в Интернете, но пока не повезло. Вот почему я пришел сюда. Кто-нибудь есть идея, где я могу начать решение этой проблемы? Благодаря!
Вы никогда не должны ставить этот вид кода в файлы вида. Помимо того, что это была плохая практика в целом, как упоминал @ user2729065: если клиент не вернется на страницу благодарности после оплаты, код не будет запущен. Лучше создать пользовательский модуль с наблюдателем. Для этого добавьте следующий код в ваш файл etc / config.xml:
<global> <events> <sales_order_invoice_pay> <observers> <[my]_[module]_automatically_complete_order> <class>[module]/observer</class> <method>automaticallyShipCompleteOrder</method> </[my]_[module]_automatically_complete_order> </observers> </sales_order_invoice_pay> </events> </global>
Измените my_module на ваше имя модуля. Это будет тригер при оплате счета.
Затем создайте Observer в My / Module / Model / Observer.php
<?php class My_Module_Model_Observer { /** * Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData()); * protected $_eventPrefix = 'sales_order'; * protected $_eventObject = 'order'; * event: sales_order_invoice_pay */ public function automaticallyShipCompleteOrder($observer) { $order = $observer->getEvent()->getInvoice()->getOrder(); if ($order->getState() == Mage_Sales_Model_Order::STATE_PROCESSING) { try { $shipment = $order->prepareShipment(); $shipment->register(); $order->setIsInProcess(true); $order->addStatusHistoryComment('Shippment automatically created.', false); Mage::getModel('core/resource_transaction') ->addObject($shipment) ->addObject($shipment->getOrder()) ->save(); } catch (Exception $e) { $order->addStatusHistoryComment('Could not automaticly create shipment. Exception message: '.$e->getMessage(), false); $order->save(); } } return $this; }
}
Это проверит, остается ли заказ в обработке (состояние, которое оно получает после того, как оно оплачено). И если да, попробуйте создать отгрузку. После того, как отгрузка будет создана, заказ автоматически изменит свое состояние на завершенное.
Если вы хотите, чтобы отправка была создана сразу после размещения заказа (до создания и оплаты счета-фактуры), измените
<sales_order_invoice_pay>
в
<sales_order_place_after>
в config.xml. И поскольку этот наблюдатель возвращает заказ, а не счет-фактуру, также меняются:
$order = $observer->getEvent()->getInvoice()->getOrder();
в
$order = $observer->getEvent()->getOrder();
Код основан на примере из Inchoo, поэтому большинство кредитов идут к ним.
Я нашел решение. Я думаю, это не лучший способ сделать это, но он работает.
В файле your_theme_name / template / checkout / success.phtml
добавить этот код
<?php $orderId = Mage::getSingleton('checkout/session')->getLastRealOrderId(); $order = Mage::getModel('sales/order') -> loadByIncrementId($orderId); if ($order -> canShip()) { $itemQty = $order -> getItemsCollection() -> count(); $shipment = Mage::getModel('sales/service_order', $order) -> prepareShipment($itemQty); $shipment = new Mage_Sales_Model_Order_Shipment_Api(); $shipmentId = $shipment -> create($orderId); } ?>
Это добавит доставку для заказа на странице получения.
Поставить код в шаблон – очень плохая идея: он добавляет код доставки в ваш шаблон / представление. Эта функциональность там не существует. (Например: если платеж подтвержден через 5 минут, он не работает).
Решение состоит в том, чтобы написать Наблюдателю событие Payment-Success: http://inchoo.net/ecommerce/magento/magento-orders/automatically-invoice-ship-complete-order-in-magento/