Я сделаю это. Давайте возьмем их по одному:
Способ 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
выше загружен из класса Mage_Sales_Model_Convert_Order
, который использует основной помощник, вызываемый copyFieldset
для копирования деталей заказа в объект отгрузки. $ order должен иметь тип array или 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
)
Ключевой отличительный признак этого метода - он возвращает вам объект $ shipment, но со всеми предметами, преобразованными на нем. Это подключи и играй.
Способ 3
Я не смог найти доказательств использования этого метода в ядре. Похоже, взломать, если честно. Вот метод:
$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 предназначен для использования функциями, предоставляемыми через запросы XML RPC / SOAP API, и является намеренно базовым для устранения многоэтапных запросов API.
В конце концов, метод 3 доходит до мелочей, однако и через вызов Mage_Sales_Model_Order он вызывает prepareShipment
, что является абстракцией высшего порядка для знакомого метода 2 выше:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Ключевой отличительный признак здесь - если вам нужна пересылка, не возражайте против взлома, и у вас есть только increment_id - используйте этот метод. Также полезная информация, если вы предпочитаете обрабатывать это через SOAP API.
Надеюсь, это поможет.