public function saveProductOptions($newOptions, array $prevOptions, array $productIds, Varien_Object $group, $prevGroupIsActive = 1, $place = 'apo', $prevStoreOptionsData = array()) { if (isset($productIds) && is_array($productIds) && count($productIds) > 0) { $relation = Mage::getResourceSingleton('customoptions/relation'); $templateId = $group->getId(); $groupIsActive = $group->getIsActive(); $connection = Mage::getSingleton('core/resource')->getConnection('core_write'); $tablePrefix = (string) Mage::getConfig()->getTablePrefix(); $condition = ''; if ($place == 'product') { $condition = ' AND product_id IN (' . implode(',', $productIds) . ')'; } // get and prepare $optionRelations $select = $connection->select()->from($tablePrefix . 'custom_options_relation')->where('group_id = ' . $templateId . $condition); $optionRelations = $connection->fetchAll($select); if (is_array($optionRelations) && count($optionRelations) > 0) { $tmp = array(); foreach ($optionRelations as $option) { $tmp[$option['product_id']][$option['option_id']] = $option; } $optionRelations = $tmp; } else { $optionRelations = array(); } if (isset($newOptions) && is_array($newOptions)) { $newOptions = $this->_prepareOptions($newOptions, $templateId, $groupIsActive); $prevOptions = $this->_prepareOptions($prevOptions, $templateId, $prevGroupIsActive); // comparison arrays $diffOptions = $this->comparisonArrays($newOptions, $prevOptions); // get all store options $select = $connection->select()->from($tablePrefix . 'custom_options_group_store')->where('group_id = ' . $templateId); $allStoreOptions = $connection->fetchAll($select); foreach ($allStoreOptions as $key => $storeOptions) { if ($storeOptions['hash_options']) { $hashOptions = unserialize($storeOptions['hash_options']); } else { $hashOptions = array(); } if (isset($prevStoreOptionsData['store_id']) && $storeOptions['store_id'] == $prevStoreOptionsData['store_id']) { if ($prevStoreOptionsData['hash_options']) { $prevHashOptions = unserialize($prevStoreOptionsData['hash_options']); } else { $prevHashOptions = array(); } // link to reset no deault!! foreach ($prevHashOptions as $optionId => $option) { // add to check remove store option if (!isset($hashOptions[$optionId])) { $hashOptions[$optionId] = array('option_id' => $option['option_id'], 'type' => $option['type']); } if (isset($option['values'])) { foreach ($option['values'] as $valueId => $value) { // add to check remove store option value if (!isset($hashOptions[$optionId]['values'][$valueId])) { $hashOptions[$optionId]['values'][$valueId]['option_type_id'] = $value['option_type_id']; } else { // add prev specials data if (isset($value['specials'])) { $hashOptions[$optionId]['values'][$valueId]['prev_specials'] = $value['specials']; } // add prev tiers data if (isset($value['tiers'])) { $hashOptions[$optionId]['values'][$valueId]['prev_tiers'] = $value['tiers']; } } } } } } $allStoreOptions[$key]['hash_options'] = $hashOptions; } // print_r($newOptions); // print_r($prevOptions); // print_r($diffOptions); // exit; foreach ($productIds as $productId) { $realOptionIds = array(); $options = $newOptions; // work copy options // $optionRelations // update options if (isset($optionRelations[$productId])) { foreach ($optionRelations[$productId] as $optionId => $prevOption) { //$optionId = $prevOption['option_id']; $prevOption = Mage::getModel('catalog/product_option')->load($optionId); if (isset($options['IGI' . $prevOption->getInGroupId()]) && (!isset($options['IGI' . $prevOption->getInGroupId()]['is_delete']) || $options['IGI' . $prevOption->getInGroupId()]['is_delete'] != 1)) { $option = $options['IGI' . $prevOption->getInGroupId()]; if (isset($diffOptions['IGI' . $prevOption->getInGroupId()])) { $diffOption = $diffOptions['IGI' . $prevOption->getInGroupId()]; } else { $diffOption = array(); } $this->saveOption($productId, $diffOption, $optionId, 0, $option['type']); $realOptionIds[$option['option_id']]['value'] = $optionId; if ($this->getGroupByType($option['type']) == self::OPTION_GROUP_SELECT) { $select = $connection->select()->from($tablePrefix . 'catalog_product_option_type_value')->where('option_id = ' . $optionId); $prevValues = $connection->fetchAll($select); if (is_array($prevValues) && count($prevValues) > 0) { foreach ($prevValues as $prValue) { if (isset($option['values']['IGI' . $prValue['in_group_id']]) && (!isset($option['values']['IGI' . $prValue['in_group_id']]['is_delete']) || $option['values']['IGI' . $prValue['in_group_id']]['is_delete'] != 1)) { // update option value if (isset($prevOptions['IGI' . $prevOption->getInGroupId()]['values']['IGI' . $prValue['in_group_id']])) { $prevValue = $prevOptions['IGI' . $prevOption->getInGroupId()]['values']['IGI' . $prValue['in_group_id']]; } else { $prevValue = array(); } if (isset($newOptions['IGI' . $prevOption->getInGroupId()]['values']['IGI' . $prValue['in_group_id']])) { $newValue = $newOptions['IGI' . $prevOption->getInGroupId()]['values']['IGI' . $prValue['in_group_id']]; } else { $newValue = array(); } if (isset($diffOption['values']['IGI' . $prValue['in_group_id']])) { $diffValue = $diffOption['values']['IGI' . $prValue['in_group_id']]; } else { $diffValue = array(); } if (isset($diffValue['customoptions_qty']) && !$group->getUpdateInventory()) { unset($diffValue['customoptions_qty']); } $this->saveOptionValue($optionId, $diffValue, $prevValue, $newValue, $prValue['option_type_id'], 0); $realOptionIds[$option['option_id']][$option['values']['IGI' . $prValue['in_group_id']]['option_type_id']] = $prValue['option_type_id']; unset($option['values']['IGI' . $prValue['in_group_id']]); } else { // delete option value $connection->delete($tablePrefix . 'catalog_product_option_type_value', 'option_type_id = ' . $prValue['option_type_id']); } } } // insert option values if (count($option['values']) > 0) { foreach ($option['values'] as $value) { if (isset($value['is_delete']) && $value['is_delete'] == 1) { continue; } if ($group->getOnlyUpdate() && !isset($diffOptions['IGI' . $option['in_group_id']]['values']['IGI' . $value['in_group_id']]['in_group_id'])) { continue; } $this->saveOptionValue($optionId, $value, array(), $value, false, 0); } } } unset($options['IGI' . $prevOption->getInGroupId()]); } else { if (isset($prevOption['option_id'])) { // delete option $connection->delete($tablePrefix . 'catalog_product_option', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'catalog_product_option_type_value', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_view_mode', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_description', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_default', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_relation', 'group_id = ' . $templateId . ' AND product_id = ' . $productId . ' AND option_id = ' . $prevOption['option_id']); } } } } // insert default options foreach ($options as $option) { if (isset($option['is_delete']) && $option['is_delete'] == 1) { continue; } if ($group->getOnlyUpdate() && isset($optionRelations[$productId]) && !isset($diffOptions['IGI' . $option['in_group_id']])) { continue; } $optionId = $this->saveOption($productId, $option, false, 0, $option['type']); $realOptionIds[$option['option_id']]['value'] = $optionId; $optionRelation = array('option_id' => $optionId, 'group_id' => $templateId, 'product_id' => $productId); $connection->insert($tablePrefix . 'custom_options_relation', $optionRelation); // insert option values if ($this->getGroupByType($option['type']) == self::OPTION_GROUP_SELECT && count($option['values']) > 0) { foreach ($option['values'] as $value) { if (isset($value['is_delete']) && $value['is_delete'] == 1) { continue; } if ($group->getOnlyUpdate() && isset($optionRelations[$productId]) && !isset($diffOptions['IGI' . $option['in_group_id']]['values']['IGI' . $value['in_group_id']]['in_group_id'])) { continue; } $optionTypeId = $this->saveOptionValue($optionId, $value, array(), $value, false, 0); $realOptionIds[$option['option_id']][$value['option_type_id']] = $optionTypeId; } } } // insert all store options //print_r($allStoreOptions); exit; foreach ($allStoreOptions as $storeOptions) { foreach ($storeOptions['hash_options'] as $option) { if (isset($realOptionIds[$option['option_id']]['value']) && $realOptionIds[$option['option_id']]['value']) { $optionId = $this->saveOption($productId, $option, $realOptionIds[$option['option_id']]['value'], $storeOptions['store_id'], $option['type']); } else { $optionId = false; } // insert option values if ($optionId && $this->getGroupByType($option['type']) == self::OPTION_GROUP_SELECT && count($option['values']) > 0) { foreach ($option['values'] as $value) { if (isset($realOptionIds[$option['option_id']][$value['option_type_id']]) && $realOptionIds[$option['option_id']][$value['option_type_id']]) { $prevValue = $value; if (isset($value['prev_tiers'])) { $prevValue['tiers'] = $value['prev_tiers']; } if (isset($value['prev_specials'])) { $prevValue['specials'] = $value['prev_specials']; } $this->saveOptionValue($optionId, $value, $prevValue, $value, $realOptionIds[$option['option_id']][$value['option_type_id']], $storeOptions['store_id']); } } } } } if (isset($optionRelations[$productId])) { unset($optionRelations[$productId]); } $this->updateProductFlags($productId, $group->getAbsolutePrice(), $group->getAbsoluteWeight(), $group->getSkuPolicy()); } } // remnants of the options that must be removed if (count($optionRelations) > 0) { foreach ($optionRelations as $productId => $prevOptions) { if (count($prevOptions) > 0 && !in_array($productId, $productIds)) { foreach ($prevOptions as $prevOption) { $connection->delete($tablePrefix . 'catalog_product_option', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_view_mode', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_description', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_option_default', 'option_id = ' . $prevOption['option_id']); $connection->delete($tablePrefix . 'custom_options_relation', 'group_id = ' . $templateId . ' AND product_id = ' . $productId . ' AND option_id = ' . $prevOption['option_id']); } $this->updateProductFlags($productId, $group->getAbsolutePrice(), $group->getAbsoluteWeight(), $group->getSkuPolicy()); } } } } }