/** * Import product features * * @param int $product_id Product ID * @param array $data Array of delimited lists of product features and their values * @param string $features_delimiter Delimiter symbol * @param boolean Always true */ function fn_exim_set_product_features($product_id, $data, $features_delimiter, $lang_code, $store_name = '') { //for compatibility with the old format $data = preg_replace('{\\{\\d*\\}}', '', $data); $variants = array(); $products_features = db_get_array("SELECT feature_id, variant_id FROM ?:product_features_values WHERE product_id = ?i", $product_id); foreach ($products_features as $key => $variant) { $variants[$variant['feature_id']] = ''; } if (!fn_is_empty($data)) { $data = fn_exim_parse_data($data, $features_delimiter); $company_id = 0; if (fn_allowed_for('ULTIMATE')) { if (Registry::get('runtime.company_id')) { $company_id = Registry::get('runtime.company_id'); } else { $company_id = fn_get_company_id_by_name($store_name); } } foreach ($data as $feature) { // import features if (!empty($feature['group_name'])) { $group_id = fn_exim_check_feature_group($feature['group_name'], $company_id, $lang_code); } else { $group_id = 0; } $condition = db_quote("WHERE description = ?s AND lang_code = ?s AND feature_type = ?s", $feature['name'], $lang_code, $feature['type']); $condition .= db_quote(" AND parent_id = ?i", $group_id); $feature_id = db_get_field('SELECT ?:product_features.feature_id FROM ?:product_features_descriptions ' . 'LEFT JOIN ?:product_features ON ?:product_features.feature_id = ?:product_features_descriptions.feature_id ' . $condition); if (empty($feature_id)) { $feature_data = array('description' => $feature['name'], 'company_id' => $company_id, 'feature_type' => $feature['type'], 'parent_id' => $group_id); $feature_id = fn_update_product_feature($feature_data, 0, $lang_code); } if (fn_allowed_for('ULTIMATE')) { fn_exim_update_share_feature($feature_id, $company_id); } $variants = fn_exim_product_feature_variants($feature, $feature_id, $variants, $lang_code); } fn_update_product_features_value($product_id, $variants, array(), $lang_code); } return true; }
function fn_exim_set_product_features($product_id, $data, $features_delimiter, $lang_code = '') { $pair_delimiter = ':'; $set_delimiter = ';'; if (!empty($data)) { if (preg_match_all("/[ ]*(\\{\\d+\\})?[ ]*(\\(.+?\\))?[ ]*(.+?):[ ]*([\\w]{1})[ ]*\\[(.*?)\\];?/", $data, $features)) { // First, delete all links to features db_query("DELETE FROM ?:product_features_values WHERE product_id = ?i AND lang_code = ?s", $product_id, $lang_code); foreach ($features[3] as $k => $feature) { // feature data $feature_id_csv = fn_exim_get_item_id($features[1][$k]); $feature_type = $features[4][$k]; $vars = fn_explode($features_delimiter, $features[5][$k]); // find group_id $group_id = 0; $group_exists = true; if (!empty($features[2][$k])) { $group_id = fn_exim_check_feature_group($features[2][$k], $lang_code, $group_exists); } // try to find similar feature (same description, type, parent) $feature_id = 0; if ($group_exists) { $feature_id = db_get_field('SELECT ?:product_features.feature_id FROM ?:product_features_descriptions ' . 'LEFT JOIN ?:product_features ON ?:product_features.feature_id = ?:product_features_descriptions.feature_id ' . 'WHERE description = ?s AND lang_code = ?s AND feature_type = ?s AND parent_id = ?i LIMIT 1', $feature, $lang_code, $feature_type, $group_id); } if (empty($feature_id)) { // insert new feature $feature_data = array('feature_type' => $feature_type, 'parent_id' => $group_id, 'description' => $feature); if (!empty($feature_id_csv)) { $existent_id = db_get_field('SELECT feature_id FROM ?:product_features WHERE feature_id = ?i', $feature_id_csv); if (empty($existent_id)) { $feature_data['feature_id'] = $feature_id_csv; } } $feature_id = $feature_data['feature_id'] = db_query("INSERT INTO ?:product_features ?e", $feature_data); foreach ((array) Registry::get('languages') as $feature_data['lang_code'] => $_v) { db_query("REPLACE INTO ?:product_features_descriptions ?e", $feature_data); } } // import feature variants $i_data = array('product_id' => $product_id, 'lang_code' => $lang_code, 'feature_id' => $feature_id); if (strpos('MSNE', $feature_type) !== false) { // variant IDs $existent_variants = db_get_hash_single_array('SELECT pfvd.variant_id, variant FROM ?:product_feature_variant_descriptions AS pfvd ' . 'LEFT JOIN ?:product_feature_variants AS pfv ON pfv.variant_id = pfvd.variant_id ' . 'WHERE feature_id = ?i AND variant IN (?a) AND lang_code = ?s', array('variant_id', 'variant'), $feature_id, $vars, $lang_code); foreach ($vars as $v) { if (in_array($v, $existent_variants)) { // variant exists $i_data['variant_id'] = array_search($v, $existent_variants); } else { // add variant $v_data = array('feature_id' => $feature_id); $variant_id = db_query("INSERT INTO ?:product_feature_variants ?e", $v_data); $v_data = array('variant_id' => $variant_id, 'variant' => $v); foreach ((array) Registry::get('languages') as $v_data['lang_code'] => $_v) { db_query("INSERT INTO ?:product_feature_variant_descriptions ?e", $v_data); } $i_data['variant_id'] = $variant_id; } //db_query("REPLACE INTO ?:product_features_values ?e", $i_data); foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) { db_query("REPLACE INTO ?:product_features_values ?e", $i_data); } } } elseif (strpos('OD', $feature_type) !== false) { // value INT $i_data['value_int'] = $feature_type == 'D' && strpos($vars[0], '/') !== false ? fn_parse_date($vars[0]) : $vars[0]; //db_query("REPLACE INTO ?:product_features_values ?e", $i_data); foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) { db_query("REPLACE INTO ?:product_features_values ?e", $i_data); } } else { // TEXT $i_data['value'] = $vars[0]; //db_query("REPLACE INTO ?:product_features_values ?e", $i_data); foreach ((array) Registry::get('languages') as $i_data['lang_code'] => $_v) { db_query("REPLACE INTO ?:product_features_values ?e", $i_data); } } } } } return true; }