Saya akan mencobanya. Mari kita ambil satu per satu:
Metode 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
di atas diambil dari kelas Mage_Sales_Model_Convert_Order
, yang menggunakan penolong inti yang dipanggil copyFieldset
untuk menyalin detail pesanan ke objek pengiriman. $ order harus bertipe array atau Varien_Object
.
Metode ini sebenarnya merupakan inti dari Metode 3, seperti yang digunakan Mage::getModel('sales/convert_order')
dalam panggilan konstruktornya.
Diferensiator kunci dari metode ini - dapat mengambil array atau objek $order
dan menghasilkan $shipment
objek dasar . Ini adalah metode tingkat rendah yang digunakan secara eksklusif oleh metode yang Anda ajukan dalam Metode 2, Metode 3.
Metode 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Ini sepertinya menjadi cara yang paling populer di Magento's Core menghasilkan kiriman karena digunakan di pengontrol Pengiriman dan Faktur. $order
digunakan sebagai argumen konstruktor ke instantiation Mage_Sales_Model_Service_Order
, menetapkannya sebagai properti yang dilindungi pada objek.
Anda kemudian menelepon prepareShipment
dan memberikan kuantitas. Karena metode ini menggunakan kelas konverter dari Metode 1, Anda tidak perlu menentukan detail lebih lanjut seperti item pesanan melewati detail pengiriman barang dalam prepareShipment
argumen, yang disebut di sini dengan $this->_getItemQtys
. Untuk menggunakan ini pada konteks Anda sendiri, yang perlu Anda lakukan adalah meneruskan jumlah item dalam array dengan format berikut:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Pembeda utama dari metode ini - ia memberi Anda objek pengiriman $, tetapi dengan semua item dikonversi di dalamnya. Ini plug-and-play.
Metode 3
Saya tidak dapat menemukan bukti menggunakan metode ini di Core. Sejujurnya seperti retasan. Inilah metodenya:
$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);
Langkah 1 persis sama dengan Metode 2 di atas. Tidak ada perbedaan. Namun, Anda mendapatkan kembali $shipment
objek, yang diganti dengan insantiasi langsung Mage_Sales_Model_Order_Shipment_Api
. Ini tidak standar. Cara terbaik untuk mendapatkan kiriman objek Api adalah dengan menelepon Mage::getModel('sales/order_shipment_api')
.
Selanjutnya, ia menggunakan objek API Pengiriman baru yang ditimpa itu untuk membuat pengiriman dari $orderId
variabel yang belum didefinisikan dalam kode Anda. Sekali lagi, ini tampak seperti solusi.
Melihat Mage_Sales_Model_Order_Shipment_Api::create()
, sepertinya toko serba ada untuk menghasilkan kiriman karena detail paling dasar yang diperlukan untuk membuat kiriman hanya pesanan increment_id
.
Ini adalah retasan yang tidak boleh digunakan oleh modul atau ekstensi apa pun. API ini dimaksudkan untuk dikonsumsi oleh fitur yang diekspos melalui permintaan API XML RPC / SOAP dan sengaja dibuat untuk menghilangkan beberapa permintaan API langkah.
Akhirnya Metode 3 sampai ke seluk-beluk, meskipun, dan melalui panggilan ke Mage_Sales_Model_Order, itu panggilan prepareShipment
, yang merupakan abstraksi tingkat tinggi untuk Metode 2 yang akrab di atas:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Diferensiator utama di sini - jika Anda memerlukan kiriman, jangan pedulikan peretasan, dan hanya ada increment_id - gunakan metode ini. Juga informasi yang berguna jika Anda lebih suka menangani ini melalui API SOAP.
Saya harap itu membantu.