function fn_exim_set_product_options($product_id, $data, $lang_code) { //for compatibility with the old format $data = preg_replace('{\\{\\d*\\}}', '', $data); if (!fn_is_empty($data)) { $data = fn_exim_parse_data($data); $updated_ids = array(); // store updated ids, delete other (if exist) foreach ($data as $option_key => $option) { $global_option = isset($option['global']) ? $option['global'] : false; if (!empty($option['group_name'])) { $company_id = fn_get_company_id_by_name($option['group_name']); } $option_id = db_get_field("SELECT o.option_id FROM ?:product_options_descriptions as d INNER JOIN ?:product_options as o ON o.option_id = d.option_id AND o.product_id = ?i WHERE d.option_name = ?s AND d.lang_code = ?s LIMIT 1", $global_option ? 0 : $product_id, $option['name'], $lang_code); $variant_ids = array(); $option['variants'] = isset($option['variants']) ? $option['variants'] : array(); foreach ($option['variants'] as $variant_pos => $variant) { $variant_ids[$variant_pos] = db_get_field("SELECT d.variant_id FROM ?:product_option_variants_descriptions as d INNER JOIN ?:product_option_variants as o ON o.variant_id = d.variant_id AND o.option_id = ?i WHERE d.variant_name = ?s AND d.lang_code = ?s LIMIT 1", $option_id, $variant, $lang_code); } $option_data = fn_exim_build_option_data($option, $option_id, $variant_ids, $lang_code); $option_data['company_id'] = !empty($company_id) ? $company_id : 0; if (empty($option_id)) { $option_data['product_id'] = !empty($global_option) ? 0 : $product_id; $option_data['position'] = $option_key; $updated_id = fn_update_product_option($option_data, 0, $lang_code); // Option is exist, update it } else { $updated_id = fn_update_product_option($option_data, $option_id, $lang_code); } if ($global_option) { $glob_link = array('option_id' => $updated_id, 'product_id' => $product_id); db_query('REPLACE INTO ?:product_global_option_links ?e', $glob_link); } $variant_ids = array(); foreach ($option['variants'] as $variant_pos => $variant) { $variant_ids[$variant_pos] = db_get_field("SELECT d.variant_id FROM ?:product_option_variants_descriptions as d INNER JOIN ?:product_option_variants as o ON o.variant_id = d.variant_id AND o.option_id = ?i WHERE d.variant_name = ?s AND d.lang_code = ?s LIMIT 1", $updated_id, $variant, $lang_code); } $updated_ids[] = $updated_id; } // Delete all other options if (!empty($updated_ids)) { $obsolete_ids = db_get_fields("SELECT option_id FROM ?:product_options WHERE option_id NOT IN (?n) AND product_id = ?i", $updated_ids, $product_id); if (!empty($obsolete_ids)) { foreach ($obsolete_ids as $o_id) { fn_delete_product_option($o_id, $product_id); } } } } return true; }
function fn_exim_set_product_options($product_id, $data, $lang_code, $features_delimiter) { list($main_lang) = array_keys($data); $option_ids = array(); foreach ($data as $lang_code => $options) { //for compatibility with the old format $options = preg_replace('{\\{\\d*\\}}', '', $options); if (!fn_is_empty($options)) { reset($option_ids); $options = fn_exim_parse_data($options, ',', $features_delimiter, true); $updated_ids = array(); // store updated ids, delete other (if exist) foreach ($options as $option_key => $option) { unset($_REQUEST['file_variant_image_image_icon'], $_REQUEST['variant_image_image_data']); $global_option = isset($option['global']) ? $option['global'] : false; if (!empty($option['group_name'])) { $company_id = fn_get_company_id_by_name($option['group_name']); } if ($lang_code == $main_lang) { $option_id = db_get_field("SELECT o.option_id FROM ?:product_options_descriptions as d INNER JOIN ?:product_options as o ON o.option_id = d.option_id AND o.product_id = ?i WHERE d.option_name = ?s AND d.lang_code = ?s LIMIT 1", $global_option ? 0 : $product_id, $option['name'], $lang_code); } else { if ($lang_code != $main_lang && empty($option_ids)) { continue 2; } $option_id = key($option_ids); } $variant_ids = array(); $option['variants'] = isset($option['variants']) ? $option['variants'] : array(); if ($lang_code == $main_lang) { foreach ($option['variants'] as $variant_pos => $variant) { $variant_ids[$variant_pos] = db_get_field("SELECT d.variant_id FROM ?:product_option_variants_descriptions as d INNER JOIN ?:product_option_variants as o ON o.variant_id = d.variant_id AND o.option_id = ?i WHERE d.variant_name = ?s AND d.lang_code = ?s LIMIT 1", $option_id, $variant['name'], $lang_code); } } else { $var_ids = $option_ids[$option_id]; foreach ($option['variants'] as $variant_pos => $variant) { $variant_id = current($var_ids); if ($lang_code != $main_lang && $variant_id === false) { continue 3; } next($var_ids); $variant_ids[$variant_pos] = $variant_id; } } $option_data = fn_exim_build_option_data($option, $option_id, $variant_ids, $lang_code); if (empty($option_data)) { continue; } $option_data['company_id'] = !empty($company_id) ? $company_id : 0; // Prepare variant images if (!empty($option_data['variants'])) { foreach ($option_data['variants'] as $key => $variant) { if (!empty($variant['image'])) { $_REQUEST['file_variant_image_image_icon'][$key] = $variant['image']; $_REQUEST['type_variant_image_image_icon'][$key] = 'server'; $_REQUEST['variant_image_image_data'][$key] = array('pair_id' => false, 'type' => 'V', 'object_id' => 0, 'image_alt' => ''); } } } if (empty($option_id)) { $option_data['product_id'] = !empty($global_option) ? 0 : $product_id; $option_data['position'] = $option_key; $updated_id = fn_update_product_option($option_data, 0, $lang_code); // Option is exist, update it } else { $option_data['product_id'] = $product_id; $updated_id = fn_update_product_option($option_data, $option_id, $lang_code); } if ($lang_code == $main_lang) { $option_ids[$updated_id] = array(); } if ($global_option) { $glob_link = array('option_id' => $updated_id, 'product_id' => $product_id); db_query('REPLACE INTO ?:product_global_option_links ?e', $glob_link); } $variant_ids = array(); if ($lang_code == $main_lang) { foreach ($option['variants'] as $variant_pos => $variant) { $variant_ids[$variant_pos] = db_get_field("SELECT d.variant_id FROM ?:product_option_variants_descriptions as d INNER JOIN ?:product_option_variants as o ON o.variant_id = d.variant_id AND o.option_id = ?i WHERE d.variant_name = ?s AND d.lang_code = ?s LIMIT 1", $updated_id, $variant['name'], $lang_code); $option_ids[$updated_id][] = $variant_ids[$variant_pos]; } } else { $var_ids = $option_ids[$updated_id]; foreach ($option['variants'] as $variant_pos => $variant) { $variant_id = current($var_ids); if ($lang_code != $main_lang && $variant_id === false) { continue 3; } next($var_ids); $variant_ids[$variant_pos] = db_get_field("SELECT d.variant_id FROM ?:product_option_variants_descriptions as d INNER JOIN ?:product_option_variants as o ON o.variant_id = d.variant_id AND o.option_id = ?i WHERE d.variant_name = ?s AND d.lang_code = ?s LIMIT 1", $updated_id, $variant_id, $lang_code); } } $updated_ids[] = $updated_id; } // Delete all other options if (!empty($updated_ids)) { $obsolete_ids = db_get_fields("SELECT option_id FROM ?:product_options WHERE option_id NOT IN (?n) AND product_id = ?i", $updated_ids, $product_id); if (!empty($obsolete_ids)) { foreach ($obsolete_ids as $o_id) { fn_delete_product_option($o_id, $product_id); } } } } } return true; }