ฉันจะให้มันยิง ลองดูทีละอัน:
วิธีที่ 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converterด้านบนถูกโหลดจากคลาสMage_Sales_Model_Convert_Orderซึ่งใช้ผู้ช่วยหลักที่เรียกว่าcopyFieldsetคัดลอกรายละเอียดการสั่งซื้อไปยังวัตถุการจัดส่ง $ Varien_Objectสั่งซื้อจะต้องมีชนิดอาร์เรย์หรือ
วิธีนี้เป็นจริงที่เป็นแกนหลักของวิธีที่ 3 ตามที่ใช้Mage::getModel('sales/convert_order')ในการเรียกคอนสตรัคเตอร์
ความแตกต่างที่สำคัญของวิธีการนี้ - มันสามารถใช้อาร์เรย์หรือวัตถุ$orderและสร้าง$shipmentวัตถุพื้นฐาน เป็นวิธีระดับล่างที่ใช้โดยวิธีที่คุณระบุไว้ในวิธีที่ 2 วิธีที่ 3 เท่านั้น
วิธีที่ 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
นี่เป็นวิธีที่ได้รับความนิยมมากที่สุดใน Core ของ Magento ในการสร้างการจัดส่งเนื่องจากมันถูกใช้ในการควบคุมการจัดส่งและการแจ้งหนี้ $orderจะใช้เป็นอาร์กิวเมนต์ตัวสร้างเพื่อการสร้างอินสแตนซ์ของMage_Sales_Model_Service_Orderการตั้งค่าเป็นคุณสมบัติที่ได้รับการป้องกันบนวัตถุ
จากนั้นคุณโทรprepareShipmentและส่งผ่านปริมาณ ในฐานะที่เป็นวิธีการนี้ใช้คลาสแปลงจากวิธีที่ 1 คุณไม่จำเป็นต้องระบุรายละเอียดอื่น ๆ เช่นรายการสั่งซื้อผ่านรายการรายละเอียดการจัดส่งจำนวนในการโต้แย้งที่เรียกว่าที่นี่ด้วยprepareShipment $this->_getItemQtysหากต้องการใช้สิ่งนี้ในบริบทของคุณสิ่งที่คุณต้องทำคือส่งผ่านจำนวนของไอเท็มในอาร์เรย์ด้วยรูปแบบต่อไปนี้:
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
ความแตกต่างหลักของวิธีนี้ - มันให้คุณคืนออบเจค $ การส่งมอบ แต่ด้วยรายการทั้งหมดที่ถูกแปลง มันเป็นแบบพลักแอนด์เพลย์
วิธีที่ 3
ฉันไม่พบหลักฐานการใช้วิธีนี้ในคอร์ ดูเหมือนว่าแฮ็คจะซื่อสัตย์ นี่คือวิธีการ:
$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วัตถุซึ่งจะถูกแทนที่ด้วย insantiation 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
นี่คือแฮ็คที่ไม่ควรใช้โดยโมดูลหรือส่วนขยายใด ๆ API นี้มีไว้เพื่อให้ใช้งานโดยฟีเจอร์ที่เปิดเผยผ่านคำขอ XML RPC / SOAP API และเป็นพื้นฐานในการกำจัดคำขอ API ขั้นตอนหลายขั้น
ในที่สุดวิธีที่ 3 ไปถึง nitty-gritty แม้ว่าและผ่านการเรียกไปที่ Mage_Sales_Model_Order มันจะเรียกprepareShipmentซึ่งเป็นนามธรรมที่สูงกว่าสำหรับวิธีที่คุ้นเคย 2 ข้างต้น:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
ผู้แตกต่างหลักที่นี่ - หากคุณต้องการการจัดส่งไม่ต้องแฮ็กแฮ็คและมี increment_id เท่านั้น - ใช้วิธีนี้ นอกจากนี้ยังมีข้อมูลที่เป็นประโยชน์หากคุณต้องการจัดการผ่าน SOAP API
ฉันหวังว่าจะช่วย