示例#1
0
function fn_update_product_categories($product_id, $product_data)
{
    $existing_categories = db_get_hash_array("SELECT category_id, link_type, position FROM ?:products_categories WHERE product_id = ?i", 'category_id', $product_id);
    $rebuild = false;
    if (!empty($product_data['category_ids'])) {
        if (empty($product_data['main_category'])) {
            $product_data['main_category'] = reset($product_data['category_ids']);
        }
        if (sizeof($product_data['category_ids']) == sizeof($existing_categories)) {
            if (isset($existing_categories[$product_data['main_category']]) && $existing_categories[$product_data['main_category']]['link_type'] != 'M') {
                $rebuild = true;
            }
            foreach ($product_data['category_ids'] as $cid) {
                if (!isset($existing_categories[$cid])) {
                    $rebuild = true;
                }
            }
        } else {
            $rebuild = true;
        }
    }
    if ($rebuild == true) {
        db_query("DELETE FROM ?:products_categories WHERE product_id = ?i", $product_id);
        foreach ($product_data['category_ids'] as $cid) {
            $_data = array('product_id' => $product_id, 'category_id' => $cid, 'position' => isset($existing_categories[$cid]) ? $existing_categories[$cid]['position'] : 0, 'link_type' => $product_data['main_category'] == $cid ? 'M' : 'A');
            db_query("INSERT INTO ?:products_categories ?e", $_data);
        }
        fn_update_product_count(fn_array_merge($product_data['category_ids'], array_keys($existing_categories), false));
    }
}
示例#2
0
function fn_clone_product($product_id)
{
    // Clone main data
    $data = db_get_row("SELECT * FROM ?:products WHERE product_id = ?i", $product_id);
    unset($data['product_id']);
    $data['status'] = 'D';
    $pid = db_query("INSERT INTO ?:products ?e", $data);
    // Clone descriptions
    $data = db_get_array("SELECT * FROM ?:product_descriptions WHERE product_id = ?i", $product_id);
    foreach ($data as $v) {
        $v['product_id'] = $pid;
        if ($v['lang_code'] == CART_LANGUAGE) {
            $orig_name = $v['product'];
            $new_name = $v['product'] . ' [CLONE]';
        }
        $v['product'] .= ' [CLONE]';
        db_query("INSERT INTO ?:product_descriptions ?e", $v);
    }
    // Clone prices
    $data = db_get_array("SELECT * FROM ?:product_prices WHERE product_id = ?i", $product_id);
    foreach ($data as $v) {
        $v['product_id'] = $pid;
        unset($v['price_id']);
        db_query("INSERT INTO ?:product_prices ?e", $v);
    }
    // Clone categories links
    $data = db_get_array("SELECT * FROM ?:products_categories WHERE product_id = ?i", $product_id);
    $_cids = array();
    foreach ($data as $v) {
        $v['product_id'] = $pid;
        db_query("INSERT INTO ?:products_categories ?e", $v);
        $_cids[] = $v['category_id'];
    }
    fn_update_product_count($_cids);
    // Clone product options
    fn_clone_product_options($product_id, $pid);
    // Clone global linked options
    $gl_options = db_get_fields("SELECT option_id FROM ?:product_global_option_links WHERE product_id = ?i", $product_id);
    if (!empty($gl_options)) {
        foreach ($gl_options as $v) {
            db_query("INSERT INTO ?:product_global_option_links (option_id, product_id) VALUES (?i, ?i)", $v, $pid);
        }
    }
    // Clone product features
    $data = db_get_array("SELECT * FROM ?:product_features_values WHERE product_id = ?i", $product_id);
    foreach ($data as $v) {
        $v['product_id'] = $pid;
        db_query("INSERT INTO ?:product_features_values ?e", $v);
    }
    // Clone blocks
    fn_clone_block_links('products', $product_id, $pid);
    // Clone addons
    fn_set_hook('clone_product', $product_id, $pid);
    // Clone images
    fn_clone_image_pairs($pid, $product_id, 'product');
    // Clone product files
    if (is_dir(DIR_DOWNLOADS . $product_id)) {
        $data = db_get_array("SELECT * FROM ?:product_files WHERE product_id = ?i", $product_id);
        foreach ($data as $v) {
            $v['product_id'] = $pid;
            $old_file_id = $v['file_id'];
            unset($v['file_id']);
            $file_id = db_query("INSERT INTO ?:product_files ?e", $v);
            $file_descr = db_get_row("SELECT * FROM ?:product_file_descriptions WHERE file_id = ?i", $old_file_id);
            $file_descr['file_id'] = $file_id;
            db_query("INSERT INTO ?:product_file_descriptions ?e", $file_descr);
        }
        fn_copy(DIR_DOWNLOADS . $product_id, DIR_DOWNLOADS . $pid);
    }
    fn_build_products_cache(array($pid));
    return array('product_id' => $pid, 'orig_name' => $orig_name, 'product' => $new_name);
}
function fn_clone_products($table_data, $clone_data, $start, $from, $to, $extra)
{
    if (!empty($clone_data)) {
        $limit = 50;
        $start = 0;
        do {
            $data = db_get_array('SELECT product_id, category_id FROM ?:products_categories WHERE link_type = ?s AND category_id IN (?a) LIMIT ?i, ?i', 'M', array_keys($clone_data), $start, $limit);
            foreach ($data as $item) {
                $result = fn_clone_product($item['product_id']);
                db_query('UPDATE ?:products SET company_id = ?i WHERE product_id = ?i', $to, $result['product_id']);
                db_query('UPDATE ?:products_categories SET category_id = ?i WHERE product_id = ?i AND link_type = ?s', $clone_data[$item['category_id']], $result['product_id'], 'M');
                // Get category ids to update product count
                $cids = db_get_fields('SELECT category_id FROM ?:products_categories WHERE product_id = ?i OR product_id = ?i', $item['product_id'], $result['product_id']);
                fn_update_product_count($cids);
            }
            $total = db_get_field('SELECT COUNT(*) FROM ?:products_categories WHERE link_type = ?s AND category_id IN (?a)', 'M', array_keys($clone_data));
            $start += $limit;
        } while ($total >= $start);
    }
}
/**
 * Creates categories tree by path
 *
 * @param integer $product_id Product ID
 * @param string $link_type M - main category, A - additional
 * @param string $categories_data categories path
 * @param string $category_delimiter Delimiter in categories path
 * @param string $store_name Store name (is used for saving category company_id)
 * @return boolean True if any categories were updated.
 */
function fn_exim_set_product_categories($product_id, $link_type, $categories_data, $category_delimiter, $store_name = '')
{
    if (fn_is_empty($categories_data)) {
        return false;
    }
    $set_delimiter = ';';
    if (fn_allowed_for('ULTIMATE')) {
        $store_delimiter = ':';
        $paths_store = array();
    }
    $paths = array();
    $updated_categories = array();
    foreach ($categories_data as $lang => $data) {
        // Check if array is provided
        if (strpos($data, $set_delimiter) !== false) {
            $_paths = explode($set_delimiter, $data);
            array_walk($_paths, 'fn_trim_helper');
        } else {
            $_paths = array($data);
        }
        foreach ($_paths as $k => $cat_path) {
            if (fn_allowed_for('ULTIMATE')) {
                if (strpos($cat_path, $store_delimiter)) {
                    $cat_path = explode($store_delimiter, $cat_path);
                    $paths_store[$k] = $cat_path[0];
                    $cat_path = $cat_path[1];
                }
            }
            $category = strpos($cat_path, $category_delimiter) !== false ? explode($category_delimiter, $cat_path) : array($cat_path);
            foreach ($category as $key_cat => $cat) {
                $paths[$k][$key_cat][$lang] = $cat;
            }
        }
    }
    if (!fn_is_empty($paths)) {
        $category_condition = '';
        $joins = '';
        $select = '?:products_categories.*';
        if (fn_allowed_for('ULTIMATE')) {
            $joins = ' JOIN ?:categories ON ?:categories.category_id = ?:products_categories.category_id ';
            $category_condition = fn_get_company_condition('?:categories.company_id');
            $select .= ', ?:categories.category_id, ?:categories.company_id';
        }
        $cat_ids = array();
        $old_data = db_get_hash_array("SELECT {$select} FROM ?:products_categories {$joins} WHERE product_id = ?i AND link_type = ?s {$category_condition}", 'category_id', $product_id, $link_type);
        foreach ($old_data as $k => $v) {
            if ($v['link_type'] == $link_type) {
                $updated_categories[] = $k;
            }
            $cat_ids[] = $v['category_id'];
        }
        if (!empty($cat_ids)) {
            db_query("DELETE FROM ?:products_categories WHERE product_id = ?i AND category_id IN (?a)", $product_id, $cat_ids);
        }
    }
    $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);
            if (!$company_id) {
                $company_data = array('company' => $store_name, 'email' => '');
                $company_id = fn_update_company($company_data, 0);
            }
        }
    }
    foreach ($paths as $key_path => $categories) {
        if (!empty($categories)) {
            $parent_id = '0';
            foreach ($categories as $cat) {
                $category_condition = '';
                if (fn_allowed_for('ULTIMATE')) {
                    if (!empty($paths_store[$key_path]) && !Registry::get('runtime.company_id')) {
                        $path_company_id = fn_get_company_id_by_name($paths_store[$key_path]);
                        $category_condition = fn_get_company_condition('?:categories.company_id', true, $path_company_id);
                    } else {
                        $category_condition = fn_get_company_condition('?:categories.company_id', true, $company_id);
                    }
                }
                reset($cat);
                $main_lang = key($cat);
                $main_cat = array_shift($cat);
                $category_id = db_get_field("SELECT ?:categories.category_id FROM ?:category_descriptions INNER JOIN ?:categories ON ?:categories.category_id = ?:category_descriptions.category_id {$category_condition} WHERE ?:category_descriptions.category = ?s AND lang_code = ?s AND parent_id = ?i", $main_cat, $main_lang, $parent_id);
                if (!empty($category_id)) {
                    $parent_id = $category_id;
                } else {
                    $category_data = array('parent_id' => $parent_id, 'category' => $main_cat, 'timestamp' => TIME);
                    if (fn_allowed_for('ULTIMATE')) {
                        $category_data['company_id'] = !empty($path_company_id) ? $path_company_id : $company_id;
                    }
                    $category_id = fn_update_category($category_data);
                    foreach ($cat as $lang => $cat_data) {
                        $category_data = array('parent_id' => $parent_id, 'category' => $cat_data, 'timestamp' => TIME);
                        if (fn_allowed_for('ULTIMATE')) {
                            $category_data['company_id'] = $company_id;
                        }
                        fn_update_category($category_data, $category_id, $lang);
                    }
                    $parent_id = $category_id;
                }
            }
            $data = array('product_id' => $product_id, 'category_id' => $category_id, 'link_type' => $link_type);
            if (!empty($old_data) && !empty($old_data[$category_id])) {
                $data = fn_array_merge($old_data[$category_id], $data);
            }
            db_query("REPLACE INTO ?:products_categories ?e", $data);
            $updated_categories[] = $category_id;
        }
    }
    if (!empty($updated_categories)) {
        fn_update_product_count($updated_categories);
        return true;
    }
    return false;
}
示例#5
0
                 }
             }
             // Updating product association with secondary categories
             if (isset($product_data['add_categories'])) {
                 db_query("DELETE FROM ?:products_categories WHERE product_id = ?i AND link_type = 'A'", $p_id);
                 $_data = array('product_id' => $p_id, 'link_type' => 'A');
                 if (!empty($product_data['add_categories'])) {
                     $_cids = explode(',', $product_data['add_categories']);
                     foreach ($_cids as $c_id) {
                         if (!empty($product_data['main_category']) && $product_data['main_category'] == $c_id) {
                             continue;
                         }
                         $_data['category_id'] = $c_id;
                         db_query("REPLACE INTO ?:products_categories ?e", $_data);
                     }
                     fn_update_product_count($_cids);
                 }
             }
             // Updating images
             fn_attach_image_pairs('product_main', 'product', $p_id, DESCR_SL);
         }
     }
 }
 //
 // Processing deleting of multiple product elements
 //
 if ($mode == 'm_delete') {
     if (isset($_REQUEST['product_ids'])) {
         foreach ($_REQUEST['product_ids'] as $v) {
             fn_delete_product($v);
         }
示例#6
0
 function fn_exim_set_product_categories($product_id, $link_type, $data, $category_delimiter, $lang_code = CART_LANGUAGE)
 {
     if (empty($data)) {
         return false;
     }
     $set_delimiter = ';';
     $paths = array();
     $updated_categories = array();
     // Check if array is provided
     if (strpos($data, $set_delimiter) !== false) {
         $paths = explode($set_delimiter, $data);
         array_walk($paths, 'fn_trim_helper');
     } else {
         $paths[] = $data;
     }
     if (!fn_is_empty($paths)) {
         $old_data = db_get_hash_array("SELECT * FROM ?:products_categories WHERE product_id= ?i", 'category_id', $product_id);
         foreach ($old_data as $k => $v) {
             if ($v['link_type'] == $link_type) {
                 $updated_categories[] = $k;
             }
         }
         db_query("DELETE FROM ?:products_categories WHERE product_id = ?i AND link_type = ?s", $product_id, $link_type);
     }
     foreach ($paths as $category) {
         $categories = strpos($category, $category_delimiter) !== false ? explode($category_delimiter, $category) : array($category);
         if (!empty($categories)) {
             $parent_id = '0';
             foreach ($categories as $cat) {
                 $category_id = db_get_field("SELECT ?:categories.category_id FROM ?:category_descriptions INNER JOIN ?:categories ON ?:categories.category_id = ?:category_descriptions.category_id WHERE ?:category_descriptions.category = ?s AND lang_code = ?s AND parent_id = ?i", $cat, $lang_code, $parent_id);
                 if (!empty($category_id)) {
                     $parent_id = $category_id;
                 } else {
                     $category_data = array('parent_id' => $parent_id, 'category' => $cat);
                     $category_id = fn_update_category($category_data);
                     $parent_id = $category_id;
                 }
             }
             $data = array('product_id' => $product_id, 'category_id' => $category_id, 'link_type' => $link_type);
             if (!empty($old_data) && !empty($old_data[$category_id])) {
                 $data = fn_array_merge($old_data[$category_id], $data);
             }
             db_query("REPLACE INTO ?:products_categories ?e", $data);
             $updated_categories[] = $category_id;
         }
     }
     if (!empty($updated_categories)) {
         fn_update_product_count($updated_categories);
         return true;
     }
     return false;
 }
示例#7
0
function fn_update_product_categories($product_id, $product_data)
{
    /**
     * Change parameters before updating product categories
     *
     * @param integer $product_id   product ID
     * @param array   $product_data product data
     */
    fn_set_hook('update_product_categories_pre', $product_id, $product_data);
    $existing_categories = db_get_hash_array("SELECT category_id, link_type, position FROM ?:products_categories WHERE product_id = ?i", 'category_id', $product_id);
    $rebuild = false;
    if (!empty($product_data['category_ids'])) {
        if (empty($product_data['main_category'])) {
            $product_data['main_category'] = reset($product_data['category_ids']);
        }
        if (sizeof($product_data['category_ids']) == sizeof($existing_categories)) {
            if (isset($existing_categories[$product_data['main_category']]) && $existing_categories[$product_data['main_category']]['link_type'] != 'M') {
                $rebuild = true;
            }
            foreach ($product_data['category_ids'] as $cid) {
                if (!isset($existing_categories[$cid])) {
                    $rebuild = true;
                }
            }
        } else {
            $rebuild = true;
        }
    }
    if ($rebuild == true) {
        db_query("DELETE FROM ?:products_categories WHERE product_id = ?i", $product_id);
        foreach ($product_data['category_ids'] as $cid) {
            $_data = array('product_id' => $product_id, 'category_id' => $cid, 'position' => isset($existing_categories[$cid]) ? $existing_categories[$cid]['position'] : (isset($product_data['position']) ? (int) $product_data['position'] : 0), 'link_type' => $product_data['main_category'] == $cid ? 'M' : 'A');
            db_query("INSERT INTO ?:products_categories ?e", $_data);
        }
        fn_update_product_count(fn_array_merge($product_data['category_ids'], array_keys($existing_categories), false));
    }
    /**
     * Post processing after updating product categories
     *
     * @param integer $product_id          product ID
     * @param array   $product_data        product data
     * @param array   $existing_categories original product categories
     * @param boolean $rebuild             flag that indicates that product categories were changed
     */
    fn_set_hook('update_product_categories_post', $product_id, $product_data, $existing_categories, $rebuild);
}
示例#8
0
/**
 * Moves products left without categories in their store to trash
 *
 * @param array $category_ids Deleted categories identifiers
 * @return array Deleted products identifiers
 */
function fn_trash_orphaned_products($category_ids)
{
    $orphaned_products = array();
    $trashes = array();
    $category_ids = array_unique($category_ids);
    if ($category_ids) {
        $narrowed_products_list = db_get_fields("SELECT DISTINCT product_id" . " FROM ?:products_categories" . " WHERE category_id IN (?n)", $category_ids);
        if (!empty($narrowed_products_list)) {
            $orphaned_products = db_get_hash_single_array("SELECT" . " cp.product_id," . " p.company_id," . " c.category_id," . " GROUP_CONCAT(c.category_id) AS owner_groups" . " FROM ?:products p" . " LEFT JOIN ?:products_categories cp" . " ON p.product_id = cp.product_id" . " LEFT JOIN ?:categories c" . " ON cp.category_id = c.category_id" . " AND p.company_id = c.company_id" . " WHERE p.product_id in (?n)" . " GROUP BY cp.product_id" . " HAVING owner_groups IS NULL", array('product_id', 'company_id'), $narrowed_products_list);
            if (!empty($orphaned_products)) {
                // Deleting product associations
                db_query("DELETE FROM ?:products_categories" . " WHERE category_id IN (?n)" . " OR product_id IN (?n)", $category_ids, array_keys($orphaned_products));
                // Moving products to trash
                foreach ($orphaned_products as $product_id => $company_id) {
                    if (!isset($trashes[$company_id])) {
                        $trash_category_id = fn_get_trash_category($company_id);
                        if (!$trash_category_id) {
                            $trash_category_id = fn_create_trash_category($company_id);
                        }
                        $trashes[$company_id] = $trash_category_id;
                    }
                    fn_add_product_to_trash($product_id, $trashes[$company_id]);
                }
                fn_update_product_count();
            }
        }
    }
    return array($orphaned_products, $trashes);
}
示例#9
0
function fn_delete_product($product_id)
{
    $auth =& $_SESSION['auth'];
    if (!empty($product_id)) {
        if (defined('COMPANY_ID')) {
            $company_id = db_get_field("SELECT company_id FROM ?:products WHERE product_id = ?i", $product_id);
            if (COMPANY_ID != $company_id) {
                fn_set_notification('W', fn_get_lang_var('warning'), fn_get_lang_var('access_denied'));
                return false;
            }
        }
        fn_clean_block_items('products', $product_id);
        fn_clean_block_links('products', $product_id);
        // Log product deletion
        fn_log_event('products', 'delete', array('product_id' => $product_id));
        $category_ids = db_get_fields("SELECT category_id FROM ?:products_categories WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:products_categories WHERE product_id = ?i", $product_id);
        fn_update_product_count($category_ids);
        db_query("DELETE FROM ?:products WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:product_descriptions WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:product_prices WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:product_features_values WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:product_options_exceptions WHERE product_id = ?i", $product_id);
        db_query("DELETE FROM ?:product_popularity WHERE product_id = ?i", $product_id);
        fn_delete_image_pairs($product_id, 'product');
        // Delete product options and inventory records for this product
        fn_poptions_delete_product($product_id);
        // Delete product files
        fn_rm(DIR_DOWNLOADS . $product_id);
        fn_build_products_cache(array($product_id));
        // Executing delete_product functions from active addons
        fn_set_hook('delete_product', $product_id);
        $pid = db_get_field("SELECT product_id FROM ?:products WHERE product_id = ?i", $product_id);
        return empty($pid) ? true : false;
    } else {
        return false;
    }
}