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;
}
Example #2
0
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;
}