} if ($cat) { $path = cw_category_get_subcategory_ids($cat); if (!empty($path)) { cw_recalc_subcat_count($path); } } else { cw_recalc_subcat_count(); } $top_message = array('content' => cw_get_langvar_by_name('msg_adm_categories_upd'), 'type' => 'I'); cw_header_location("index.php?target={$target}" . ($mode ? '&mode=' . $mode : '') . "&cat={$cat}&js_tab={$js_tab}"); } if ($action == 'delete') { if ($confirmed == "Y") { # kronev, for the big amount of products - the cw_display_service_header('lbl_delete_categories') . '<br/>'; if (is_array($categories_to_delete)) { foreach ($categories_to_delete as $cat) { $parent_category_id = cw_call('cw_category_delete', array($cat, true)); } } $top_message = array('content' => cw_get_langvar_by_name('msg_adm_category_del'), 'type' => 'I'); cw_header_location('index.php?target=categories&cat=' . $parent_category_id); } else { $categories_to_delete = is_array($delete_arr) ? array_keys($delete_arr) : null; cw_header_location("index.php?target=categories&cat={$cat}&mode=delete"); } } if (empty($featured_type)) { $featured_type = 'featured_products'; }
global $csvxc_field_types; if ($mode == 'flexible_import') { if ($action == 'import_file') { mb_internal_encoding('UTF-8'); setlocale(LC_ALL, "en_US.UTF-8"); $rules = array('profile_id' => '', 'import_type' => ''); $data = array('profile_id' => $profile_id, 'import_type' => $import_type, 'import_file' => $_FILES['import_file']); $fill_error = cw_call('cw_error_check', array(&$data, $rules)); if ($import_type == 'server' && !$server_filenames) { $index = substr_count($fill_error, "\n") + ($fill_error != '' ? 1 : 0); $fill_error .= "\n" . ++$index . 'a . ' . cw_get_langvar_by_name('err_field_select_file'); } if ($fill_error) { cw_add_top_message($fill_error, 'E'); } else { cw_display_service_header("Running flexible import"); $profile = cw_call('cw_flexible_import_get_profile', array('params' => array('id' => intval($profile_id)))); if (!empty($profile['mapping_data'])) { $mapping_data = unserialize($profile['mapping_data']); } foreach ($mapping_data as $tbl_name => $tbl_fields) { foreach ($tbl_fields as $fld_name => $fld_mapping) { if (!empty($fld_mapping['custom_sql'])) { $mapping_data[$tbl_name][$fld_name]['custom_sql'] = stripslashes(base64_decode($fld_mapping['custom_sql'])); } } } if ($server_filenames) { foreach ($server_filenames as $s_file) { $profile['file_name'] = fi_files_path . $s_file; $parsed_file = cw_call('cw_flexible_import_parse_file', array($profile, false));
function cw_product_build_flat($params, $return) { extract($params); global $tables, $addons; $where = ""; if ($product_id) { if (!is_array($product_id)) { $product_id = array($product_id); } $where = "product_id in ('" . implode("', '", $product_id) . "')"; db_query("delete from {$tables['products_flat']} where {$where}"); } else { db_query("delete from {$tables['products_flat']}"); } $fields = $from_tbls = $query_joins = $where = $groupbys = $having = $orderbys = array(); $from_tbls[] = 'products'; $fields[] = "{$tables['products']}.product_id"; $where[] = $tables['products'] . '.' . $where; # kornev, get the query from the addons if ($return) { foreach ($return as $saname => $sadata) { if (isset(${$saname}) && is_array(${$saname}) && empty(${$saname})) { ${$saname} = $sadata; } } } # kornev, there are nothing to do if the fields are empty (by default) if (count($fields) == 1) { return; } $groupbys[] = "{$tables['products']}.product_id"; # kornev, generate it; $search_query = cw_db_generate_query($fields, $from_tbls, $query_joins, $where, $groupbys, $having, $orderbys); if ($tick > 0) { cw_display_service_header('lbl_rebuild_products_flat'); } $sd = db_query($search_query); $updated = 0; if ($sd) { while ($row = db_fetch_array($sd)) { cw_array2insert('products_flat', cw_addslashes($row), true); $updated++; if ($tick > 0 && $updated % $tick == 0) { cw_flush('.'); } if ($tick > 0 && $updated / $tick % 100 == 0) { cw_flush('<br/>'); } } } db_free_result($sd); return $updated; }
<?php # kornev, TOFIX if (!isset($tables['cached_images'])) { $tables['cached_images'] = 'cw_xcm_cached_images'; } $cache_files = cw_query("SELECT * FROM {$tables['cached_images']}"); if (empty($cache_files) || !is_array($cache_files)) { cw_header_location("index.php?target=settings&js_tab=Smarty_plugins"); } cw_display_service_header(); cw_flush('Removing cached images: ...'); $cnt = 0; if (count($cache_files)) { foreach ($cache_files as $file) { @unlink($file['image_path']); $cnt++; if ($cnt > 5) { cw_flush('.'); } } } db_query("TRUNCATE TABLE {$tables['cached_images']}"); cw_flush('<br />cached images are deleted.'); cw_header_location("index.php?target=settings&js_tab=Smarty_plugins"); exit;
function cw_recalc_subcat_count($category_id = 0, $tick = 0) { global $tables, $config; if ($tick > 0) { cw_display_service_header('lbl_recalc_subcat_count') . '<br/>'; } elseif ($tick > 0 && $start % $tick == 0) { cw_flush('.'); } if (!$category_id) { $where = ''; } elseif (is_array($category_id)) { if (is_array(current($category_id))) { foreach ($categoryid as $k => $v) { $categoryid[$k] = $v['category_id']; } } $where = "where category_id in ('" . implode("', '", $category_id) . "')"; } else { $where = "where parent_id='{$category_id}' or category_id='{$category_id}'"; } $subcategories = cw_query_column("select category_id from {$tables['categories']} {$where}"); db_query("delete from {$tables['categories_subcount']} where category_id in ('" . implode("', '", $subcategories) . "')"); $subcategories_list = implode("','", $subcategories); // Calculates memberships subcategories/products' counts as '0-membership' count plus only unique subcategories/products // for that membership (vs 0-mbrs) excluding all common with '0-membership' scats/prods // Status 1 -- only enabled scats/prods // Status 0 -- All scats/prods $counts = "select cm.category_id, cm.membership_id,\n\t\tcount(DISTINCT if(ifnull(cms.membership_id,-1)=-1,NULL,sc.category_id)) as subcategory_count,\n\t\tcount(DISTINCT if(ifnull(cms.membership_id,-1)=-1,NULL,if(ifnull(sc.status,0)=0,NULL,sc.category_id))) as subcategory_count_avail,\n\t\tcount(DISTINCT if(ifnull(pm.membership_id,-1)=-1,NULL,p.product_id)) as product_count,\n\t\tcount(DISTINCT if(ifnull(pm.membership_id,-1)=-1,NULL,if(ifnull(pr.status,0)=0,NULL,p.product_id))) as product_count_avail\n\t\tfrom {$tables['categories_memberships']} cm\n\t\tleft join {$tables['categories']} sc on cm.category_id = sc.parent_id\n\t\tleft join {$tables['categories_memberships']} cms on sc.category_id=cms.category_id and cms.membership_id in (0,cm.membership_id)\n\t\tleft Join {$tables['products_categories']} p on p.category_id=cm.category_id\n\t\tleft Join {$tables['products']} pr on p.product_id=pr.product_id\n\t\tleft Join {$tables['products_memberships']} pm on pm.product_id=p.product_id and pm.membership_id in (0,cm.membership_id)\n\t\twhere cm.category_id in ('{$subcategories_list}')\n\t\tand cm.membership_id is not null and cm.category_id is not null\n\t\tgroup by cm.category_id, cm.membership_id"; $counts = cw_query_hash($counts, array('category_id', 'membership_id'), false); $i = 0; if (!empty($counts)) { foreach ($counts as $category_id => $data) { foreach ($data as $membership_id => $cnts) { extract($cnts); $status = 0; $arr = compact('category_id', 'membership_id', 'status', 'subcategory_count', 'product_count'); cw_array2insert('categories_subcount', $arr, true); $status = 1; $subcategory_count = $subcategory_count_avail; $product_count = $product_count_avail; $arr = compact('category_id', 'membership_id', 'status', 'subcategory_count', 'product_count'); cw_array2insert('categories_subcount', $arr, true); if ($tick > 0 && $i % $tick == 0) { cw_flush(". "); } $i++; } } } # kornev, used only in the shop - so only the shop amount is calculated # general products count cw_load('product'); $count_products = cw_query_first("select group_concat(distinct membership_id) as ind from {$tables['products_memberships']}"); $count_products = array_fill_keys(explode(',', $count_products['ind']), 0); db_query("delete from {$tables['categories_subcount']} where category_id = 0"); if (is_array($count_products)) { foreach ($count_products as $k => $v) { $product_count = intval(cw_func_call('cw_product_search', array('data' => array('count' => 1), 'user_info' => array('membership_id' => $k), 'current_area' => 'C'))); cw_array2insert('categories_subcount', array('category_id' => 0, 'membership_id' => $k, 'status' => 2, 'product_count' => $product_count), true); } } }
function cw_rebuild_variants($product_id, $force_rebuild = false, $tick = 1) { global $tables; if (!$force_rebuild) { # Check variant's matrix $options_count = cw_query_first_cell("SELECT COUNT(*) FROM {$tables['product_options']}, {$tables['product_options_values']} WHERE {$tables['product_options']}.product_option_id = {$tables['product_options_values']}.product_option_id AND {$tables['product_options']}.product_id = '{$product_id}' AND {$tables['product_options']}.type = '' AND {$tables['product_options']}.avail = 1 AND {$tables['product_options_values']}.avail = 1"); $variants_count = count(cw_query_column("SELECT COUNT(*) FROM {$tables['product_variant_items']}, {$tables['product_variants']} WHERE {$tables['product_variants']}.product_id = '{$product_id}' AND {$tables['product_variants']}.variant_id = {$tables['product_variant_items']}.variant_id GROUP BY {$tables['product_variant_items']}.option_id")); if ($options_count == $variants_count && $options_count > 0) { return true; } } if ($tick > 0) { cw_display_service_header("lbl_rebuild_variants"); } $ids = cw_query_column("SELECT variant_id FROM {$tables['product_variants']} WHERE product_id = '{$product_id}'"); if (!empty($ids)) { # Save old data $vars = cw_query_hash("SELECT pv.*, pwa.avail FROM {$tables['product_variants']} as pv LEFT JOIN {$tables['products_warehouses_amount']} as pwa ON pv.variant_id = pwa.variant_id WHERE pv.product_id = '{$product_id}'", "variant_id", false); $prices = db_query("select pp.* from {$tables['products_prices']} as pp where pp.product_id = '{$product_id}' AND variant_id != 0"); if ($prices) { while ($v = db_fetch_array($prices)) { if (!isset($vars[$v['variant_id']])) { continue; } $key = $v['quantity'] . "|" . $v['membership_id']; if (!isset($vars[$v['variant_id']]['prices'])) { $vars[$v['variant_id']]['prices'] = array(); } if (!isset($vars[$v['variant_id']]['prices'][$key]) || $vars[$v['variant_id']]['prices'][$key]['price'] > $v['price']) { $vars[$v['variant_id']]['prices'][$key] = $v; } } db_free_result($prices); } unset($prices); $items = cw_query_hash("SELECT {$tables['product_variant_items']}.*, {$tables['product_options_values']}.product_option_id FROM {$tables['product_variant_items']}, {$tables['product_options_values']}, {$tables['product_variants']} WHERE {$tables['product_variant_items']}.option_id = {$tables['product_options_values']}.option_id AND {$tables['product_variant_items']}.variant_id = {$tables['product_variants']}.variant_id AND {$tables['product_variants']}.product_id = '{$product_id}'", array('product_option_id', "option_id"), true, true); # Delete old variants /* $tmp = cw_query_first("SELECT MIN(avail) as avail, MIN(weight) as weight FROM $tables[product_variants] WHERE product_id = '$product_id'"); db_query("UPDATE $tables[products] SET avail = '$tmp[avail]', weight = '$tmp[weight]' WHERE product_id = '$product_id'"); unset($tmp); */ db_query("DELETE FROM {$tables['products_prices']} WHERE product_id = '{$product_id}' AND variant_id != 0"); db_query("DELETE FROM {$tables['product_variant_items']} WHERE variant_id IN ('" . implode("','", $ids) . "')"); db_query("DELETE FROM {$tables['products_warehouses_amount']} WHERE product_id = '{$product_id}' AND variant_id != 0"); } unset($ids); db_query("DELETE FROM {$tables['product_variants']} WHERE product_id = '{$product_id}'"); # Get modifier-classes $classes = cw_query($sql = "SELECT product_option_id FROM {$tables['product_options']} WHERE product_id = '{$product_id}' AND type = '' AND avail = 1 ORDER BY orderby"); if (empty($classes)) { return false; } foreach ($classes as $k => $v) { $classes[$k]['cnt'] = 0; $classes[$k]['options'] = cw_query_column("SELECT option_id FROM {$tables['product_options_values']} WHERE product_option_id = '{$v['product_option_id']}' AND avail = 1 ORDER BY orderby, option_id ASC "); if (!@count($classes[$k]['options']) || !is_array($classes[$k]['options'])) { unset($classes[$k]); } } if (empty($classes)) { return false; } $classes = array_values($classes); $classes[0]['cnt'] = -1; # Build variant's matrix $variants = array(); # Write variants to DB $product = cw_query_first("SELECT {$tables['products']}.eancode, {$tables['products']}.productcode, {$tables['products']}.weight, {$tables['products']}.cost, {$tables['products_prices']}.price FROM {$tables['products']}, {$tables['products_prices']} WHERE {$tables['products_prices']}.variant_id = 0 AND {$tables['products_prices']}.quantity = '1' AND {$tables['products_prices']}.membership_id = 0 AND {$tables['products']}.product_id = '{$product_id}' GROUP BY {$tables['products']}.product_id"); $cnt_row = $cnt = $cnd_ean = 0; do { $is_end = false; $options = array(); $old_variants = array(); foreach ($classes as $k => $c) { $option_id = 0; if (!$is_end) { if ($c['cnt'] >= count($c['options']) - 1) { $c['cnt'] = 0; } else { $c['cnt']++; $is_end = true; } $classes[$k] = $c; } $option_id = $c['options'][$c['cnt']]; if (empty($option_id)) { continue; } $options[] = $option_id; if (isset($items[$c['product_option_id']][$option_id])) { if (empty($old_variants)) { $old_variants = $items[$c['product_option_id']][$option_id]; } else { $old_variants = array_intersect($old_variants, $items[$c['product_option_id']][$option_id]); } } } if (!$is_end || empty($options)) { break; } $_product = $product; # Restore old data $old_variant_id = false; if (is_array($old_variants) && !empty($old_variants)) { $old_variant_id = array_shift($old_variants); if (isset($vars[$old_variant_id])) { $_product = cw_array_merge($_product, $vars[$old_variant_id]); } } unset($old_variants); # Get unique SKU $sku = $_product['productcode']; while (cw_query_first_cell("SELECT COUNT(*) FROM {$tables['product_variants']} WHERE productcode = '{$sku}'") > 0) { $sku = $_product['productcode'] . ++$cnt; } $eancode = $_product['eancode']; while (cw_query_first_cell("SELECT COUNT(*) FROM {$tables['product_variants']} WHERE eancode = '{$eancode}'") > 0) { $eancode = $_product['eancode'] . ++$cnd_ean; } $data = array("product_id" => $product_id, "weight" => $_product['weight'], "cost" => $_product['cost'], "productcode" => $sku, 'eancode' => $eancode); # Check variant_id if (!empty($old_variant_id) && cw_query_first_cell("SELECT COUNT(*) FROM {$tables['product_variants']} WHERE variant_id = '{$old_variant_id}'") == 0) { $data['variant_id'] = $old_variant_id; } # Insert variant info $variant_id = cw_array2insert('product_variants', $data); if (empty($variant_id)) { continue; } if ($_product['avail'] == NULL) { $_product['avail'] = 0; } if (cw_query_first_cell("SELECT COUNT(*) FROM {$tables['products_warehouses_amount']} WHERE variant_id = '{$variant_id}'") == 0) { cw_array2insert('products_warehouses_amount', array('product_id' => $product_id, 'avail' => $_product['avail'], 'avail_ordered' => 0, 'avail_sold' => 0, 'avail_reserved' => '0', 'variant_id' => $variant_id, 'warehouse_customer_id' => '0'), false); } # Write products_prices if (empty($_product['prices'])) { cw_price_lists_replace_price($product_id, $_product['price'], $variant_id, true, true); } else { foreach ($_product['prices'] as $p) { cw_price_lists_replace_price($product_id, $p['price'], $variant_id, true, $p['is_manual']); } } # Restore image if (!empty($old_variant_id) && $variant_id != $old_variant_id) { cw_image_delete($variant_id, "W"); db_query("UPDATE {$tables['products_images_var']} SET id = '{$variant_id}' WHERE id = '{$old_variant_id}'"); } # Write matrix foreach ($options as $i) { db_query("INSERT INTO {$tables['product_variant_items']} (variant_id, option_id) VALUES ('{$variant_id}','{$i}')"); } if ($tick > 0 && $cnt_row++ % $tick == 0) { cw_flush(". "); } } while ($is_end); # Clean old variants images $images = cw_query_column("SELECT {$tables['products_images_var']}.id FROM {$tables['product_variants']} LEFT JOIN {$tables['products_images_var']} ON {$tables['product_variants']}.variant_id = {$tables['products_images_var']}.id WHERE {$tables['products_images_var']}.id IS NULL"); if (!empty($images)) { cw_image_delete($images, "W"); } return true; }