我会试一试。让我们一次带他们一个:
方法1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
上面的代码是从类加载的,该类Mage_Sales_Model_Convert_Order
使用一个称为的核心帮助copyFieldset
程序将订单详细信息复制到装运对象中。$ order必须是array或类型Varien_Object
。
此方法实际上是方法3的核心,因为它Mage::getModel('sales/convert_order')
在其构造函数调用中使用。
此方法的主要区别 -可以采用数组或对象$order
并生成基本$shipment
对象。它是您在方法2,方法3中提出的方法专用的低级方法。
方法2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
这似乎是Magento的Core中最常用的生成货件的方式,因为它同时用于Shipment和Invoice控制器中。$order
用作实例化的构造函数参数,并将其Mage_Sales_Model_Service_Order
设置为对象的受保护属性。
然后prepareShipment
,您要调用并传递数量。由于此方法使用方法1中的转换器类,因此您无需在prepareShipment
参数中指定更多详细信息,例如定单项传递物料装运数量详细信息,此处用调用$this->_getItemQtys
。要在您自己的上下文中使用此功能,您需要做的就是以下列格式在数组中传递项目数量:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
此方法的主要区别 -它给您$ shipment对象,但是所有项目都已转换。即插即用。
方法3
我找不到在Core中使用此方法的证据。老实说,这看起来像是骇客。方法如下:
$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);
步骤1与上面的方法2完全相同。没有不同。但是,您将获得一个$shipment
对象,该对象将由的直接实例替换Mage_Sales_Model_Order_Shipment_Api
。这是非标准的。获取货运Api对象的最佳实践方法是致电Mage::getModel('sales/order_shipment_api')
。
接下来,它使用该覆盖的新的Shipment API对象根据$orderId
代码中未定义的变量创建货运。同样,这似乎是一种解决方法。
看起来Mage_Sales_Model_Order_Shipment_Api::create()
,这就像生成货物的一站式服务,因为创建货物所需的最基本的细节只是订单increment_id
。
这是任何模块或扩展都不应该使用的hack。该API旨在通过XML RPC / SOAP API请求公开的功能使用,并且故意消除多步API请求。
最终,方法3进入实质,并通过调用Mage_Sales_Model_Order调用prepareShipment
,这是上面熟悉的方法2的更高阶抽象:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
此处的主要区别 -如果您需要装运,请不要介意骇客,并且只有一个cremental_id-请使用此方法。如果您更愿意通过SOAP API处理此信息,则也很有用。
希望对您有所帮助。