Lo intentaré. Tomemos uno a la vez:
Método 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
arriba se carga desde la clase Mage_Sales_Model_Convert_Order
, que utiliza un asistente central llamado copyFieldset
para copiar los detalles del pedido en un objeto de envío. $ order tiene que ser de tipo array o Varien_Object
.
Este método es realmente el núcleo del Método 3, ya que utiliza Mage::getModel('sales/convert_order')
en su llamada de constructor.
Diferenciador clave de este método: puede tomar una matriz o un objeto$order
y generar un $shipment
objeto básico . Es un método de nivel inferior utilizado exclusivamente por los métodos que expuso en el Método 2, Método 3.
Método 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Esta parece ser la forma más popular en el núcleo de Magento de generar un envío, ya que se utiliza tanto en los controladores de envío como en los de factura. $order
se utiliza como argumento constructor para la instanciación de Mage_Sales_Model_Service_Order
, configurándolo como una propiedad protegida en el objeto.
Entonces estás llamando prepareShipment
y pasando una cantidad. Como este método usa la clase de convertidor del Método 1, no necesita especificar más detalles, como que los artículos de pedido pasen los detalles de cantidad de envío del artículo en el prepareShipment
argumento, llamado aquí con $this->_getItemQtys
. Para usar esto en su propio contexto, todo lo que necesita hacer es pasar la cantidad de elementos en una matriz con el siguiente formato:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Diferenciador clave de este método: le devuelve un objeto de envío $, pero con todos los artículos convertidos en él. Es plug-and-play.
Método 3
No pude encontrar evidencia de uso de este método en el Core. Parece un truco, para ser honesto. Aquí está el método:
$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);
El paso 1 es exactamente el mismo que el Método 2 anterior. Ninguna diferencia. Sin embargo, recupera un $shipment
objeto, que se reemplaza por una insaciación directa de Mage_Sales_Model_Order_Shipment_Api
. Esto no es estándar. La mejor forma de obtener un objeto Api de envío sería llamarMage::getModel('sales/order_shipment_api')
.
A continuación, utiliza ese nuevo objeto API de envío sobrescrito para crear un envío a partir de una $orderId
variable que no se ha definido en su código. Nuevamente, esto parece una solución alternativa.
Mirando Mage_Sales_Model_Order_Shipment_Api::create()
, parece una ventanilla única para generar un envío, ya que los detalles más básicos necesarios para crear el envío son solo un pedido increment_id
.
Este es un truco que no debe ser utilizado por ningún módulo o extensión. Esta API está destinada a ser consumida por características expuestas a través de solicitudes API XML RPC / SOAP y es intencionalmente básica para eliminar solicitudes API de pasos múltiples.
Eventualmente, el Método 3 llega a lo esencial, y a través de una llamada a Mage_Sales_Model_Order, llama prepareShipment
, que es una abstracción de orden superior para el conocido Método 2 anterior:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Diferenciador clave aquí : si necesita un envío, no le importen los hacks y solo tenga un increment_id, use este método. También información útil si prefiere manejar esto a través de la API SOAP.
Espero que eso ayude.