Я пострілю. Давайте візьмемо їх по одному:
Спосіб 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
вище завантажується з класу Mage_Sales_Model_Convert_Order
, який використовує основний помічник, викликаний copyFieldset
для копіювання реквізитів замовлення в об'єкт відвантаження. $ order має бути типу масиву або Varien_Object
.
Цей метод насправді лежить в основі методу 3, як він використовується Mage::getModel('sales/convert_order')
у своєму виклику конструктора.
Ключовий диференціатор цього методу - він може приймати масив або об’єкт $order
і генерувати базовий $shipment
об'єкт. Це метод нижчого рівня, який використовується виключно методами, викладеними у 2-му методі 3.
Спосіб 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Це, мабуть, є найпопулярнішим способом створення Magento Core для генерації вантажу, оскільки він використовується як у контролерах відвантаження, так і в рахунках-фактурах. $order
використовується як аргумент конструктора до інстанції Mage_Sales_Model_Service_Order
, встановлення його як захищеного властивості на об'єкті.
Потім ви телефонуєте prepareShipment
та передаєте кількість. Оскільки в цьому методі використовується клас перетворювача з Методу 1, вам не потрібно вказувати більше деталей, наприклад, пункти замовлення передають кількість деталей відправлення товару в prepareShipment
аргументі, викликаному тут $this->_getItemQtys
. Щоб використовувати це у власному контексті, все, що вам потрібно зробити, - це передати кількість елементів у масиві у такому форматі:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Ключовий диференціатор цього методу - він повертає вам об’єкт відвантаження $, але з усіма предметами, перетвореними на ньому. Це підключення.
Спосіб 3
Я не зміг знайти доказів використання цього методу в Core. Якщо чесно, це схоже на злом. Ось метод:
$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);
Крок 1 точно такий же, як і спосіб 2 вище. Без різниці. Однак ви отримуєте назад $shipment
об'єкт, який замінюється прямим ненасиченням Mage_Sales_Model_Order_Shipment_Api
. Це нестандартно. Найкращим способом отримання об'єкта Api для відвантаження було б зателефонувати Mage::getModel('sales/order_shipment_api')
.
Далі він використовує перезаписаний новий об'єкт API відвантаження для створення відправлення зі $orderId
змінної, яка не визначена у вашому коді. Знову ж таки, це здається вирішенням проблеми.
Дивлячись на Mage_Sales_Model_Order_Shipment_Api::create()
це, здається, що це єдине вікно для створення вантажу, оскільки основні деталі, необхідні для створення вантажу, - це лише замовлення increment_id
.
Це злом, який не повинен використовувати жоден модуль чи розширення. Цей API призначений для використання функцій, відкритих через запити API XML RPC / SOAP, і навмисно є базовим для усунення декількох крокових запитів API.
Врешті-решт, метод 3 потрапляє до азотно-зернистого, і через дзвінок до Mage_Sales_Model_Order він викликає prepareShipment
, що є абстракцією вищого порядку для звичного вищевказаного Методу 2:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Ключовий диференціатор тут - якщо вам потрібна відправка, не забувайте про злами, а маєте лише приріст_id - використовуйте цей метод. Також корисна інформація, якщо ви хочете обробляти це через API SOAP.
Я сподіваюся, що це допомагає.