ฉันจะให้มันยิง ลองดูทีละอัน:
วิธีที่ 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
ฉันหวังว่าจะช่วย