Je vais tenter le coup. Prenons-les un à la fois:
Méthode 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
ci-dessus est chargé à partir de la classe Mage_Sales_Model_Convert_Order
, qui utilise un assistant principal appelé copyFieldset
pour copier les détails de la commande dans un objet d'expédition. $ order doit être de type array ou Varien_Object
.
Cette méthode est en réalité au cœur de la méthode 3, comme elle l’utilise Mage::getModel('sales/convert_order')
dans son appel de constructeur.
Différenciateur clé de cette méthode - il peut prendre un tableau ou un objet $order
et générer un $shipment
objet de base . Il s'agit d'une méthode de niveau inférieur utilisée exclusivement par les méthodes que vous avez décrites dans Méthode 2, Méthode 3.
Méthode 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Cela semble être le moyen le plus populaire dans le noyau de Magento de générer un envoi tel qu'il est utilisé à la fois dans les contrôleurs d'envoi et de facturation. $order
est utilisé comme argument de constructeur pour l'instanciation de Mage_Sales_Model_Service_Order
, en le définissant comme une propriété protégée sur l'objet.
Vous appelez prepareShipment
et passez une quantité. Comme cette méthode utilise la classe de convertisseur de la Méthode 1, vous n'avez pas besoin de spécifier plus de détails, tels que les éléments de commande, les détails de quantité d'envoi d'articles dans l' prepareShipment
argument, appelé ici avec $this->_getItemQtys
. Pour l'utiliser dans votre propre contexte, il vous suffit de transmettre la quantité d'éléments d'un tableau au format suivant:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Différenciateur clé de cette méthode - il vous restitue un objet $ shipping, mais avec tous les éléments convertis. C'est plug-and-play.
Méthode 3
Je n'ai pas pu trouver la preuve de l'utilisation de cette méthode dans le Core. Cela ressemble à un bidouillage, pour être honnête. Voici la méthode:
$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);
L'étape 1 est identique à la méthode 2 ci-dessus. Aucune différence. Cependant, vous récupérez un $shipment
objet, qui est remplacé par une insantiation directe de Mage_Sales_Model_Order_Shipment_Api
. Ceci est non standard. La meilleure façon d'obtenir un envoi Api Object serait d'appeler Mage::getModel('sales/order_shipment_api')
.
Ensuite, il utilise cet nouvel objet API d'envoi, écrasé, pour créer un envoi à partir d'une $orderId
variable qui n'a pas été définie dans votre code. Encore une fois, cela semble être une solution de contournement.
En regardant Mage_Sales_Model_Order_Shipment_Api::create()
, cela semble être un guichet unique pour générer un envoi, car les détails les plus élémentaires nécessaires pour créer l'envoi ne sont qu'une commande increment_id
.
C'est un hack qui ne devrait pas être utilisé par aucun module ou extension. Cette API est censée être utilisée par les fonctionnalités exposées via les requêtes d'API XML RPC / SOAP et est intentionnellement de base pour éliminer les requêtes d'API à plusieurs étapes.
La méthode 3 finit par atteindre le plus concret, cependant, et via un appel à Mage_Sales_Model_Order, elle appelle prepareShipment
, ce qui est une abstraction d’ordre supérieur pour la méthode habituelle 2 ci-dessus:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Différenciateur clé ici - si vous avez besoin d'un envoi, que cela ne vous dérange pas et que vous n'ayez qu'un incrément_id - utilisez cette méthode. Également des informations utiles si vous préférez gérer cela via l'API SOAP.
J'espère que ça aide.