Ich versuche es mal. Nehmen wir sie nacheinander:
Methode 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
Oben wird aus der Klasse geladen Mage_Sales_Model_Convert_Order
, die einen Core-Helper verwendet, der aufgerufen wird copyFieldset
, um Bestelldetails in ein Sendungsobjekt zu kopieren. $ order muss vom Typ array oder sein Varien_Object
.
Diese Methode bildet den Kern von Methode 3, wie sie Mage::getModel('sales/convert_order')
in ihrem Konstruktoraufruf verwendet wird.
Hauptunterscheidungsmerkmal dieser Methode: Sie kann ein Array oder ein Objekt aufnehmen $order
und ein Basisobjekt generieren $shipment
. Es handelt sich um eine Methode auf niedrigerer Ebene, die ausschließlich von den Methoden verwendet wird, die Sie in Methode 2, Methode 3 beschrieben haben.
Methode 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Dies scheint die beliebteste Methode im Kern von Magento zu sein, um eine Sendung zu generieren, da sie sowohl in Sendungs- als auch in Rechnungsprüfern verwendet wird. $order
wird als Konstruktorargument für die Instanziierung von verwendet Mage_Sales_Model_Service_Order
und als geschützte Eigenschaft für das Objekt festgelegt.
Dann rufst du an prepareShipment
und übergibst eine Menge. Da diese Methode die Konverterklasse von Methode 1 verwendet, müssen Sie in dem hier mit aufgerufenen Argument keine weiteren Details angeben, z . Um dies in Ihrem eigenen Kontext zu verwenden, müssen Sie lediglich die Anzahl der Elemente in einem Array mit dem folgenden Format übergeben:prepareShipment
$this->_getItemQtys
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Das wichtigste Unterscheidungsmerkmal dieser Methode: Sie erhalten ein $ -Versandobjekt zurück, auf dem jedoch alle Elemente konvertiert sind. Es ist Plug-and-Play.
Methode 3
Ich konnte keine Beweise für die Verwendung dieser Methode im Core finden. Es sieht aus wie ein Hack, um ehrlich zu sein. Hier ist die Methode:
$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);
Schritt 1 entspricht genau der obigen Methode 2. Kein Unterschied. Sie erhalten jedoch ein $shipment
Objekt zurück, das durch eine direkte Insantiation von ersetzt wird Mage_Sales_Model_Order_Shipment_Api
. Dies ist kein Standard. Die beste Methode zum Abrufen eines Versand-API-Objekts ist der Aufruf Mage::getModel('sales/order_shipment_api')
.
Anschließend wird dieses überschriebene neue Versand-API-Objekt verwendet, um einen Versand aus einer $orderId
Variablen zu erstellen , die in Ihrem Code nicht definiert wurde. Auch dies scheint eine Problemumgehung zu sein.
Auf den ersten Blick Mage_Sales_Model_Order_Shipment_Api::create()
scheint es ein One-Stop-Shop für das Generieren einer Sendung zu sein, da die grundlegendsten Details, die zum Erstellen der Sendung benötigt werden, nur eine Bestellung sind increment_id
.
Dies ist ein Hack, der von keinem Modul oder keiner Erweiterung verwendet werden sollte. Diese API soll von Funktionen genutzt werden, die über XML-RPC / SOAP-API-Anforderungen verfügbar gemacht werden, und ist absichtlich grundlegend, um API-Anforderungen mit mehreren Schritten zu eliminieren.
Schließlich kommt Methode 3 jedoch auf den Punkt und ruft über einen Aufruf von Mage_Sales_Model_Order auf prepareShipment
, was eine Abstraktion höherer Ordnung für die bekannte Methode 2 oben ist:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Hauptunterscheidungsmerkmal hier - wenn Sie eine Sendung benötigen, keine Hacks und nur eine increment_id haben - verwenden Sie diese Methode. Auch nützliche Informationen, wenn Sie dies lieber über die SOAP-API erledigen möchten.
Ich hoffe das hilft.