Hello,
I am using Magento EE 1.14.1 for running a clothes store.
I created a module to split the pre-order items and regular items into two different orders which is working fine. However, when checking on the order detail in back-end, and the client's order history, they all are missing the product options(eg: size, color etc.). Please see attached screenshot. This feature was created by rewriting the onepage.php, SaveOrder class, please see the code below. Can anyone please help me with the code to check what did I miss? Thanks in advance.
Onepage.php
PHP Code:
class Namespace_Splitorder_Model_Checkout_Type_Onepage extends Mage_Checkout_Model_Type_Onepage{
protected $_subOrders = array();
protected $_initialPaymentMethod = '';
public function saveOrder()
{
$this->_checkoutSession->unsetData('suborders');
$quote = $this->getQuote();
$backUpProducts = array();
$configurableType = Mage::getModel('catalog/product_type_configurable');
$sortedItems = array();
foreach ($quote->getAllVisibleItems() as $item) {
$product = Mage::getModel('catalog/product')->load($item->getProductId());
if ($product->getTypeId() == Mage_Catalog_Model_Product_Type::TYPE_CONFIGURABLE) {
$attributes = $configurableType->getConfigurableAttributesAsArray($product);
} else {
$attributes = array();
}
$optionsArray = $item->getBuyRequest()->getData();
$simpleItems = array();
if (count($item->getChildren())) {
$superAttributes = array();
foreach ($item->getChildren() as $childrenItem) {
foreach ($attributes as $attribute) {
$childrenProduct = Mage::getModel('catalog/product')->load($childrenItem->getProductId());
$superAttributes[$attribute['attribute_id']] = $childrenProduct->getData($attribute['attribute_code']);
}
$optionsArray['super_attribute'] = $superAttributes;
$simpleItems[] = $childrenItem;
}
} else {
$simpleItems[] = $item;
}
$backUpProducts[] = $optionsArray;
$parentProduct = Mage::getModel('catalog/product')->load($item->getProductId());
if ($parentProduct->getId()) {
$orderSeparator = $parentProduct->getData('pre_order_date');
if ($parentProduct->isVirtual()) {
$orderSeparator = 'virtual';
}
}
foreach ($simpleItems as $simpleItem) {
$productId = $simpleItem->getProductId();
$product = Mage::getModel('catalog/product')->load($productId);
if ($product->getId()) {
$orderSeparator = $orderSeparator ?: $product->getData('pre_order_date');
if (!$orderSeparator) {
$orderSeparator = 'order';
}
if ($product->isVirtual()) {
$orderSeparator = 'virtual';
}
if (!array_key_exists($orderSeparator, $sortedItems)) {
$sortedItems[$orderSeparator] = array();
}
if (!in_array($simpleItem, $sortedItems[$orderSeparator])) {
if ($simpleItem->getParentItem()) {
$sortedItems[$orderSeparator][] = $simpleItem->getParentItem();
} else {
$sortedItems[$orderSeparator][] = $simpleItem;
}
}
}
}
}
$this->_initialPaymentMethod = $quote->getPayment()->getData();
$_initialPaymentMethod = $quote->getPayment()->getMethod();
$customerBalanceUsed = $quote->getData('customer_balance_amount_used');
$useCustomerBalance = $quote->getData('use_customer_balance');
if (count($sortedItems) > 1) {
foreach ($sortedItems as $orderSeparator => $items) {
$quote->getPayment()->importData($this->_initialPaymentMethod);
// Empty quote
$quote->removeAllItems();
Mage::log('items count:'.count($quote->getAllItems()),Zend_Log::DEBUG,"split_order.log", true);
Mage::log('items :'.PHP_EOL.var_export($quote->getAllItems(),true),Zend_Log::DEBUG,"split_order.log", true);
$newItems = array();
foreach ($items as $item) {
if ($item->getChildren()) {
foreach ($item->getChildren() as $childrenItem) {
$newChildren = $quote->addProduct($childrenItem->getProduct(),
$childrenItem->getBuyRequest())->save();
$newItems[] = $newChildren;
}
} else {
$newItem = $quote->addProduct($item->getProduct(), $item->getBuyRequest())->save();
$newItems[] = $newItem;
}
}
if($orderSeparator === 'virtual'){
$quote->setIsVirtual(true);
}else{
$quote->setIsVirtual(false);
}
$quote->getShippingAddress()->unsetData('cached_items_all');
$quote->getShippingAddress()->unsetData('cached_items_nominal');
$quote->getShippingAddress()->unsetData('cached_items_nonnominal');
$quote->getBillingAddress()->unsetData('cached_items_all');
$quote->getBillingAddress()->unsetData('cached_items_nominal');
$quote->getBillingAddress()->unsetData('cached_items_nonnominal');
$quote->getBillingAddress()->setCollectShippingRates(true)->collectShippingRates();
$quote->getBillingAddress()->collectTotals();
if ($useCustomerBalance) {
$quote->setData('use_customer_balance', true);
$storeCredit = min($customerBalanceUsed, $quote->getData('grand_total'));
$quote->setData('customer_balance_amount_used', $storeCredit);
$quote->setData('base_customer_balance_amount_used', $storeCredit);
$customerBalanceUsed = max(0, $customerBalanceUsed - $storeCredit);
$useCustomerBalance = $customerBalanceUsed ? true : false;
$quote->save();
}
$quote->setTotalsCollectedFlag(false)->collectTotals()->save();
$quote->getPayment()->importData($this->_initialPaymentMethod);
if ($orderSeparator === 'order' || $orderSeparator === 'virtual') {
$quote->getPayment()->setMethod($_initialPaymentMethod);
} else {
if ($_initialPaymentMethod !== 'free' && $quote->getGrandTotal() > 0) {
$quote->getPayment();
} else {
$quote->getPayment()->setMethod($_initialPaymentMethod);
}
}
try {
parent::saveOrder();
} catch (Exception $e) {
foreach ($quote->getAllItems() as $item) {
$quote->deleteItem($item)->save();
$quote->getItemsCollection()->removeItemByKey($item->getId());
}
$quote->getShippingAddress()->unsetData('cached_items_all');
$quote->getShippingAddress()->unsetData('cached_items_nominal');
$quote->getShippingAddress()->unsetData('cached_items_nonnominal');
$quote->save();
foreach (Mage::getSingleton('checkout/session')->getQuote()->getAllItems() as $item) {
Mage::getSingleton('checkout/session')->getQuote()->deleteItem($item);
}
Mage::getSingleton('checkout/session')->getQuote()->save();
Mage::getSingleton('checkout/cart')->truncate()->save();
foreach ($this->_subOrders as $savedOrderId) {
$savedOrder = Mage::getModel('sales/order')->load($savedOrderId, 'increment_id');
$savedOrder->setState(Mage_Sales_Model_Order::STATE_CANCELED, true, '', true)->save();
}
$session = Mage::getSingleton('customer/session');
$cart = Mage::getSingleton('checkout/cart');
$newQuote = Mage::getModel('sales/quote');
$cart->init();
$cart->setQuote($newQuote);
foreach ($backUpProducts as $productRequest) {
$product = Mage::getModel('catalog/product')->load($productRequest['product']);
$cart->addProduct($product, $productRequest);
}
$session->setCartWasUpdated(true);
$cart->save();
Mage::getSingleton('checkout/session')->setQuoteId($cart->getQuote()->getId());
throw $e;
}
$this->_subOrders[] = $this->getLastOrderId();
}
} else {
$orderSeparator = key($sortedItems);
if ($orderSeparator !== 'order' && $orderSeparator !== 'virtual') {
$paymentMethod = $quote->getPayment()->getMethod();
if ($paymentMethod !== 'free') {
$quote->getPayment();
}
}
parent::saveOrder();
$this->_subOrders[] = $this->getLastOrderId();
}
if (count($this->_subOrders) > 1) {
$this->_checkoutSession->addData(array('suborders' => $this->_subOrders));
}
return $this;
}
}
View more threads in the same category:
Bookmarks