Bir şans vereceğim. Onları birer birer alalım:
Yöntem 1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
Yukarıdaki, sipariş ayrıntılarını bir gönderi nesnesine kopyalamak için Mage_Sales_Model_Convert_Order
çağrılan bir çekirdek yardımcı kullanan sınıftan yüklenir copyFieldset
. $ order, array türünde olmalı Varien_Object
.
Bu yöntem aslında Mage::getModel('sales/convert_order')
, Yapıcı çağrısında kullandığı gibi, Yöntem 3'ün merkezindedir .
Bu yöntemin temel ayırıcısı - bir diziyi veya nesneyi $order
alıp temel bir nesne üretebilir $shipment
. Yalnızca Yöntem 2, Yöntem 3'te ortaya konan yöntemlerin kullandığı düşük seviye bir yöntemdir.
Yöntem 2
$shipment = Mage::getModel('sales/service_order', $order)
->prepareShipment($this->_getItemQtys($order));
Bu, hem Gönderi hem de Fatura denetleyicilerinde kullanıldığı gibi, Magento Çekirdeğinde bir sevkıyat üretmenin en popüler yoludur. nesnenin korumalı bir özellik olarak ayarlanması $order
, örneğinin başlatılması için yapıcı argüman olarak kullanılır Mage_Sales_Model_Service_Order
.
Daha sonra arayacak prepareShipment
ve bir miktar geçiyorsun. Bu yöntem, Yöntem 1'deki dönüştürücü sınıfını kullandığından, burada adlandırılan argümandaki sipariş öğelerinin gönderi adetlerini iletme gibi daha fazla ayrıntı belirtmeniz gerekmez . Bunu kendi bağlamınızda kullanmak için tek yapmanız gereken, bir dizideki öğelerin miktarını aşağıdaki biçimde aktarmaktır:prepareShipment
$this->_getItemQtys
array(
'order_item_id'=>$qty,
'order_item_id'=>$qty,
'order_item_id'=>$qty
)
Bu yöntemin temel ayırıcısı - size bir $ gönderi nesnesini geri verir, ancak üzerinde tüm öğeler bulunur. Tak ve çalıştır.
Yöntem 3
Çekirdekte bu yöntemi kullandığına dair kanıt bulamadım. Dürüst olmak gerekirse, bir kesmek gibi görünüyor. İşte yöntem:
$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);
Adım 1, yukarıdaki Yöntem 2 ile tamamen aynıdır. Fark yok. Bununla birlikte, $shipment
doğrudan bir insantiasyonu ile değiştirilen bir nesneyi geri alırsınız.Mage_Sales_Model_Order_Shipment_Api
. Bu standart değil. Bir Api nesnesini sevkiyatı almanın en iyi yolu aramaktır Mage::getModel('sales/order_shipment_api')
.
Sonra, bir gönderi oluşturmak için bu üzerine yazılmış, yeni Gönderi API'si nesnesini kullanır. $orderId
sonra, kodunuzda tanımlanmayan değişkenden . Yine, bu bir geçici çözüm gibi görünüyor.
Baktığımızda, Mage_Sales_Model_Order_Shipment_Api::create()
bir gönderi oluşturmak için tek adresli bir mağaza gibi gözüküyor, çünkü gönderiyi oluşturmak için gereken en temel ayrıntılar yalnızca bir siparişdirincrement_id
.
Bu, herhangi bir modül veya eklenti tarafından kullanılmaması gereken bir kesmek. Bu API, XML RPC / SOAP API istekleri tarafından sunulan özellikler tarafından tüketilmek içindir ve birden fazla adımlı API isteğini ortadan kaldırmak için kasıtlı olarak temeldir.
Sonunda Metod 3, nitty kumuna rağmen, ve Mage_Sales_Model_Order'e yapılan bir çağrı yoluyla, prepareShipment
yukarıdaki tanıdık Metod 2 için daha yüksek dereceli bir soyutlama olarak adlandırılır:
public function prepareShipment($qtys = array())
{
$shipment = Mage::getModel('sales/service_order', $this)->prepareShipment($qtys);
return $shipment;
}
Buradaki anahtar farkatör - bir gönderime ihtiyacınız varsa, bilgisayar korsanlarına aldırış etmeyin ve yalnızca bir increment_id değerine sahipseniz - bu yöntemi kullanın. Ayrıca, bunu SOAP API üzerinden yapmayı tercih ederseniz faydalı bilgiler.
Umarım bu yardımcı olur.