function fn_delete_group($group_id) { db_query("DELETE FROM ?:conf_groups WHERE group_id = ?i", $group_id); db_query("DELETE FROM ?:conf_group_products WHERE group_id = ?i", $group_id); db_query("DELETE FROM ?:conf_product_groups WHERE group_id = ?i", $group_id); db_query("DELETE FROM ?:conf_group_descriptions WHERE group_id = ?i", $group_id); fn_delete_image_pairs($group_id, 'conf_group'); // Reset all classes in this group db_query("UPDATE ?:conf_classes SET group_id = 0 WHERE group_id = ?i", $group_id); }
$inventory_ids[] = $i['combination_hash']; } fn_attach_aditional_image_pairs('product_option_add_additional', 'product_option', 0, CART_LANGUAGE, $inventory_ids); if (!empty($_REQUEST['inventory'])) { foreach ($_REQUEST['inventory'] as $k => $v) { db_query("UPDATE ?:product_options_inventory SET ?u WHERE combination_hash = ?s", $v, $k); if ($inventory[$k]['amount'] <= 0 && $v['amount'] > 0) { fn_send_product_notifications($_REQUEST['product_id']); } } } $suffix = ".inventory?product_id={$_REQUEST['product_id']}"; } if ($mode == 'm_delete_combinations') { foreach ($_REQUEST['combination_hashes'] as $v) { fn_delete_image_pairs($v, 'product_option'); db_query("DELETE FROM ?:product_options_inventory WHERE combination_hash = ?i", $v); } $suffix = ".inventory?product_id={$_REQUEST['product_id']}"; } // Apply global options to the selected products if ($mode == 'apply') { if (!empty($_REQUEST['apply_options']['options'])) { $_data = $_REQUEST['apply_options']; foreach ($_data['options'] as $key => $value) { $products_ids = empty($_data['product_ids']) ? array() : explode(',', $_data['product_ids']); foreach ($products_ids as $k) { $updated_products[$k] = db_get_row("SELECT a.product_id, a.company_id, b.product FROM ?:products as a" . " LEFT JOIN ?:product_descriptions as b ON a.product_id = b.product_id" . " AND lang_code = ?s" . " WHERE a.product_id = ?i", CART_LANGUAGE, $k); if ($_data['link'] == 'N') { fn_clone_product_options(0, $k, $value); } else {
/** * Import image pair * * @param string $prefix path prefix * @param string $image_file thumbanil path or filename * @param string $detailed_path detailed image path or filename * @param string $position image position * @param string $type pair type * @param int $object_id ID of object to attach images to * @param string $object name of object to attach images to * @return array|bool True if images were imported */ function fn_import_images($prefix, $image_file, $detailed_file, $position, $type, $object_id, $object) { static $updated_products = array(); if (!empty($object_id)) { // Process multilang requests if (!is_array($object_id)) { $object_id = array($object_id); } foreach ($object_id as $_id) { if (empty($updated_products[$_id]) && !empty($_REQUEST['import_options']['remove_images']) && $_REQUEST['import_options']['remove_images'] == 'Y') { $updated_products[$_id] = true; fn_delete_image_pairs($_id, $object, 'A'); } $_REQUEST["server_import_image_icon"] = ''; $_REQUEST["type_import_image_icon"] = ''; // Get image alternative text if exists if (!empty($image_file) && strpos($image_file, '#') !== false) { list($image_file, $image_alt) = explode('#', $image_file); } if (!empty($detailed_file) && strpos($detailed_file, '#') !== false) { list($detailed_file, $detailed_alt) = explode('#', $detailed_file); } if (!empty($image_alt)) { preg_match_all('/\\[([A-Za-z]+?)\\]:(.*?);/', $image_alt, $matches); if (!empty($matches[1]) && !empty($matches[2])) { $image_alt = array_combine(array_values($matches[1]), array_values($matches[2])); } } if (!empty($detailed_alt)) { preg_match_all('/\\[([A-Za-z]+?)\\]:(.*?);/', $detailed_alt, $matches); if (!empty($matches[1]) && !empty($matches[2])) { $detailed_alt = array_combine(array_values($matches[1]), array_values($matches[2])); } } $type_image_detailed = strpos($detailed_file, '://') === false ? 'server' : 'url'; $type_image_icon = strpos($image_file, '://') === false ? 'server' : 'url'; $_REQUEST["type_import_image_icon"] = array($type_image_icon); $_REQUEST["type_import_image_detailed"] = array($type_image_detailed); $image_file = fn_find_file($prefix, $image_file); if ($image_file !== false) { if ($type_image_icon == 'url') { $_REQUEST["file_import_image_icon"] = array($image_file); } elseif (strpos($image_file, Registry::get('config.dir.root')) === 0) { $_REQUEST["file_import_image_icon"] = array(str_ireplace(fn_get_files_dir_path(), '', $image_file)); } else { fn_set_notification('E', __('error'), __('error_images_need_located_root_dir')); $_REQUEST["file_import_image_detailed"] = array(); } } else { $_REQUEST["file_import_image_icon"] = array(); } $detailed_file = fn_find_file($prefix, $detailed_file); if ($detailed_file !== false) { if ($type_image_detailed == 'url') { $_REQUEST["file_import_image_detailed"] = array($detailed_file); } elseif (strpos($detailed_file, Registry::get('config.dir.root')) === 0) { $_REQUEST["file_import_image_detailed"] = array(str_ireplace(fn_get_files_dir_path(), '', $detailed_file)); } else { fn_set_notification('E', __('error'), __('error_images_need_located_root_dir')); $_REQUEST["file_import_image_detailed"] = array(); } } else { $_REQUEST["file_import_image_detailed"] = array(); } $_REQUEST['import_image_data'] = array(array('type' => $type, 'image_alt' => empty($image_alt) ? '' : $image_alt, 'detailed_alt' => empty($detailed_alt) ? '' : $detailed_alt, 'position' => empty($position) ? 0 : $position)); $result = fn_attach_image_pairs('import', $object, $_id); } return $result; } return false; }
/** * Deletes logo by type * @param string $type logo type * @param integer $company_id - ID of company to delete logo for * @return bool always true */ function fn_delete_logo($type, $company_id = null, $style_id = '') { $condition = ''; if (!empty($company_id)) { $condition .= db_quote(" AND company_id = ?i", $company_id); } if (!empty($style_id)) { $condition .= db_quote(" AND style_id = ?s", $style_id); } $logo_ids = db_get_fields("SELECT logo_id FROM ?:logos WHERE type = ?s ?p", $type, $condition); foreach ($logo_ids as $logo_id) { fn_delete_image_pairs($logo_id, 'logos'); } db_query("DELETE FROM ?:logos WHERE logo_id IN (?n)", $logo_ids); return true; }
function fn_banners_update_banner($data, $banner_id, $lang_code = DESCR_SL) { if (isset($data['timestamp'])) { $data['timestamp'] = fn_parse_date($data['timestamp']); } $data['localization'] = empty($data['localization']) ? '' : fn_implode_localizations($data['localization']); if (!empty($banner_id)) { db_query("UPDATE ?:banners SET ?u WHERE banner_id = ?i", $data, $banner_id); db_query("UPDATE ?:banner_descriptions SET ?u WHERE banner_id = ?i AND lang_code = ?s", $data, $banner_id, $lang_code); $banner_image_id = fn_get_banner_image_id($banner_id, $lang_code); $banner_image_exist = !empty($banner_image_id); $banner_is_multilang = Registry::get('addons.banners.banner_multilang') == 'Y'; $image_is_update = fn_banners_need_image_update(); if ($banner_is_multilang) { if ($banner_image_exist && $image_is_update) { fn_delete_image_pairs($banner_image_id, 'promo'); db_query("DELETE FROM ?:banner_images WHERE banner_id = ?i AND lang_code = ?s", $banner_id, $lang_code); $banner_image_exist = false; } } else { if (isset($data['url'])) { db_query("UPDATE ?:banner_descriptions SET url = ?s WHERE banner_id = ?i", $data['url'], $banner_id); } } if ($image_is_update && !$banner_image_exist) { $banner_image_id = db_query("INSERT INTO ?:banner_images (banner_id, lang_code) VALUE(?i, ?s)", $banner_id, $lang_code); } $pair_data = fn_attach_image_pairs('banners_main', 'promo', $banner_image_id, $lang_code); if (!$banner_is_multilang && !$banner_image_exist) { fn_banners_image_all_links($banner_id, $pair_data, $lang_code); } } else { $banner_id = $data['banner_id'] = db_query("REPLACE INTO ?:banners ?e", $data); foreach (Languages::getAll() as $data['lang_code'] => $v) { db_query("REPLACE INTO ?:banner_descriptions ?e", $data); } if (fn_banners_need_image_update()) { $data_banner_image = array('banner_id' => $banner_id, 'lang_code' => $lang_code); $banner_image_id = db_get_next_auto_increment_id('banner_images'); $pair_data = fn_attach_image_pairs('banners_main', 'promo', $banner_image_id, $lang_code); if (!empty($pair_data)) { db_query("INSERT INTO ?:banner_images ?e", $data_banner_image); fn_banners_image_all_links($banner_id, $pair_data, $lang_code); } } } return $banner_id; }
function fn_delete_banner_by_id($banner_id) { db_query("DELETE FROM ?:banners WHERE banner_id = ?i", $banner_id); db_query("DELETE FROM ?:banner_descriptions WHERE banner_id = ?i", $banner_id); fn_set_hook('delete_banners', $banner_id); fn_clean_block_items('banners', $banner_id); fn_delete_image_pairs($banner_id, 'banner'); }
function fn_banners_install() { $banners = db_get_hash_multi_array("SELECT ?:banners.banner_id, ?:banner_images.banner_image_id, ?:banner_images.lang_code FROM ?:banners LEFT JOIN ?:banner_images ON ?:banner_images.banner_id = ?:banners.banner_id", array('lang_code', 'banner_id')); $langs = array_keys(Languages::getAll()); $need_clone_langs = array_diff($langs, array_keys($banners)); if (!empty($need_clone_langs)) { $clone_lang = DEFAULT_LANGUAGE; if (in_array(DEFAULT_LANGUAGE, $need_clone_langs)) { $clone_lang = 'en'; } foreach ($banners[$clone_lang] as $banner_id => &$banner) { $banner['main_pair'] = fn_get_image_pairs($banner['banner_image_id'], 'promo', 'M', true, false, $clone_lang); } foreach ($need_clone_langs as $need_clone_lang) { fn_banners_clone($banners[$clone_lang], $need_clone_lang); } } foreach ($banners['en'] as $banner_id => &$banner) { $banner['main_pair'] = fn_get_image_pairs($banner['banner_image_id'], 'promo', 'M', true, false, 'en'); } if (!in_array('en', $langs)) { $banner_images_ids = db_get_fields("SELECT banner_image_id FROM ?:banner_images WHERE lang_code = ?s", 'en'); foreach ($banner_images_ids as $banner_image_id) { fn_delete_image_pairs($banner_image_id, 'promo'); } if (!empty($banner_images_ids)) { db_query("DELETE FROM ?:banner_images WHERE banner_image_id IN (?n)", $banner_images_ids); } } return true; }
/** * Update product option * * @param array $option_data option data array * @param int $option_id option ID (empty if we're adding the option) * @param string $lang_code language code to add/update option for * @return int ID of the added/updated option */ function fn_update_product_option($option_data, $option_id = 0, $lang_code = DESCR_SL) { // Add option if (empty($option_id)) { if (empty($option_data['product_id'])) { $option_data['product_id'] = 0; } $option_data['option_id'] = $option_id = db_query('INSERT INTO ?:product_options ?e', $option_data); foreach ((array) Registry::get('languages') as $option_data['lang_code'] => $_v) { db_query("INSERT INTO ?:product_options_descriptions ?e", $option_data); } // Update option } else { db_query("UPDATE ?:product_options SET ?u WHERE option_id = ?i", $option_data, $option_id); db_query("UPDATE ?:product_options_descriptions SET ?u WHERE option_id = ?i AND lang_code = ?s", $option_data, $option_id, $lang_code); } if (!empty($option_data['variants'])) { $var_ids = array(); // Generate special variants structure for checkbox (2 variants, 1 hidden) if ($option_data['option_type'] == 'C') { $option_data['variants'] = array_slice($option_data['variants'], 0, 1); // only 1 variant should be here reset($option_data['variants']); $_k = key($option_data['variants']); $option_data['variants'][$_k]['position'] = 1; // checked variant $v_id = db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i AND position = 0", $option_id); $option_data['variants'][] = array('position' => 0, 'variant_id' => $v_id); } $variant_images = array(); foreach ($option_data['variants'] as $k => $v) { if ((!isset($v['variant_name']) || $v['variant_name'] == '') && $option_data['option_type'] != 'C') { continue; } // Update product options variants if (isset($v['modifier'])) { $v['modifier'] = floatval($v['modifier']); if (floatval($v['modifier']) > 0) { $v['modifier'] = '+' . $v['modifier']; } } if (isset($v['weight_modifier'])) { $v['weight_modifier'] = floatval($v['weight_modifier']); if (floatval($v['weight_modifier']) > 0) { $v['weight_modifier'] = '+' . $v['weight_modifier']; } } $v['option_id'] = $option_id; if (empty($v['variant_id']) || !empty($v['variant_id']) && !db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE variant_id = ?i", $v['variant_id'])) { $v['variant_id'] = db_query("INSERT INTO ?:product_option_variants ?e", $v); foreach ((array) Registry::get('languages') as $v['lang_code'] => $_v) { db_query("INSERT INTO ?:product_option_variants_descriptions ?e", $v); } } else { db_query("UPDATE ?:product_option_variants SET ?u WHERE variant_id = ?i", $v, $v['variant_id']); db_query("UPDATE ?:product_option_variants_descriptions SET ?u WHERE variant_id = ?i AND lang_code = ?s", $v, $v['variant_id'], $lang_code); } $var_ids[] = $v['variant_id']; if ($option_data['option_type'] == 'C') { fn_delete_image_pairs($v['variant_id'], 'variant_image'); // force deletion of variant image for "checkbox" option } else { $variant_images[$k] = $v['variant_id']; } } if ($option_data['option_type'] != 'C' && !empty($variant_images)) { fn_attach_image_pairs('variant_image', 'variant_image', 0, $lang_code, $variant_images); } // Delete obsolete variants $condition = !empty($var_ids) ? db_quote('AND variant_id NOT IN (?n)', $var_ids) : ''; $deleted_variants = db_get_fields("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i {$condition}", $option_id, $var_ids); if (!empty($deleted_variants)) { db_query("DELETE FROM ?:product_option_variants WHERE variant_id IN (?n)", $deleted_variants); db_query("DELETE FROM ?:product_option_variants_descriptions WHERE variant_id IN (?n)", $deleted_variants); foreach ($deleted_variants as $v_id) { fn_delete_image_pairs($v_id, 'variant_image'); } } } // Rebuild exceptions if (!empty($option_data['product_id'])) { fn_update_exceptions($option_data['product_id']); } return $option_id; }
/** * Deletes images when uninstalling */ function fn_staff_uninstall() { $user_ids = db_get_fields('SELECT user_id FROM ?:staff'); if (!empty($user_ids)) { foreach ($user_ids as $user_id) { fn_delete_image_pairs($user_id, 'staff'); } } }
function fn_delete_banner($banner_id) { if (empty($banner_id)) { return false; } $banner_type = db_get_field("SELECT type FROM ?:aff_banners WHERE banner_id = ?i", $banner_id); db_query("DELETE FROM ?:aff_banner_descriptions WHERE banner_id = ?i", $banner_id); db_query("DELETE FROM ?:aff_banners WHERE banner_id = ?i", $banner_id); if ($banner_type == 'G') { fn_delete_image_pairs($banner_id, 'common', 'aff_banners'); } return true; }
function fn_projects_delete_page($page_id) { fn_delete_image_pairs($page_id, 'projects'); db_query("DELETE FROM ?:projects_authors WHERE page_id = ?i", $page_id); }
function fn_blog_delete_page($page_id) { fn_delete_image_pairs($page_id, 'blog'); db_query("DELETE FROM ?:blog_authors WHERE page_id = ?i", $page_id); }
function fn_update_product_feature($feature_data, $feature_id, $lang_code = DESCR_SL) { $deleted_variants = array(); // If this feature belongs to the group, get categories assignment from this group if (!empty($feature_data['parent_id'])) { $gdata = db_get_row("SELECT categories_path, display_on_product, display_on_catalog FROM ?:product_features WHERE feature_id = ?i", $feature_data['parent_id']); $feature_data = fn_array_merge($feature_data, $gdata); } if (!intval($feature_id)) { // check for intval as we use "0G" for new group $feature_data['feature_id'] = $feature_id = db_query("INSERT INTO ?:product_features ?e", $feature_data); foreach (Registry::get('languages') as $feature_data['lang_code'] => $_d) { db_query("INSERT INTO ?:product_features_descriptions ?e", $feature_data); } } else { db_query("UPDATE ?:product_features SET ?u WHERE feature_id = ?i", $feature_data, $feature_id); db_query('UPDATE ?:product_features_descriptions SET ?u WHERE feature_id = ?i AND lang_code = ?s', $feature_data, $feature_id, $lang_code); } // If this feature is group, set its categories to all children if ($feature_data['feature_type'] == 'G') { $u = array('categories_path' => $feature_data['categories_path'], 'display_on_product' => $feature_data['display_on_product'], 'display_on_catalog' => $feature_data['display_on_catalog']); db_query("UPDATE ?:product_features SET ?u WHERE parent_id = ?i", $u, $feature_id); } // Delete variants for simple features if (strpos('SMNE', $feature_data['feature_type']) === false) { $var_ids = db_get_fields("SELECT variant_id FROM ?:product_feature_variants WHERE feature_id = ?i", $feature_id); if (!empty($var_ids)) { db_query("DELETE FROM ?:product_feature_variants WHERE variant_id IN (?n)", $var_ids); db_query("DELETE FROM ?:product_feature_variant_descriptions WHERE variant_id IN (?n)", $var_ids); db_query("DELETE FROM ?:product_features_values WHERE variant_id IN (?n)", $var_ids); foreach ($var_ids as $v_id) { fn_delete_image_pairs($v_id, 'feature_variant'); } } } elseif (!empty($feature_data['variants'])) { $var_ids = array(); foreach ($feature_data['variants'] as $k => $v) { if (empty($v['variant'])) { continue; } $v['feature_id'] = $feature_id; if (empty($v['variant_id'])) { $v['variant_id'] = db_query("INSERT INTO ?:product_feature_variants ?e", $v); foreach (Registry::get('languages') as $v['lang_code'] => $_v) { db_query("INSERT INTO ?:product_feature_variant_descriptions ?e", $v); } } else { db_query("UPDATE ?:product_feature_variants SET ?u WHERE variant_id = ?i", $v, $v['variant_id']); db_query("UPDATE ?:product_feature_variant_descriptions SET ?u WHERE variant_id = ?i AND lang_code = ?s", $v, $v['variant_id'], $lang_code); } if ($feature_data['feature_type'] == 'N') { // number db_query('UPDATE ?:product_features_values SET ?u WHERE variant_id = ?i AND lang_code = ?s', array('value_int' => $v['variant']), $v['variant_id'], $lang_code); } $var_ids[$k] = $v['variant_id']; $feature_data['variants'][$k]['variant_id'] = $v['variant_id']; // for addons } if (!empty($var_ids)) { fn_attach_image_pairs('variant_image', 'feature_variant', 0, $lang_code, $var_ids); } // Delete obsolete variants $deleted_variants = db_get_fields("SELECT variant_id FROM ?:product_feature_variants WHERE feature_id = ?i AND variant_id NOT IN (?n)", $feature_id, $var_ids); if (!empty($deleted_variants)) { db_query("DELETE FROM ?:product_feature_variants WHERE variant_id IN (?n)", $deleted_variants); db_query("DELETE FROM ?:product_feature_variant_descriptions WHERE variant_id IN (?n)", $deleted_variants); db_query("DELETE FROM ?:product_features_values WHERE variant_id IN (?n)", $deleted_variants); foreach ($deleted_variants as $v_id) { fn_delete_image_pairs($v_id, 'feature_variant'); } } } fn_set_hook('update_product_feature', $feature_data, $feature_id, $deleted_variants, $lang_code); return $feature_id; }
/** * Deletes options combination * * @param string $combination_hash Combination hash * @return bool true */ function fn_delete_option_combination($combination_hash) { /** * Makes additional actions before deleting options combination * * @param string $combination_hash Combination hash */ fn_set_hook('delete_option_combination_pre', $combination_hash); db_query("DELETE FROM ?:product_options_inventory WHERE combination_hash = ?i", $combination_hash); fn_delete_image_pairs($combination_hash, 'product_option'); return true; }
} } if (!empty($_REQUEST['product_id'])) { $_options = fn_get_product_options($_REQUEST['product_id']); if (empty($_options)) { $view->display('views/product_options/manage.tpl'); } exit; } return array(CONTROLLER_STATUS_REDIRECT, "product_options.manage"); } elseif ($mode == 'rebuild_combinations') { fn_rebuild_product_options_inventory($_REQUEST['product_id']); return array(CONTROLLER_STATUS_OK, "product_options.inventory?product_id={$_REQUEST['product_id']}"); } elseif ($mode == 'delete_combination') { if (!empty($_REQUEST['combination_hashe'])) { fn_delete_image_pairs($_REQUEST['combination_hashe'], 'product_option'); db_query("DELETE FROM ?:product_options_inventory WHERE combination_hash = ?i", $_REQUEST['combination_hashe']); } return array(CONTROLLER_STATUS_REDIRECT, "product_options.inventory?product_id={$_REQUEST['product_id']}"); } elseif ($mode == 'delete_exception') { if (!empty($_REQUEST['exception_id'])) { db_query("DELETE FROM ?:product_options_exceptions WHERE exception_id = ?i", $_REQUEST['exception_id']); } return array(CONTROLLER_STATUS_REDIRECT, "product_options.exceptions?product_id={$_REQUEST['product_id']}"); } if (!empty($_REQUEST['product_id'])) { $view->assign('product_id', $_REQUEST['product_id']); } function fn_get_product_option_data($option_id, $lang_code = DESCR_SL) { $extra_variant_fields = '';
/** * Deletes layout and assigned data (logos) * @param int $layout_id layout ID * @return boolean always true */ public function delete($layout_id) { // Delete locations, containers, grids and snappings $location_ids = db_get_fields("SELECT location_id FROM ?:bm_locations WHERE layout_id = ?i", $layout_id); if (!empty($location_ids)) { foreach ($location_ids as $location_id) { Location::instance($layout_id)->remove($location_id, true); } } db_query("DELETE FROM ?:bm_layouts WHERE layout_id = ?i", $layout_id); // Delete logos $logo_ids = db_get_fields("SELECT logo_id FROM ?:logos WHERE layout_id = ?i", $layout_id); if (!empty($logo_ids)) { foreach ($logo_ids as $logo_id) { fn_delete_image_pairs($logo_id, 'logos'); } db_query("DELETE FROM ?:logos WHERE logo_id IN (?n)", $logo_ids); } return true; }
/** * Updates product option * * @param array $option_data option data array * @param int $option_id option ID (empty if we're adding the option) * @param string $lang_code language code to add/update option for * @return int ID of the added/updated option */ function fn_update_product_option($option_data, $option_id = 0, $lang_code = DESCR_SL) { /** * Changes parameters before update option data * * @param array $option_data Option data * @param int $option_id Option identifier * @param string $lang_code Two-letter language code (e.g. 'en', 'ru', etc.) */ fn_set_hook('update_product_option_pre', $option_data, $option_id, $lang_code); // Add option if (empty($option_id)) { if (empty($option_data['product_id'])) { $option_data['product_id'] = 0; } $option_data['option_id'] = $option_id = db_query('INSERT INTO ?:product_options ?e', $option_data); foreach (fn_get_translation_languages() as $option_data['lang_code'] => $_v) { db_query("INSERT INTO ?:product_options_descriptions ?e", $option_data); } $create = true; // Update option } else { // if option inventory changed from Y to N, we should clear option combinations if (!empty($option_data['product_id']) && !empty($option_data['inventory']) && $option_data['inventory'] == 'N') { $condition = fn_get_company_condition('?:product_options.company_id'); $old_option_inventory = db_get_field("SELECT inventory FROM ?:product_options WHERE option_id = ?i {$condition}", $option_id); if ($old_option_inventory == 'Y') { $inventory_filled = db_get_field('SELECT COUNT(*) FROM ?:product_options_inventory WHERE product_id = ?i', $option_data['product_id']); if ($inventory_filled) { fn_delete_product_option_combinations($option_data['product_id']); } } } if (fn_allowed_for('ULTIMATE') && !empty($option_data['product_id']) && fn_ult_is_shared_product($option_data['product_id']) == 'Y') { $product_company_id = db_get_field('SELECT company_id FROM ?:products WHERE product_id = ?i', $option_data['product_id']); $option_id = fn_ult_update_shared_product_option($option_data, $option_id, Registry::ifGet('runtime.company_id', $product_company_id), $lang_code); if (Registry::get('runtime.company_id') && Registry::get('runtime.company_id') != $product_company_id) { $deleted_variants = array(); fn_set_hook('update_product_option_post', $option_data, $option_id, $deleted_variants, $lang_code); return $option_id; } } db_query("UPDATE ?:product_options SET ?u WHERE option_id = ?i", $option_data, $option_id); db_query("UPDATE ?:product_options_descriptions SET ?u WHERE option_id = ?i AND lang_code = ?s", $option_data, $option_id, $lang_code); } if (fn_allowed_for('ULTIMATE')) { // options of shared product under the shared store hasn't a company_id. No necessary for updating. if (!empty($option_data['company_id'])) { fn_ult_update_share_object($option_id, 'product_options', $option_data['company_id']); } if (!empty($option_data['product_id'])) { fn_ult_share_product_option($option_id, $option_data['product_id']); } } if (!empty($option_data['variants'])) { $var_ids = array(); // Generate special variants structure for checkbox (2 variants, 1 hidden) if ($option_data['option_type'] == 'C') { $option_data['variants'] = array_slice($option_data['variants'], 0, 1); // only 1 variant should be here reset($option_data['variants']); $_k = key($option_data['variants']); $option_data['variants'][$_k]['position'] = 1; // checked variant $v_id = db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i AND position = 0", $option_id); $option_data['variants'][] = array('position' => 0, 'variant_id' => $v_id); } $variant_images = array(); foreach ($option_data['variants'] as $k => $v) { if ((!isset($v['variant_name']) || $v['variant_name'] == '') && $option_data['option_type'] != 'C') { continue; } // Update product options variants if (isset($v['modifier'])) { $v['modifier'] = floatval($v['modifier']); if (floatval($v['modifier']) > 0) { $v['modifier'] = '+' . $v['modifier']; } } if (isset($v['weight_modifier'])) { $v['weight_modifier'] = floatval($v['weight_modifier']); if (floatval($v['weight_modifier']) > 0) { $v['weight_modifier'] = '+' . $v['weight_modifier']; } } // if (isset($v['set_by_user'])) { // // } $v['option_id'] = $option_id; if (empty($v['variant_id']) || !empty($v['variant_id']) && !db_get_field("SELECT variant_id FROM ?:product_option_variants WHERE variant_id = ?i", $v['variant_id'])) { $v['variant_id'] = db_query("INSERT INTO ?:product_option_variants ?e", $v); foreach (fn_get_translation_languages() as $v['lang_code'] => $_v) { db_query("INSERT INTO ?:product_option_variants_descriptions ?e", $v); } } else { db_query("DELETE FROM ?:product_option_variants_disabled WHERE product_id=?i AND option_id =?i AND variant_id=?i", $option_data['extraProductId'], $option_id, $v['variant_id']); if ($v['status'] == 'Y') { $vd = array('product_id' => $option_data['extraProductId'], 'option_id' => $option_id, 'variant_id' => $v['variant_id']); db_query("INSERT INTO ?:product_option_variants_disabled ?e", $vd); unset($v['status']); } db_query("UPDATE ?:product_option_variants SET ?u WHERE variant_id = ?i", $v, $v['variant_id']); db_query("UPDATE ?:product_option_variants_descriptions SET ?u WHERE variant_id = ?i AND lang_code = ?s", $v, $v['variant_id'], $lang_code); } $var_ids[] = $v['variant_id']; if ($option_data['option_type'] == 'C') { fn_delete_image_pairs($v['variant_id'], 'variant_image'); // force deletion of variant image for "checkbox" option } else { $variant_images[$k] = $v['variant_id']; } } if ($option_data['option_type'] != 'C' && !empty($variant_images)) { fn_attach_image_pairs('variant_image', 'variant_image', 0, $lang_code, $variant_images); } // Delete obsolete variants $condition = !empty($var_ids) ? db_quote('AND variant_id NOT IN (?n)', $var_ids) : ''; $deleted_variants = db_get_fields("SELECT variant_id FROM ?:product_option_variants WHERE option_id = ?i {$condition}", $option_id, $var_ids); if (!empty($deleted_variants)) { db_query("DELETE FROM ?:product_option_variants WHERE variant_id IN (?n)", $deleted_variants); db_query("DELETE FROM ?:product_option_variants_descriptions WHERE variant_id IN (?n)", $deleted_variants); foreach ($deleted_variants as $v_id) { fn_delete_image_pairs($v_id, 'variant_image'); } } } if (!fn_allowed_for('ULTIMATE:FREE')) { // Rebuild exceptions if (!empty($create) && !empty($option_data['product_id'])) { fn_update_exceptions($option_data['product_id']); } } /** * Update product option (running after fn_update_product_option() function) * * @param array $option_data Array with option data * @param int $option_id Option identifier * @param array $deleted_variants Array with deleted variants ids * @param string $lang_code Language code to add/update option for */ fn_set_hook('update_product_option_post', $option_data, $option_id, $deleted_variants, $lang_code); return $option_id; }
function fn_delete_category($category_id, $recurse = true) { // Log category deletion fn_log_event('categories', 'delete', array('category_id' => $category_id)); fn_clean_block_items('categories', $category_id); fn_clean_block_links('categories', $category_id); $category_ids = array(); $category_ids[] = $category_id; if (!empty($category_ids[0])) { // Delete all subcategories if ($recurse == true) { $id_path = db_get_field("SELECT id_path FROM ?:categories WHERE category_id = ?i", $category_id); $category_ids = db_get_fields("SELECT category_id FROM ?:categories WHERE category_id = ?i OR id_path LIKE ?l", $category_id, "{$id_path}/%"); } foreach ($category_ids as $k => $v) { $category_id = $v; fn_clean_block_items('categories', $category_id); // Deleting category db_query("DELETE FROM ?:categories WHERE category_id = ?i", $category_id); db_query("DELETE FROM ?:category_descriptions WHERE category_id = ?i", $category_id); // Deleting additional product associations without deleting products itself db_query("DELETE FROM ?:products_categories WHERE category_id = ?i AND link_type = 'A'", $category_id); // Remove this category from features assignments db_query("UPDATE ?:product_features SET categories_path = ?p", fn_remove_from_set('categories_path', $v)); // Deleting main products association with deleting products $products_to_delete = db_get_fields("SELECT product_id FROM ?:products_categories WHERE category_id = ?i AND link_type = 'M'", $category_id); if (!empty($products_to_delete)) { foreach ($products_to_delete as $key => $value) { fn_delete_product($value); } } // Deleting category images fn_delete_image_pairs($category_id, 'category'); // Executing delete_category functions from active addons fn_set_hook('delete_category', $category_id); } return $category_ids; // Returns ids of deleted categories } else { return false; } }