コード例 #1
0
ファイル: func.php プロジェクト: askzap/ask-zap
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);
                    }
                }
            }
        }
    }
}
コード例 #2
0
ファイル: product_options.php プロジェクト: heg-arc-ne/cscart
 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']);
         }
コード例 #3
0
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;
}
コード例 #4
0
 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);
         }
     }
 }
コード例 #5
0
ファイル: Options.php プロジェクト: askzap/ultimate
 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);
 }
コード例 #6
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;
}
コード例 #7
0
ファイル: products.php プロジェクト: diedsmiling/busenika
 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;
 }