Ci proverò. Prendiamoli uno alla volta:
Metodo 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
sopra viene caricato dalla classe Mage_Sales_Model_Convert_Order
, che utilizza un helper principale chiamato copyFieldset
per copiare i dettagli dell'ordine in un oggetto di spedizione. $ order deve essere di tipo array o Varien_Object
.
Questo metodo è in realtà al centro del Metodo 3, come viene utilizzato Mage::getModel('sales/convert_order')
nella sua chiamata del costruttore.
Differenziatore chiave di questo metodo: può prendere un array o un oggetto $order
e generare un $shipment
oggetto di base . È un metodo di livello inferiore utilizzato esclusivamente dai metodi indicati nel Metodo 2, Metodo 3.
Metodo 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Questo sembra essere il modo più popolare nel Core di Magento di generare una spedizione in quanto viene utilizzato sia nei controller di spedizione che in quelli di fatturazione. $order
viene utilizzato come argomento del costruttore per l'istanza di Mage_Sales_Model_Service_Order
, impostandolo come proprietà protetta sull'oggetto.
Stai quindi chiamando prepareShipment
e passando una quantità. Poiché questo metodo utilizza la classe del convertitore dal Metodo 1, non è necessario specificare ulteriori dettagli come gli articoli dell'ordine passano i dettagli della quantità di spedizione prepareShipment
nell'argomento, chiamati qui con $this->_getItemQtys
. Per utilizzarlo nel proprio contesto, è sufficiente passare la quantità di articoli in un array con il seguente formato:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Differenziatore chiave di questo metodo: ti restituisce un oggetto $ shipping, ma con tutti gli articoli convertiti su di esso. È plug-and-play.
Metodo 3
Non sono riuscito a trovare prove dell'utilizzo di questo metodo nel Core. Sembra un trucco, a dire il vero. Ecco il metodo:
$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);
Il passaggio 1 è esattamente lo stesso del metodo 2 sopra. Nessuna differenza. Tuttavia, si ottiene indietro un $shipment
oggetto, che viene sostituito da un'insantiazione diretta di Mage_Sales_Model_Order_Shipment_Api
. Questo non è standard. Il modo migliore per ottenere un oggetto Api di spedizione sarebbe quello di chiamare Mage::getModel('sales/order_shipment_api')
.
Successivamente, utilizza quel nuovo oggetto API di spedizione sovrascritto per creare una spedizione da una $orderId
variabile che non è stata definita nel codice. Ancora una volta, sembra una soluzione alternativa.
Guardando Mage_Sales_Model_Order_Shipment_Api::create()
, sembra uno sportello unico per generare una spedizione poiché i dettagli di base necessari per creare la spedizione sono solo un ordine increment_id
.
Questo è un hack che non dovrebbe essere usato da nessun modulo o estensione. Questa API deve essere utilizzata da funzionalità esposte tramite richieste API XML RPC / SOAP ed è intenzionalmente di base per eliminare richieste API a più passaggi.
Alla fine, il Metodo 3 arriva al nocciolo della verità, e tramite una chiamata a Mage_Sales_Model_Order, chiama prepareShipment
, che è un'astrazione di ordine superiore per il familiare Metodo 2 sopra:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Differenziatore chiave qui - se hai bisogno di una spedizione, non preoccuparti degli hack e hai solo un increment_id - usa questo metodo. Informazioni utili anche se si preferisce gestirlo tramite l'API SOAP.
Spero che aiuti.