我想从现有订单中创建报价,并删除一些QTY并重新应用折扣。我们需要确定订单的价值,我们可以取消一些项目,但不是全部。

我以为我们可以

  1. 获取订单
  2. 用修改的SKU数量转换为报价
  3. 应用收集总计
  4. 获取新值
  5. 适用于系统中现有订单

我已经将订单转换为订单,但是我在方法调用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();
许可以下: CC-BY-SA归因
scroll top