試してみます。一度に1つずつ取り上げましょう。
方法1
$converter=Mage::getModel('sales/convert_order');
$shipment=$converter->toShipment($order);
$converter
上記は、からMage_Sales_Model_Convert_Order
呼び出さcopyFieldset
れたコアヘルパーを使用して注文の詳細を出荷オブジェクトにコピーするクラスからロードされます。$ orderは配列またはでなければなりませんVarien_Object
。
このメソッドはMage::getModel('sales/convert_order')
、コンストラクター呼び出しで使用するため、実際には方法3の中核にあります。
このメソッドの主な差別化要因 -配列またはオブジェクト$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
)
このメソッドの主な差別化要因 -$ shipmentオブジェクトを返しますが、すべてのアイテムが変換されます。プラグアンドプレイです。
方法3
Coreでこの方法を使用した証拠を見つけることができませんでした。正直に言うと、ハックのように見えます。メソッドは次のとおりです。
$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
ます。これは非標準です。出荷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は核心に到達し、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経由でこれを処理する場合に役立つ情報。
それがお役に立てば幸いです。