function fn_exim_1c_offers($xml, $company_id, $lang_code) { $cml = fn_get_cml_tag_names(); $create_prices = Registry::get('addons.rus_exim_1c.exim_1c_create_prices'); $type_option = Registry::get('addons.rus_exim_1c.exim_1c_type_option'); $hide_product = Registry::get('addons.rus_exim_1c.exim_1c_add_out_of_stock'); $schema_version = Registry::get('addons.rus_exim_1c.exim_1c_schema_version'); if (isset($xml->{$cml}['packages']->{$cml}['prices_types']) && $create_prices == 'Y') { $prices_1c = array(); $_prices_1c = db_get_array("SELECT price_1c, type, usergroup_id FROM ?:rus_exim_1c_prices"); foreach ($xml->{$cml}['packages']->{$cml}['prices_types']->{$cml}['price_type'] as $_price) { foreach ($_prices_1c as $_price_1c) { if ($_price_1c['price_1c'] == strval($_price->{$cml}['name'])) { $_price_1c['external_id'] = strval($_price->{$cml}['id']); $prices_1c[] = $_price_1c; } } } } if (isset($xml->{$cml}['packages']->{$cml}['offers'])) { $standart_option_name = Registry::get('addons.rus_exim_1c.exim_1c_standart_option_name'); $import_mode = Registry::get('addons.rus_exim_1c.exim_1c_import_mode_offers'); $standart_option_name = Registry::get('addons.rus_exim_1c.exim_1c_import_option_name'); $options_data = $global_options_data = array(); foreach ($xml->{$cml}['packages']->{$cml}['offers']->{$cml}['offer'] as $offer) { $product = array(); $ids = fn_explode('#', strval($offer->{$cml}['id'])); $product_guid = array_shift($ids); $combination_guid = !empty($ids) ? array_shift($ids) : ''; $product_id = db_get_field("SELECT product_id FROM ?:products WHERE external_id = ?s", $product_guid); if (empty($product_id)) { continue; } $amount = 0; if (isset($offer->{$cml}['store'])) { foreach ($offer->{$cml}['store'] as $store) { $amount += strval($store[$cml['in_stock']]); } } if (isset($offer->{$cml}['amount'])) { $amount = strval($offer->{$cml}['amount']); } $prices = array(); if (isset($offer->{$cml}['prices'])) { if ($create_prices == 'Y') { foreach ($offer->{$cml}['prices']->{$cml}['price'] as $_price_data) { foreach ($prices_1c as $price_1c) { if (strval($_price_data->{$cml}['price_id']) == $price_1c['external_id']) { if ($price_1c['type'] == 'base') { $prices['base_price'] = strval($_price_data->{$cml}['price_per_item']); } if ($price_1c['type'] == 'list') { $prices['list_price'] = strval($_price_data->{$cml}['price_per_item']); } if ($price_1c['usergroup_id'] > 0) { $prices['qty_prices'][] = array('usergroup_id' => $price_1c['usergroup_id'], 'price' => strval($_price_data->{$cml}['price_per_item'])); } } } } } else { $prices['base_price'] = strval($offer->{$cml}['prices']->{$cml}['price']->{$cml}['price_per_item']); } } if (empty($prices)) { $prices['base_price'] = 0; } if (empty($combination_guid)) { db_query("UPDATE ?:products SET ?u WHERE product_id = ?i", array('amount' => $amount), $product_id); // To hide products if they are out of stock if ($hide_product == 'Y') { if ($amount == 0) { db_query("UPDATE ?:products SET status = 'H' WHERE product_id = ?i", $product_id); } } fn_exim_1c_add_price($prices, $product_id); } else { db_query("UPDATE ?:products SET ?u WHERE product_id = ?i", array('tracking' => 'O'), $product_id); if ($schema_version == '2.07') { if (!empty($prices['base_price'])) { fn_exim_1c_add_price(array('base_price' => 0), $product_id); } $option_id = db_get_field("SELECT option_id FROM ?:product_options WHERE product_id = ?i", $product_id); $variant_id = db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE external_id = ?s AND option_id = ?i", $combination_guid, $option_id); db_query("UPDATE ?:product_option_variants SET modifier = ?i WHERE variant_id = ?i", $prices['base_price'], $variant_id); $old_combination_hash = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE external_id = ?s", $combination_guid); $image_pair_id = db_get_field("SELECT pair_id FROM ?:images_links WHERE object_id = ?i", $old_combination_hash); db_query("DELETE FROM ?:product_options_inventory WHERE external_id = ?s AND product_id = ?i", $combination_guid, $product_id); $combination_data = array('product_id' => $product_id, 'combination_hash' => fn_generate_cart_id($product_id, array('product_options' => array($option_id => $variant_id))), 'combination' => fn_get_options_combination(array($option_id => $variant_id)), 'amount' => $amount, 'external_id' => $combination_guid); $variant_combination = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE combination_hash = ?i", $combination_data['combination_hash']); if (empty($variant_combination)) { db_query("INSERT INTO ?:product_options_inventory ?e", $combination_data); } if (!empty($image_pair_id)) { db_query("UPDATE ?:images_links SET object_id = ?i WHERE pair_id = ?i", $combination_data['combination_hash'], $image_pair_id); } continue; } if ($import_mode == 'standart') { $variant_name = ''; if (!empty($offer->{$cml}['product_features']->{$cml}['product_feature'])) { foreach ($offer->{$cml}['product_features']->{$cml}['product_feature'] as $feature_data) { $variant_name .= strval($feature_data->{$cml}['name']) . ':' . strval($feature_data->{$cml}['value']) . '; '; } } $options_data[$product_id][] = array('variant_name' => $variant_name, 'amount' => $amount, 'combination_guid' => $combination_guid, 'price' => $prices['base_price']); if (!empty($prices['base_price'])) { fn_exim_1c_add_price(array('base_price' => 0), $product_id); } } elseif ($import_mode == 'global_option') { $combination = array(); foreach ($offer->{$cml}['product_features']->{$cml}['product_feature'] as $feature_data) { if (isset($global_options_data[strval($feature_data->{$cml}['name'])])) { if (!in_array(strval($feature_data->{$cml}['value']), $global_options_data[strval($feature_data->{$cml}['name'])]['variants'])) { $global_options_data[strval($feature_data->{$cml}['name'])]['variants'][] = strval($feature_data->{$cml}['value']); } if (!in_array($product_id, $global_options_data[strval($feature_data->{$cml}['name'])]['product_ids'])) { $global_options_data[strval($feature_data->{$cml}['name'])]['product_ids'][] = $product_id; } } else { $global_options_data[strval($feature_data->{$cml}['name'])]['variants'][] = strval($feature_data->{$cml}['value']); $global_options_data[strval($feature_data->{$cml}['name'])]['product_ids'][] = $product_id; } $combination[] = array('option_name' => strval($feature_data->{$cml}['name']), 'variant_name' => strval($feature_data->{$cml}['value'])); } $options_data[$product_id][] = array('combination' => $combination, 'amount' => $amount, 'combination_guid' => $combination_guid); } elseif ($import_mode == 'individual_option') { $combination = array(); foreach ($offer->{$cml}['product_features']->{$cml}['product_feature'] as $feature_data) { $combination[] = array('option_name' => strval($feature_data->{$cml}['name']), 'variant_name' => strval($feature_data->{$cml}['value'])); } $options_data[$product_id][] = array('combination' => $combination, 'amount' => $amount, 'combination_guid' => $combination_guid); } } } if ($schema_version == '2.07') { return; } if ($import_mode == 'standart') { foreach ($options_data as $pid => $variants_data) { $option_id = db_get_field("SELECT option_id FROM ?:product_options WHERE product_id = ?i", $pid); $option_id = empty($option_id) ? 0 : $option_id; $option_data = fn_exim_1c_create_option_structure($pid, $standart_option_name, $company_id, $type_option); foreach ($variants_data as $variant_data) { $variant_id = db_get_field("SELECT variants.variant_id FROM ?:product_option_variants AS variants " . "LEFT JOIN ?:product_option_variants_descriptions AS variants_descriptions ON variants.variant_id = variants_descriptions.variant_id " . "WHERE variants.option_id = ?i AND variants_descriptions.lang_code = ?s AND variants_descriptions.variant_name = ?s", $option_id, $lang_code, $variant_data['variant_name']); $variant_id = empty($variant_id) ? 0 : $variant_id; $option_data['variants'][] = array('variant_name' => $variant_data['variant_name'], 'variant_id' => $variant_id, 'modifier_type' => 'A', 'modifier' => $variant_data['price'], 'weight_modifier' => 0, 'weight_modifier_type' => 'A', 'external_id' => $variant_data['combination_guid']); } $option_id = fn_update_product_option($option_data, $option_id, $lang_code); $empty_stock = true; foreach ($variants_data as $variant_data) { $variant_id = db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE external_id = ?s AND option_id = ?i", $variant_data['combination_guid'], $option_id); $old_combination_hash = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE external_id = ?s", $variant_data['combination_guid']); $image_pair_id = db_get_field("SELECT pair_id FROM ?:images_links WHERE object_id = ?i", $old_combination_hash); db_query("DELETE FROM ?:product_options_inventory WHERE external_id = ?s AND product_id = ?i", $variant_data['combination_guid'], $pid); $combination_data = array('product_id' => $pid, 'combination_hash' => fn_generate_cart_id($pid, array('product_options' => array($option_id => $variant_id))), 'combination' => fn_get_options_combination(array($option_id => $variant_id)), 'amount' => $variant_data['amount'], 'external_id' => $variant_data['combination_guid']); $variant_combination = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE combination_hash = ?i", $combination_data['combination_hash']); if (empty($variant_combination)) { db_query("INSERT INTO ?:product_options_inventory ?e", $combination_data); } if (!empty($image_pair_id)) { db_query("UPDATE ?:images_links SET object_id = ?i WHERE pair_id = ?i", $combination_data['combination_hash'], $image_pair_id); } if ($variant_data['amount'] > 0) { $empty_stock = false; } } // To hide products if they are out of stock if ($hide_product == 'Y') { if ($empty_stock) { db_query("UPDATE ?:products SET status = 'H' WHERE product_id = ?i", $pid); } } } } elseif ($import_mode == 'global_option') { foreach ($global_options_data as $option => &$global_option_data) { $option_id = db_get_field("SELECT options.option_id FROM ?:product_options AS options " . "LEFT JOIN ?:product_options_descriptions AS options_descriptions ON options.option_id = options_descriptions.option_id " . "WHERE options.product_id = 0 AND options_descriptions.option_name = ?s", $option); $option_id = empty($option_id) ? 0 : $option_id; $option_data = fn_exim_1c_create_option_structure(0, $option, $company_id, $type_option); if ($option_id != 0) { $old_variants = db_get_fields("SELECT variants_descriptions.variant_name FROM ?:product_option_variants AS variants " . "LEFT JOIN ?:product_option_variants_descriptions AS variants_descriptions ON variants.variant_id = variants_descriptions.variant_id " . "WHERE variants.option_id = ?i AND variants_descriptions.lang_code = ?s", $option_id, $lang_code); $old_variants = array_diff($old_variants, $global_option_data['variants']); $global_option_data['variants'] = fn_array_merge($global_option_data['variants'], $old_variants); } foreach ($global_option_data['variants'] as $variant) { $variant_id = db_get_field("SELECT variants.variant_id FROM ?:product_option_variants AS variants " . "LEFT JOIN ?:product_option_variants_descriptions AS variants_descriptions ON variants.variant_id = variants_descriptions.variant_id " . "WHERE variants.option_id = ?i AND variants_descriptions.lang_code = ?s AND variants_descriptions.variant_name = ?s", $option_id, $lang_code, $variant); $variant_id = empty($variant_id) ? 0 : $variant_id; $option_data['variants'][] = array('variant_name' => $variant, 'variant_id' => $variant_id, 'modifier_type' => 'A', 'modifier' => 0, 'weight_modifier' => 0, 'weight_modifier_type' => 'A'); } $option_id = fn_update_product_option($option_data, $option_id, $lang_code); $global_option_data['option_id'] = $option_id; foreach ($global_option_data['product_ids'] as $product_id) { db_query("REPLACE INTO ?:product_global_option_links ?e", array('option_id' => $option_id, 'product_id' => $product_id)); } } foreach ($options_data as $pid => $combinations) { foreach ($combinations as $_combination_data) { $add_options_combination = array(); foreach ($_combination_data['combination'] as $combination) { $option_id = $global_options_data[$combination['option_name']]['option_id']; $variant_id = db_get_field("SELECT variants_descriptions.variant_id FROM ?:product_option_variants AS variants " . "LEFT JOIN ?:product_option_variants_descriptions AS variants_descriptions ON variants.variant_id = variants_descriptions.variant_id " . "WHERE lang_code = ?s AND option_id = ?i AND variant_name = ?s", $lang_code, $option_id, $combination['variant_name']); $add_options_combination[$option_id] = $variant_id; } $old_combination_hash = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE external_id = ?s", $_combination_data['combination_guid']); $image_pair_id = db_get_field("SELECT pair_id FROM ?:images_links WHERE object_id = ?i", $old_combination_hash); $empty_stock = true; db_query("DELETE FROM ?:product_options_inventory WHERE external_id = ?s AND product_id = ?i", $_combination_data['combination_guid'], $pid); $combination_data = array('product_id' => $pid, 'combination_hash' => fn_generate_cart_id($pid, array('product_options' => $add_options_combination)), 'combination' => fn_get_options_combination($add_options_combination), 'amount' => $_combination_data['amount'], 'external_id' => $_combination_data['combination_guid']); db_query("INSERT INTO ?:product_options_inventory ?e", $combination_data); if (!empty($image_pair_id)) { db_query("UPDATE ?:images_links SET object_id = ?i WHERE pair_id = ?i", $combination_data['combination_hash'], $image_pair_id); } if ($combination_data['amount'] > 0) { $empty_stock = false; } } // To hide products if they are out of stock if ($hide_product == 'Y') { if ($empty_stock) { db_query("UPDATE ?:products SET status = 'H' WHERE product_id = ?i", $pid); } } } } elseif ($import_mode == 'individual_option') { foreach ($options_data as $pid => $combinations) { foreach ($combinations as $_combination_data) { $add_options_combination = array(); foreach ($_combination_data['combination'] as $combination) { $option_id = db_get_field("SELECT options.option_id FROM ?:product_options AS options " . "LEFT JOIN ?:product_options_descriptions AS options_descriptions ON options.option_id = options_descriptions.option_id " . "WHERE options_descriptions.lang_code = ?s AND options_descriptions.option_name = ?s AND options.product_id = ?i", $lang_code, $combination['option_name'], $pid); $option_id = empty($option_id) ? 0 : $option_id; $option_data = fn_exim_1c_create_option_structure($pid, $combination['option_name'], $company_id, $type_option); $option_id = fn_update_product_option($option_data, $option_id, $lang_code); $variant_id = db_get_field("SELECT variants_descriptions.variant_id FROM ?:product_option_variants AS variants " . "LEFT JOIN ?:product_option_variants_descriptions AS variants_descriptions ON variants.variant_id = variants_descriptions.variant_id " . "WHERE variants_descriptions.lang_code = ?s AND variants.option_id = ?i AND variants_descriptions.variant_name = ?s", $lang_code, $option_id, $combination['variant_name']); if (empty($variant_id)) { $variant = array('option_id' => $option_id, 'modifier_type' => 'A', 'modifier' => 0, 'weight_modifier' => 0, 'weight_modifier_type' => 'A'); $variant_id = db_query("INSERT INTO ?:product_option_variants ?e", $variant); $variant = array('variant_id' => $variant_id, 'variant_name' => $combination['variant_name'], 'lang_code' => $lang_code); db_query("INSERT INTO ?:product_option_variants_descriptions ?e", $variant); } $add_options_combination[$option_id] = $variant_id; } $old_combination_hash = db_get_field("SELECT combination_hash FROM ?:product_options_inventory WHERE external_id = ?s", $_combination_data['combination_guid']); $image_pair_id = db_get_field("SELECT pair_id FROM ?:images_links WHERE object_id = ?i", $old_combination_hash); $empty_stock = true; db_query("DELETE FROM ?:product_options_inventory WHERE external_id = ?s AND product_id = ?i", $_combination_data['combination_guid'], $pid); $combination_data = array('product_id' => $pid, 'combination_hash' => fn_generate_cart_id($pid, array('product_options' => $add_options_combination)), 'combination' => fn_get_options_combination($add_options_combination), 'amount' => $_combination_data['amount'], 'external_id' => $_combination_data['combination_guid']); db_query("INSERT INTO ?:product_options_inventory ?e", $combination_data); if (!empty($image_pair_id)) { db_query("UPDATE ?:images_links SET object_id = ?i WHERE pair_id = ?i", $combination_data['combination_hash'], $image_pair_id); } if ($combination_data['amount'] > 0) { $empty_stock = false; } } // To hide products if they are out of stock if ($hide_product == 'Y') { if ($empty_stock) { db_query("UPDATE ?:products SET status = 'H' WHERE product_id = ?i", $pid); } } } } } }
if ($mode == 'update') { fn_trusted_vars('option_data', 'regexp'); if (fn_allowed_for('MULTIVENDOR')) { $option_data = array(); if (!empty($_REQUEST['option_id'])) { $condition = fn_get_company_condition('?:product_options.company_id'); $option_data = db_get_row("SELECT * FROM ?:product_options WHERE option_id = ?i {$condition}", $_REQUEST['option_id']); if (empty($option_data)) { fn_set_notification('W', __('warning'), __('access_denied')); return array(CONTROLLER_STATUS_REDIRECT, 'product_options.manage'); } } $_REQUEST['option_data'] = array_merge($option_data, $_REQUEST['option_data']); fn_set_company_id($_REQUEST['option_data']); } $option_id = fn_update_product_option($_REQUEST['option_data'], $_REQUEST['option_id'], DESCR_SL); if (!empty($_REQUEST['object']) && $_REQUEST['object'] == 'product') { // FIXME (when assigning page and current url will be removed from ajax) return array(CONTROLLER_STATUS_OK, $_SERVER['HTTP_REFERER'] . '&selected_section=options'); } $suffix = ".manage"; } if ($mode == 'delete') { if (!empty($_REQUEST['option_id']) && fn_check_company_id('product_options', 'option_id', $_REQUEST['option_id']) || !empty($_REQUEST['product_id']) && fn_check_company_id('products', 'product_id', $_REQUEST['product_id'])) { $p_id = db_get_field("SELECT product_id FROM ?:product_options WHERE option_id = ?i", $_REQUEST['option_id']); if (!empty($_REQUEST['product_id']) && empty($p_id)) { // we're deleting global option from the product db_query("DELETE FROM ?:product_global_option_links WHERE product_id = ?i AND option_id = ?i", $_REQUEST['product_id'], $_REQUEST['option_id']); } else { fn_delete_product_option($_REQUEST['option_id']); }
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; }
public static function addProductCombinationsNewSchema($combinations, $product_id, $import_params, $combination_id = 0, $variant_data = array()) { $add_options_combination = array(); $amount = 0; $cml = self::$cml; $import_mode = self::$s_commerceml['exim_1c_import_mode_offers']; $option_params = array('product_id' => $product_id, 'option_name' => self::$s_commerceml['exim_1c_import_option_name'], 'company_id' => self::$company_id, 'option_type' => self::$s_commerceml['exim_1c_type_option'], 'required' => 'N', 'inventory' => 'Y', 'multiupload' => 'M'); $option_id = self::dataProductOption($product_id, $import_params['lang_code']); if (empty($combination_id)) { $option_data = $option_params; foreach ($combinations as $_combination) { if (!empty($option_id)) { list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], strval($_combination->{$cml}['name']), strval($_combination->{$cml}['id'])); } $variant_id = !empty($data_variant['variant_id']) ? $data_variant['variant_id'] : 0; if (!empty($r_data_variants)) { $option_data['variants'] = $r_data_variants; } $option_data['variants'][] = array('variant_name' => strval($_combination->{$cml}['name']), 'variant_id' => $variant_id, 'external_id' => strval($_combination->{$cml}['id'])); $option_id = fn_update_product_option($option_data, $option_id, $import_params['lang_code']); self::addMessageLog('Added option = ' . $option_data['option_name'] . ', variant = ' . strval($_combination->{$cml}['name'])); list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], strval($_combination->{$cml}['name']), strval($_combination->{$cml}['id'])); if (!empty($data_variant['variant_id'])) { $add_options_combination[$option_id] = $data_variant['variant_id']; self::addNewCombination($product_id, strval($_combination->{$cml}['id']), $add_options_combination, $import_params); } } } else { if ($import_mode == 'standart') { $option_data = $option_params; $d_variant = array('variant_name' => '', 'lang_code' => $import_params['lang_code'], 'external_id' => $combination_id); foreach ($combinations as $_combination) { $d_variant['variant_name'] .= strval($_combination->{$cml}['name']) . ': ' . strval($_combination->{$cml}['value']) . '; '; } if (!empty($variant_data['price'])) { if (self::$s_commerceml['exim_1c_option_price'] == 'N') { $d_variant['modifier'] = $variant_data['price']; } else { $d_variant['modifier'] = '0.00'; } } if (!empty($option_id)) { list($data_variant, $option_data['variants']) = self::dataProductVariants($option_id, $import_params['lang_code'], $d_variant['variant_name'], $combination_id); } $d_variant['variant_id'] = !empty($data_variant['variant_id']) ? $data_variant['variant_id'] : 0; $option_data['variants'][] = $d_variant; $option_id = fn_update_product_option($option_data, $option_id, $import_params['lang_code']); self::addMessageLog('Added option = ' . $option_data['option_name'] . ', variant = ' . $d_variant['variant_name']); list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], $d_variant['variant_name'], $combination_id); if (!empty($data_variant['variant_id'])) { $add_options_combination[$option_id] = $data_variant['variant_id']; } } elseif ($import_mode == 'global_option') { $option_params['product_id'] = 0; foreach ($combinations as $_combination) { $option_data = $option_params; $combination_name = strval($_combination->{$cml}['name']); $combination_value = strval($_combination->{$cml}['value']); $option_id = self::dataProductOption(0, $import_params['lang_code'], $combination_name); $option_data['option_name'] = $combination_name; if (!empty($_combination->{$cml}['id'])) { $option_data['external_id'] = strval($_combination->{$cml}['id']); } $option_data['variants'][] = array('variant_id' => 0, 'variant_name' => $combination_value, 'lang_code' => $import_params['lang_code'], 'modifier_type' => 'A', 'modifier' => 0, 'weight_modifier' => 0, 'weight_modifier_type' => 'A'); if ($option_id != 0) { list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], $combination_value); if (!empty($data_variant)) { $option_data['variants'] = array($data_variant); } if (!empty($r_data_variants)) { $option_data['variants'] = array_merge($option_data['variants'], $r_data_variants); } } $option_id = fn_update_product_option($option_data, $option_id, $import_params['lang_code']); self::addMessageLog('Added option = ' . $option_data['option_name'] . ', variant = ' . $combination_value); db_query("REPLACE INTO ?:product_global_option_links ?e", array('option_id' => $option_id, 'product_id' => $product_id)); list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], $combination_value); if (!empty($data_variant['variant_id'])) { $add_options_combination[$option_id] = $data_variant['variant_id']; } } } elseif ($import_mode == 'individual_option') { foreach ($combinations as $_combination) { $option_data = $option_params; $combination_name = strval($_combination->{$cml}['name']); $combination_value = strval($_combination->{$cml}['value']); $option_id = self::dataProductOption($product_id, $import_params['lang_code'], $combination_name); $option_data['option_name'] = $combination_name; if (!empty($_combination->{$cml}['id'])) { $option_data['external_id'] = strval($_combination->{$cml}['id']); } $option_data['variants'][] = array('option_id' => $option_id, 'variant_id' => 0, 'variant_name' => $combination_value, 'lang_code' => $import_params['lang_code'], 'modifier_type' => 'A', 'modifier' => 0, 'weight_modifier' => 0, 'weight_modifier_type' => 'A'); list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], $combination_value); if (!empty($data_variant)) { $option_data['variants'] = array($data_variant); } if (!empty($r_data_variants)) { $option_data['variants'] = array_merge($option_data['variants'], $r_data_variants); } $option_id = fn_update_product_option($option_data, $option_id, $import_params['lang_code']); self::addMessageLog('Added option = ' . $option_data['option_name'] . ', variant = ' . $combination_value); list($data_variant, $r_data_variants) = self::dataProductVariants($option_id, $import_params['lang_code'], $combination_value); if (!empty($data_variant)) { $add_options_combination[$option_id] = $data_variant['variant_id']; } } } if (!empty($variant_data['amount'])) { $amount = $variant_data['amount']; } if (!empty($add_options_combination)) { self::addNewCombination($product_id, $combination_id, $add_options_combination, $import_params, $amount); } } }
public function update($id, $params) { $status = Response::STATUS_OK; $data = array(); $product_id = $this->safeGet($params, 'product_id', 0); if (empty($product_id)) { $product_id = db_get_field('SELECT product_id FROM ?:product_options WHERE option_id = ?i', $id); } list($_status, $message) = $this->checkProductId($product_id); if ($_status != Response::STATUS_OK) { return array('status' => $status, 'data' => array('message' => $message)); } $params['company_id'] = $this->getCompanyId(); $lang_code = $this->safeGet($params, 'lang_code', DEFAULT_LANGUAGE); $this->prepareImages($params, 0, 'variant_image'); $option_id = fn_update_product_option($params, $id, $lang_code); if ($option_id) { $data = array('option_id' => $option_id); } else { $status = Response::STATUS_BAD_REQUEST; } return array('status' => $status, 'data' => $data); }
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; }
function fn_exim_set_product_options($product_id, $data, $lang_code = '') { $pair_delimiter = ':'; $set_delimiter = ';'; $vars_delimiter = ','; if (!empty($data)) { $options = explode($set_delimiter, $data); if (!empty($options)) { $updated_ids = array(); // store updated ids, delete other (if exist) $o_position = 0; foreach ($options as $option) { $o_position += 10; $pair = explode($pair_delimiter, $option); $variants = ''; if (is_array($pair)) { array_walk($pair, 'fn_trim_helper'); if (($pos = strpos($pair[1], '[')) !== false) { // option has variants $variants = substr($pair[1], $pos + 1, strlen($pair[1]) - $pos - 2); $variants = explode($vars_delimiter, $variants); } $option_str = explode('_', fn_exim_get_item_id($pair[0])); $option_id = $option_str[0]; $global_option = !empty($option_str[1]) && $option_str[1] == 'L'; if ($global_option) { $glob_link = array('option_id' => $option_id, 'product_id' => $product_id); db_query('REPLACE INTO ?:product_global_option_links ?e', $glob_link); } $_restore = false; if (!empty($option_id)) { $_restore = !db_get_field("SELECT option_id FROM ?:product_options WHERE option_id = ?i", $option_id); } // Check if product option exists - FIXME!!! Global? if (empty($option_id)) { $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", $product_id, $pair[0], $lang_code); } $option_type = substr($pair[1], 0, 1); // Generate array for variants $v_data = array(); $v_data_ids = array(); if (!empty($variants) && is_array($variants)) { $position = 0; foreach ($variants as $v) { $position += 10; $v_data[] = array('variant_name' => $v, 'position' => $position); if ($variant_id = fn_exim_get_item_id($v)) { $v_data_ids[] = array('variant_id' => $variant_id, 'variant_name' => $v, 'position' => $position); } } } if ($option_type == 'C') { $v_data = $v_data_ids = array(); if (!empty($option_id)) { // check if variant exist $v_data_ids = db_get_array("SELECT * FROM ?:product_option_variants WHERE option_id = ?i AND position = 1", $option_id); } // If not, generate default variant if (empty($v_data_ids)) { $v_data_ids = array(array('position' => 1)); } } $option_data = array('option_name' => $pair[0], 'option_type' => $option_type, 'variants' => empty($v_data_ids) ? $v_data : $v_data_ids); // Option doesn't exist, create new if (empty($option_id) || $_restore) { if ($_restore) { $option_data['option_id'] = $option_id; } $option_data['product_id'] = !empty($global_option) ? 0 : $product_id; $option_data['position'] = $o_position; $updated_ids[] = fn_update_product_option($option_data, 0, $lang_code); // Option is exist, update it } else { $updated_ids[] = fn_update_product_option($option_data, $option_id, $lang_code); } } } // 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; }