मैं इसे एक शॉट दूँगा। चलो उन्हें एक समय में एक लेते हैं:
विधि 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));
यह शिपमेंट बनाने के 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वस्तु वापस मिल जाती है, जिसे प्रत्यक्ष बीमा के द्वारा बदल दिया जाता है Mage_Sales_Model_Order_Shipment_Api। यह अमानक है। शिपमेंट एपि वस्तु प्राप्त करने का सबसे अच्छा तरीका है कॉल करना Mage::getModel('sales/order_shipment_api')।
इसके बाद, यह उस $orderIdचर का उपयोग करता है, जो कि आपके कोड में परिभाषित नहीं किए गए चर से शिपमेंट बनाने के लिए नई शिपमेंट एपीआई ऑब्जेक्ट है । फिर, यह एक समाधान की तरह लगता है।
देखते हुए Mage_Sales_Model_Order_Shipment_Api::create(), यह एक शिपमेंट को उत्पन्न करने के लिए वन-स्टॉप-शॉप की तरह लगता है क्योंकि शिपमेंट बनाने के लिए आवश्यक सबसे बुनियादी विवरण केवल एक आदेश है increment_id।
यह एक हैक है जिसे किसी भी मॉड्यूल या एक्सटेंशन द्वारा उपयोग नहीं किया जाना चाहिए। यह एपीआई XML RPC / SOAP एपीआई अनुरोधों के माध्यम से उजागर होने वाली सुविधाओं से भस्म होने के लिए है और कई कदम एपीआई अनुरोधों को खत्म करने के लिए जानबूझकर बुनियादी है।
आखिरकार मेथड 3 मे नॉटी-ग्रिट्टी हो जाता है, हालांकि, और 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 के माध्यम से इसे संभालना पसंद करते हैं।
मुझे आशा है कि वह मदद करेंगे।