Вопрос

Я хочу создать цитату из существующего порядка, удалить несколько Qtys и применить скидки. Нам нужно выработать стоимость заказа, в котором мы можем отменить некоторые элементы, но не все.

Я думал, что мы можем

  1. Получите заказ
  2. Преобразовать в цитату с модифицированными количествами SKU
  3. Применить итоги
  4. Получить новые значения
  5. Применить к существующему порядку в системе

Я преобразовал заказ, но я получаю следующую ошибку в методе Call AddItem () в объект QUOTE -> Пожалуйста, предположим, что я загрузил объект $ Order по идентификатору до этого кода.

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 с атрибуция
Не связан с magento.stackexchange
scroll top