Tôi sẽ cho nó một viên đạn. Chúng ta hãy đưa họ từng cái một:
Phương pháp 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
ở trên được tải từ lớp Mage_Sales_Model_Convert_Order
, trong đó sử dụng một trình trợ giúp cốt lõi được gọi copyFieldset
để sao chép chi tiết đơn hàng vào một đối tượng giao hàng. $ order phải là kiểu mảng hoặc Varien_Object
.
Phương thức này thực sự là cốt lõi của Phương thức 3, vì nó sử dụng Mage::getModel('sales/convert_order')
trong lệnh gọi hàm tạo của nó.
Khác biệt chính của phương pháp này - nó có thể lấy một mảng hoặc một đối tượng $order
và tạo ra một $shipment
đối tượng cơ bản . Đó là một phương thức cấp thấp hơn được sử dụng riêng cho các phương pháp bạn đưa ra trong Phương pháp 2, Phương pháp 3.
Phương pháp 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Đây dường như là cách phổ biến nhất trong Lõi của Magento trong việc tạo ra một lô hàng vì nó được sử dụng trong cả hai bộ điều khiển Lô hàng và Hóa đơn. $order
được sử dụng làm đối số của hàm tạo để khởi tạo Mage_Sales_Model_Service_Order
, đặt nó làm thuộc tính được bảo vệ trên đối tượng.
Sau đó, bạn đang gọi prepareShipment
và chuyển một số lượng. Vì phương thức này sử dụng lớp trình chuyển đổi từ Phương thức 1, nên bạn không cần chỉ định thêm chi tiết, chẳng hạn như các mục đơn hàng vượt qua lô hàng qty chi tiết trong prepareShipment
đối số, được gọi ở đây với $this->_getItemQtys
. Để sử dụng điều này trên ngữ cảnh của riêng bạn, tất cả những gì bạn cần làm là chuyển số lượng mục trong một mảng với định dạng sau:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Khác biệt chính của phương pháp này - nó mang lại cho bạn một đối tượng lô hàng $, nhưng với tất cả các mục được chuyển đổi trên nó. Đó là plug-and-play.
Phương pháp 3
Tôi không thể tìm thấy bằng chứng về việc sử dụng phương pháp này trong Core. Nó trông giống như một hack, thành thật mà nói. Đây là phương pháp:
$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);
Bước 1 hoàn toàn giống như Phương pháp 2 ở trên. Không khác nhau. Tuy nhiên, bạn nhận lại một $shipment
đối tượng, được thay thế bằng cách đặt trực tiếp vào Mage_Sales_Model_Order_Shipment_Api
. Đây là không chuẩn. Cách thực hành tốt nhất để nhận một đối tượng Api giao hàng sẽ là gọi Mage::getModel('sales/order_shipment_api')
.
Tiếp theo, nó sử dụng đối tượng API Lô hàng mới được ghi đè để tạo một lô hàng từ một $orderId
biến chưa được xác định trong mã của bạn. Một lần nữa, điều này có vẻ như một cách giải quyết.
Nhìn vào Mage_Sales_Model_Order_Shipment_Api::create()
, có vẻ như một cửa hàng duy nhất để tạo ra một lô hàng vì các chi tiết cơ bản nhất cần thiết để tạo ra lô hàng chỉ là một đơn đặt hàng increment_id
.
Đây là một hack không nên được sử dụng bởi bất kỳ mô-đun hoặc phần mở rộng. API này có nghĩa là được sử dụng bởi các tính năng được hiển thị thông qua các yêu cầu API RPC / SOAP của XML và là cơ bản cố ý để loại bỏ các yêu cầu API nhiều bước.
Cuối cùng, Phương thức 3 nhận được nitty-gritty, và thông qua một cuộc gọi đến Mage_Sales_Model_Order, nó gọi prepareShipment
, đó là một sự trừu tượng hóa bậc cao hơn cho Phương thức 2 quen thuộc ở trên:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Khác biệt chính ở đây - nếu bạn cần một lô hàng, đừng bận tâm đến việc hack và chỉ có gia tăng_id - hãy sử dụng phương pháp này. Ngoài ra thông tin hữu ích nếu bạn muốn xử lý việc này thông qua API SOAP.
Tôi hy vọng điều đó sẽ giúp.