public function quoteProductAddAfter($observer) { $helper = Mage::helper('customoptions'); if (!$helper->isEnabled() || !$helper->isOptionSkuPolicyEnabled() || !$helper->isOptionSkuPolicyApplyToCart()) { return $this; } $configSkuPolicy = $helper->getOptionSkuPolicyDefault(); $items = $observer->getEvent()->getItems(); foreach ($items as $item) { $itemChangesFlag = false; $itemRemoveFlag = false; $product = $item->getProduct(); // if bad magento)) if (is_null($product->getHasOptions())) { $product->load($product->getId()); } if (!$product->getHasOptions()) { continue; } $productSkuPolicy = $helper->getProductSkuPolicy($product); if ($productSkuPolicy == 0) { $productSkuPolicy = $configSkuPolicy; } $post = $helper->getInfoBuyRequest($product); if (isset($post['options'])) { $options = $post['options']; } else { $options = false; } if ($options) { foreach ($options as $optionId => $value) { $optionModel = $product->getOptionById($optionId); if (!$optionModel) { continue; } $optionModel->setProduct($product); $customoptionsIsOnetime = $optionModel->getCustomoptionsIsOnetime(); $skuPolicy = $optionModel->getSkuPolicy(); // or $productSkuPolicy = Grouped if ($skuPolicy == 0 || $productSkuPolicy == 3) { $skuPolicy = $productSkuPolicy; } if ($skuPolicy == 1) { continue; } switch ($optionModel->getType()) { case 'drop_down': case 'radio': case 'checkbox': case 'multiple': case 'swatch': case 'multiswatch': case 'hidden': if (is_array($value)) { $optionTypeIds = $value; } else { $optionTypeIds = explode(',', $value); } foreach ($optionTypeIds as $index => $optionTypeId) { if (!$optionTypeId) { continue; } $valueModel = $optionModel->getValueById($optionTypeId); $sku = $valueModel->getSku(); if (!$sku) { continue; } $productIdBySku = $helper->getProductIdBySku($sku); if (!$productIdBySku) { continue; } if ($skuPolicy == 2 || $skuPolicy == 3) { // Independent, Grouped // add new product by $productIdBySku if (isset($post['options_' . $optionId . '_qty'])) { $optionQty = intval($post['options_' . $optionId . '_qty']); } elseif (isset($post['options_' . $optionId . '_' . $optionTypeId . '_qty'])) { $optionQty = intval($post['options_' . $optionId . '_' . $optionTypeId . '_qty']); } else { $optionQty = 1; } $optionTotalQty = $customoptionsIsOnetime ? $optionQty : $optionQty * $item->getQty(); $request = new Varien_Object(); $request->setQty($optionTotalQty); $optionResourceModel = $optionModel->getResource(); $request->setSkuPolicyName($optionResourceModel->getValueTitle($optionTypeId, $item->getStoreId())); if ($helper->isWeightEnabled()) { $request->setSkuPolicyWeight($valueModel->getWeight()); } if ($helper->isCostEnabled()) { $request->setSkuPolicyCost($valueModel->getCost()); } //$item->getQuote() or Mage::getSingleton('checkout/cart') $result = $item->getQuote()->addProduct(Mage::getModel('catalog/product')->setStoreId($item->getStoreId())->load($productIdBySku), $request); if (!is_object($result)) { continue; } // remove option or optionValue from item if (is_array($value)) { unset($value[$index]); } else { $value = ''; } if ($value) { // if remove optionValue $post['options'][$optionId] = $value; $itemOption = $item->getOptionByCode('option_' . $optionId); $itemOption->setValue(is_array($value) ? implode(',', $value) : $value); $item->addOption($itemOption); } else { // if remove option unset($post['options'][$optionId]); $item->removeOption('option_' . $optionId); $itemOptionIds = $item->getOptionByCode('option_ids'); $optionIds = $itemOptionIds->getValue(); if ($optionIds) { $optionIds = explode(',', $optionIds); $i = array_search($optionId, $optionIds); if ($i !== false) { unset($optionIds[$i]); } if ($optionIds) { $optionIds = implode(',', $optionIds); } } if ($optionIds) { $itemOptionIds->setValue($optionIds); $item->addOption($itemOptionIds); } else { $item->removeOption('option_ids'); } } $infoBuyRequest = $item->getOptionByCode('info_buyRequest'); $infoBuyRequest->setValue(serialize($post)); $item->addOption($infoBuyRequest); // end remove option from item $itemChangesFlag = true; if ($skuPolicy == 3) { $itemRemoveFlag = true; } } elseif ($skuPolicy == 4) { $infoBuyRequest = $item->getOptionByCode('info_buyRequest'); $post['sku_policy_sku'] = $sku; $infoBuyRequest->setValue(serialize($post)); $item->addOption($infoBuyRequest); } } break; default: if (!$value) { continue; } $sku = $optionModel->getSku(); if (!$sku) { continue; } $productIdBySku = $helper->getProductIdBySku($sku); if (!$productIdBySku) { continue; } if ($skuPolicy == 2 || $skuPolicy == 3) { // Independent, Grouped // add new product by $productIdBySku $optionTotalQty = $customoptionsIsOnetime ? 1 : $item->getQty(); $request = new Varien_Object(); $request->setQty($optionTotalQty); $optionResourceModel = $optionModel->getResource(); $request->setSkuPolicyName($optionResourceModel->getTitle($optionId, $item->getStoreId())); //$item->getQuote() or Mage::getSingleton('checkout/cart') $result = $item->getQuote()->addProduct(Mage::getModel('catalog/product')->setStoreId($item->getStoreId())->load($productIdBySku)); if (!is_object($result)) { continue; } // remove option from item unset($post['options'][$optionId]); $item->removeOption('option_' . $optionId); $itemOptionIds = $item->getOptionByCode('option_ids'); $optionIds = $itemOptionIds->getValue(); if ($optionIds) { $optionIds = explode(',', $optionIds); $i = array_search($optionId, $optionIds); if ($i !== false) { unset($optionIds[$i]); } if ($optionIds) { $optionIds = implode(',', $optionIds); } } if ($optionIds) { $itemOptionIds->setValue($optionIds); $item->addOption($itemOptionIds); } else { $item->removeOption('option_ids'); } $infoBuyRequest = $item->getOptionByCode('info_buyRequest'); $infoBuyRequest->setValue(serialize($post)); $item->addOption($infoBuyRequest); // end remove option from item $itemChangesFlag = true; if ($skuPolicy == 3) { $itemRemoveFlag = true; } } elseif ($skuPolicy == 4) { $infoBuyRequest = $item->getOptionByCode('info_buyRequest'); $post['sku_policy_sku'] = $sku; $infoBuyRequest->setValue(serialize($post)); $item->addOption($infoBuyRequest); } break; } } } if ($itemRemoveFlag) { $itemsCollection = $item->getQuote()->getItemsCollection(); foreach ($itemsCollection as $key => $itm) { if ($itm === $item) { $itemsCollection->removeItemByKey($key); } } } elseif ($itemChangesFlag) { // update item $quote = $item->getQuote(); $itemsCollection = $quote->getItemsCollection(); $itemRemoveFlag = false; foreach ($itemsCollection as $key => $itm) { if ($itm->getProductId() == $item->getProductId() && $itm !== $item) { // get current $item - $options if (isset($post['options'])) { $options = $post['options']; } else { $options = false; } // get other $itm - $optns $prdct = $itm->getProduct(); // if bad magento)) if (is_null($prdct->getHasOptions())) { $prdct->load($prdct->getId()); } $optns = false; if ($prdct->getHasOptions()) { $post = $helper->getInfoBuyRequest($prdct); if (isset($post['options'])) { $optns = $post['options']; } } // compare options if ($optns === $options) { $itm->setQty($itm->getQty() + $item->getQty()); $itemRemoveFlag = true; } } if ($itemRemoveFlag && $itm === $item) { $itemsCollection->removeItemByKey($key); } } } } }