从顺序创建Mage_sales_model_quote
题
我想从现有订单中创建报价,并删除一些QTY并重新应用折扣。我们需要确定订单的价值,我们可以取消一些项目,但不是全部。
我以为我们可以
- 获取订单
- 用修改的SKU数量转换为报价
- 应用收集总计
- 获取新值
- 适用于系统中现有订单
我已经将订单转换为订单,但是我在方法调用additem()上收到以下错误到报价对象 - >请假设我已经按照此代码剪切之前的ID加载了$订单对象
Fatal error: Call to a member function getStoreId() on a non-object in /var/www/build-54/app/code/core/Mage/Sales/Model/Quote/Item/Abstract.php on line 65
/** @var $converter \Mage_Sales_Model_Convert_Order */
$converter = Mage::getModel('sales/convert_order');
/** @var $quote \Mage_Sales_Model_Quote */
$quote = $converter->toQuote($order);
$items = $order->getAllVisibleItems();
foreach($items as $item) {
/** @var $item \Mage_Sales_Model_Order_Item */
/** @var $quoteItem \Mage_Sales_Model_Quote_Item */
$quoteItem = $converter->itemToQuoteItem($item);
//var_dump($quoteItem);
$quote->addItem($quoteItem);
}
$quote->collectTotals();
解决方案
将订单项目添加到报价的正确方法如下:
$cart = Mage::getSingleton('checkout/cart');
foreach ($order->getItemsCollection() as $item) {
$cart->addOrderItem($item);
}
这要注意检查产品可用性并应用最初设置的任何配置选项。
如果您不想使用购物车,因为它是单身人士,请检查 Mage_Checkout_Model_Cart::addOrderItem()
并在您的代码中复制它。
可能也是一个好主意
$appEmulation = Mage::getSingleton('core/app_emulation');
$initialEnvironmentInfo = $appEmulation->startEnvironmentEmulation($quote->getStoreId());
在使用它之前。否则,任何发送的电子邮件可能最终都会出现错误的语言环境。恢复 $appEmulation->stopEnvironmentEmulation($initialEnvironmentInfo);
为了保存报价,您可以使用 $cart->save()
, ,但这假设可以进行结帐会话。可能最好使用
$quote->collectTotals()->save();