* "copyright.txt" FILE PROVIDED WITH THIS DISTRIBUTION PACKAGE. * ****************************************************************************/ use Tygh\Registry; if (!defined('BOOTSTRAP')) { die('Access denied'); } fn_define('KEEP_UPLOADED_FILES', true); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $suffix = ''; if (!fn_allowed_for('ULTIMATE:FREE')) { if ($mode == 'add_exceptions') { foreach ($_REQUEST['add_options_combination'] as $k => $v) { $_data = array('product_id' => $_REQUEST['product_id'], 'combination' => $v); fn_update_exception($_data); } fn_recalculate_exceptions($_REQUEST['product_id']); $suffix = ".exceptions?product_id={$_REQUEST['product_id']}"; } if ($mode == 'm_delete_exceptions') { foreach ($_REQUEST['exception_ids'] as $id) { fn_delete_exception($id); } $suffix = ".exceptions?product_id={$_REQUEST['product_id']}"; } } if ($mode == 'add_combinations') { if (is_array($_REQUEST['add_inventory'])) { foreach ($_REQUEST['add_inventory'] as $k => $v) { $_data = array('product_id' => $_REQUEST['product_id'], 'combination' => $_REQUEST['add_options_combination'][$k], 'amount' => isset($_REQUEST['add_inventory'][$k]['amount']) ? $_REQUEST['add_inventory'][$k]['amount'] : 0); $_data = fn_array_merge($v, $_data); fn_update_option_combination($_data);
/** * Updates product option * * @param array $option_data option data array * @param int $option_id option ID (empty if we're adding the option) * @param string $lang_code language code to add/update option for * @return int ID of the added/updated option */ function fn_update_product_option($option_data, $option_id = 0, $lang_code = DESCR_SL) { /** * Changes parameters before update option data * * @param array $option_data Option data * @param int $option_id Option identifier * @param string $lang_code Two-letter language code (e.g. 'en', 'ru', etc.) */ fn_set_hook('update_product_option_pre', $option_data, $option_id, $lang_code); SecurityHelper::sanitizeObjectData('product_option', $option_data); // Add option if (empty($option_id)) { $action = 'create'; if (empty($option_data['product_id'])) { $option_data['product_id'] = 0; } $option_data['option_id'] = $option_id = db_query('INSERT INTO ?:product_options ?e', $option_data); foreach (fn_get_translation_languages() as $option_data['lang_code'] => $_v) { db_query("INSERT INTO ?:product_options_descriptions ?e", $option_data); } $create = true; // Update option } else { $action = 'update'; // if option inventory changed from Y to N, we should clear option combinations if (!empty($option_data['product_id']) && !empty($option_data['inventory']) && $option_data['inventory'] == 'N') { $condition = fn_get_company_condition('?:product_options.company_id'); $old_option_inventory = db_get_field("SELECT inventory FROM ?:product_options WHERE option_id = ?i {$condition}", $option_id); if ($old_option_inventory == 'Y') { $inventory_filled = db_get_field('SELECT COUNT(*) FROM ?:product_options_inventory WHERE product_id = ?i', $option_data['product_id']); if ($inventory_filled) { fn_delete_product_option_combinations($option_data['product_id']); } } } if (fn_allowed_for('ULTIMATE') && !empty($option_data['product_id']) && fn_ult_is_shared_product($option_data['product_id']) == 'Y') { $product_company_id = db_get_field('SELECT company_id FROM ?:products WHERE product_id = ?i', $option_data['product_id']); $option_id = fn_ult_update_shared_product_option($option_data, $option_id, Registry::ifGet('runtime.company_id', $product_company_id), $lang_code); if (Registry::get('runtime.company_id') && Registry::get('runtime.company_id') != $product_company_id) { $deleted_variants = array(); fn_set_hook('update_product_option_post', $option_data, $option_id, $deleted_variants, $lang_code); return $option_id; } } db_query("UPDATE ?:product_options SET ?u WHERE option_id = ?i", $option_data, $option_id); db_query("UPDATE ?:product_options_descriptions SET ?u WHERE option_id = ?i AND lang_code = ?s", $option_data, $option_id, $lang_code); } if (fn_allowed_for('ULTIMATE')) { // options of shared product under the shared store hasn't a company_id. No necessary for updating. if (!empty($option_data['company_id'])) { fn_ult_update_share_object($option_id, 'product_options', $option_data['company_id']); } if (!empty($option_data['product_id'])) { fn_ult_share_product_option($option_id, $option_data['product_id']); } } if (!empty($option_data['variants'])) { $var_ids = array(); // Generate special variants structure for checkbox (2 variants, 1 hidden) if ($option_data['option_type'] == 'C') { $option_data['variants'] = array_slice($option_data['variants'], 0, 1); // only 1 variant should be here reset($option_data['variants']); $_k = key($option_data['variants']); $option_data['variants'][$_k]['position'] = 1; // checked variant $v_id = db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i AND position = 0", $option_id); $option_data['variants'][] = array('position' => 0, 'variant_id' => $v_id); } $variant_images = array(); foreach ($option_data['variants'] as $k => $v) { if ((!isset($v['variant_name']) || $v['variant_name'] == '') && $option_data['option_type'] != 'C') { continue; } if ($action == 'create') { unset($v['variant_id']); } // Update product options variants if (isset($v['modifier'])) { $v['modifier'] = floatval($v['modifier']); if (floatval($v['modifier']) > 0) { $v['modifier'] = '+' . $v['modifier']; } } if (isset($v['weight_modifier'])) { $v['weight_modifier'] = floatval($v['weight_modifier']); if (floatval($v['weight_modifier']) > 0) { $v['weight_modifier'] = '+' . $v['weight_modifier']; } } $v['option_id'] = $option_id; if (empty($v['variant_id']) || !empty($v['variant_id']) && !db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE variant_id = ?i", $v['variant_id'])) { $v['variant_id'] = db_query("INSERT INTO ?:product_option_variants ?e", $v); foreach (fn_get_translation_languages() as $v['lang_code'] => $_v) { db_query("INSERT INTO ?:product_option_variants_descriptions ?e", $v); } } else { db_query("UPDATE ?:product_option_variants SET ?u WHERE variant_id = ?i", $v, $v['variant_id']); db_query("UPDATE ?:product_option_variants_descriptions SET ?u WHERE variant_id = ?i AND lang_code = ?s", $v, $v['variant_id'], $lang_code); } $var_ids[] = $v['variant_id']; if ($option_data['option_type'] == 'C') { fn_delete_image_pairs($v['variant_id'], 'variant_image'); // force deletion of variant image for "checkbox" option } else { $variant_images[$k] = $v['variant_id']; } } if ($option_data['option_type'] != 'C' && !empty($variant_images)) { fn_attach_image_pairs('variant_image', 'variant_image', 0, $lang_code, $variant_images); } // Delete obsolete variants $condition = !empty($var_ids) ? db_quote('AND variant_id NOT IN (?n)', $var_ids) : ''; $deleted_variants = db_get_fields("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i {$condition}", $option_id, $var_ids); if (!empty($deleted_variants)) { db_query("DELETE FROM ?:product_option_variants WHERE variant_id IN (?n)", $deleted_variants); db_query("DELETE FROM ?:product_option_variants_descriptions WHERE variant_id IN (?n)", $deleted_variants); foreach ($deleted_variants as $v_id) { fn_delete_image_pairs($v_id, 'variant_image'); } } } if (!fn_allowed_for('ULTIMATE:FREE')) { // Rebuild exceptions if (!empty($create) && !empty($option_data['product_id'])) { fn_recalculate_exceptions($option_data['product_id']); } } /** * Update product option (running after fn_update_product_option() function) * * @param array $option_data Array with option data * @param int $option_id Option identifier * @param array $deleted_variants Array with deleted variants ids * @param string $lang_code Language code to add/update option for */ fn_set_hook('update_product_option_post', $option_data, $option_id, $deleted_variants, $lang_code); return $option_id; }