Создать mage_sales_model_quote из порядка
Вопрос
Я хочу создать цитату из существующего порядка, удалить несколько Qtys и применить скидки. Нам нужно выработать стоимость заказа, в котором мы можем отменить некоторые элементы, но не все.
Я думал, что мы можем
- Получите заказ
- Преобразовать в цитату с модифицированными количествами SKU
- Применить итоги
- Получить новые значения
- Применить к существующему порядку в системе
Я преобразовал заказ, но я получаю следующую ошибку в методе 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();