Spróbuję. Weźmy je pojedynczo:
Metoda 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
powyżej jest ładowany z klasy Mage_Sales_Model_Convert_Order
, która korzysta z pomocnika rdzenia wywoływanego copyFieldset
do kopiowania szczegółów zamówienia do obiektu wysyłki. $ order musi być typu tablica lub Varien_Object
.
Ta metoda jest właściwie rdzeniem metody 3, ponieważ jest używana Mage::getModel('sales/convert_order')
w wywołaniu konstruktora.
Kluczowy wyróżnik tej metody - może pobrać tablicę lub obiekt $order
i wygenerować $shipment
obiekt podstawowy . Jest to metoda niższego poziomu używana wyłącznie przez metody przedstawione w Metodzie 2, Metodzie 3.
Metoda 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Wydaje się, że jest to najpopularniejszy sposób generowania przesyłki w rdzeniu Magento, ponieważ jest ona używana zarówno w kontrolerach przesyłek, jak i fakturach. $order
jest używany jako argument konstruktora do wystąpienia Mage_Sales_Model_Service_Order
, ustawiając go jako chronioną właściwość obiektu.
Następnie dzwonisz prepareShipment
i przekazujesz ilość. Ponieważ ta metoda wykorzystuje klasę konwertera z metody 1, nie trzeba określać więcej szczegółów, takich jak zamówienie zamówienia przekazuje szczegółowe informacje dotyczące wysyłki przedmiotu w prepareShipment
argumencie, wywoływanym tutaj za pomocą $this->_getItemQtys
. Aby użyć tego we własnym kontekście, wystarczy przekazać liczbę elementów w tablicy o następującym formacie:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Kluczowy wyróżnik tej metody - daje z powrotem obiekt wysyłki $, ale z wszystkimi konwertowanymi na nim przedmiotami. To plug-and-play.
Metoda 3
Nie mogłem znaleźć dowodów na użycie tej metody w rdzeniu. Szczerze mówiąc, wygląda to na hack. Oto metoda:
$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);
Krok 1 jest dokładnie taki sam jak metoda 2 powyżej. Bez różnicy. Jednak $shipment
odzyskujesz obiekt, który jest zastępowany przez bezpośrednie insantiation of Mage_Sales_Model_Order_Shipment_Api
. To jest niestandardowe. Najlepszym sposobem na uzyskanie obiektu Api do wysyłki byłoby zadzwonienie Mage::getModel('sales/order_shipment_api')
.
Następnie używa tego zastąpionego, nowego obiektu API przesyłki do utworzenia przesyłki ze $orderId
zmiennej, która nie została zdefiniowana w kodzie. Znowu wydaje się to obejściem.
Patrząc na Mage_Sales_Model_Order_Shipment_Api::create()
to, wydaje się, że jest to punkt kompleksowej obsługi do generowania przesyłki, ponieważ najbardziej podstawowe szczegóły potrzebne do utworzenia przesyłki to tylko zamówienie increment_id
.
Jest to hack, którego nie powinien używać żaden moduł ani rozszerzenie. Ten interfejs API jest przeznaczony do korzystania z funkcji udostępnianych za pośrednictwem żądań interfejsu API RPC / SOAP XML i jest celowo podstawowy w celu wyeliminowania wieloetapowych żądań interfejsu API.
Ostatecznie jednak Metoda 3 przechodzi do drobiazgów i poprzez wywołanie Mage_Sales_Model_Order, wywołuje prepareShipment
, co jest abstrakcją wyższego rzędu dla znanej powyżej Metody 2:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Kluczowy wyróżnik tutaj - jeśli potrzebujesz przesyłki, nie przejmuj się hackami i masz tylko increment_id - skorzystaj z tej metody. Przydatne informacje, jeśli wolisz obsługiwać to za pośrednictwem interfejsu API SOAP.
Mam nadzieję że to pomogło.