/** * 获取指定用户的收藏商品列表 * * @access public * @param int $user_id 用户ID * @param int $num 列表最大数量 * @param int $start 列表其实位置 * * @return array $arr */ function get_collection_goods($user_id, $num = 10, $start = 0) { $sql = 'SELECT g.goods_id, g.goods_name, g.goods_thumb, g.market_price, g.shop_price AS org_price, ' . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price, " . 'g.promote_price, g.promote_start_date,g.promote_end_date, c.rec_id, c.is_attention' . ' FROM ' . $GLOBALS['ecs']->table('collect_goods') . ' AS c' . " LEFT JOIN " . $GLOBALS['ecs']->table('goods') . " AS g " . "ON g.goods_id = c.goods_id " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE c.user_id = '{$user_id}' ORDER BY c.rec_id DESC"; $res = $GLOBALS['db']->selectLimit($sql, $num, $start); $goods_list = array(); while ($row = $GLOBALS['db']->fetchRow($res)) { if ($row['promote_price'] > 0) { $promote_price = bargain_price($row['promote_price'], $row['promote_start_date'], $row['promote_end_date']); } else { $promote_price = 0; } /* 判断是否为正在预售的商品 */ $pre_sale_id = is_pre_sale_goods($row['goods_id']); if ($pre_sale_id != null) { $goods_list[$row['goods_id']]['is_pre_sale'] = 1; $goods_list[$row['goods_id']]['pre_sale_id'] = $pre_sale_id; } else { $goods_list[$row['goods_id']]['is_pre_sale'] = 0; } $goods_list[$row['goods_id']]['rec_id'] = $row['rec_id']; $goods_list[$row['goods_id']]['is_attention'] = $row['is_attention']; $goods_list[$row['goods_id']]['goods_id'] = $row['goods_id']; $goods_list[$row['goods_id']]['goods_name'] = $row['goods_name']; $goods_list[$row['goods_id']]['market_price'] = price_format($row['market_price']); $goods_list[$row['goods_id']]['shop_price'] = price_format($row['shop_price']); $goods_list[$row['goods_id']]['promote_price'] = $promote_price > 0 ? price_format($promote_price) : ''; $goods_list[$row['goods_id']]['url'] = build_uri('goods', array('gid' => $row['goods_id']), $row['goods_name']); $goods_list[$row['goods_id']]['thumb'] = get_image_path($row['goods_id'], $row['goods_thumb'], true); } return $goods_list; }
$pager['page_prev'] = $page > 1 ? "javascript:gotoBuyPage(" . ($page - 1) . ",{$goods_id})" : 'javascript:;'; $pager['page_next'] = $page < $page_count ? 'javascript:gotoBuyPage(' . ($page + 1) . ",{$goods_id})" : 'javascript:;'; $pager['page_last'] = $page < $page_count ? 'javascript:gotoBuyPage(' . $page_count . ",{$goods_id})" : 'javascript:;'; $smarty->assign('notes', $bought_notes); $smarty->assign('pager', $pager); $res['result'] = $GLOBALS['smarty']->fetch('library/bought_notes.lbi'); $GLOBALS['smarty']->caching = $need_cache; $GLOBALS['smarty']->force_compile = $need_compile; } die($json->encode($res)); } /*------------------------------------------------------ */ //-- PROCESSOR /*------------------------------------------------------ */ /* 判断是否为正在预售的商品 */ $pre_sale_id = is_pre_sale_goods($goods_id); if ($pre_sale_id != null) { /* 进入收货人页面 */ $uri = build_uri("pre_sale", array("pre_sale_id" => $pre_sale_id)); // echo $uri; ecs_header("Location: ../{$uri}\n"); exit; } /* 判断是否为虚拟商品 */ $is_virtual = $GLOBALS['db']->getOne("select is_virtual from " . $GLOBALS['ecs']->table('goods') . " where goods_id={$goods_id}"); if ($is_virtual) { //直接跳到虚拟商品页面 ecs_header("Location: virtual_group_goods.php?id=" . $goods_id . "\n"); exit; } $cache_id = $goods_id . '-' . $_SESSION['user_rank'] . '-' . $_CFG['lang'];
/** * 添加商品到购物车 * * @access public * @param integer $goods_id 商品编号 * @param integer $num 商品数量 * @param array $spec 规格值对应的id数组 * @param integer $parent 基本件 * @return boolean */ function addto_cart($goods_id, $num = 1, $spec = array(), $parent = 0) { $GLOBALS['err']->clean(); $_parent_id = $parent; /* 取得商品信息 */ $sql = "SELECT g.goods_name, g.goods_sn, g.is_on_sale, g.is_real, " . "g.market_price, g.cost_price, g.shop_price AS org_price, g.promote_price, g.promote_start_date, " . "g.promote_end_date, g.goods_weight, g.integral, g.extension_code, " . "g.goods_number, g.is_alone_sale, g.is_shipping," . "IFNULL(mp.user_price, g.shop_price * '{$_SESSION['discount']}') AS shop_price " . " FROM " . $GLOBALS['ecs']->table('goods') . " AS g " . " LEFT JOIN " . $GLOBALS['ecs']->table('member_price') . " AS mp " . "ON mp.goods_id = g.goods_id AND mp.user_rank = '{$_SESSION['user_rank']}' " . " WHERE g.goods_id = '{$goods_id}'" . " AND g.is_delete = 0"; $goods = $GLOBALS['db']->getRow($sql); if (empty($goods)) { $GLOBALS['err']->add($GLOBALS['_LANG']['goods_not_exists'], ERR_NOT_EXISTS); return false; } /* 如果是作为配件添加到购物车的,需要先检查购物车里面是否已经有基本件 */ if ($parent > 0) { $sql = "SELECT COUNT(*) FROM " . $GLOBALS['ecs']->table('cart') . " WHERE goods_id='{$parent}' AND session_id='" . SESS_ID . "' AND extension_code <> 'package_buy'"; if ($GLOBALS['db']->getOne($sql) == 0) { $GLOBALS['err']->add($GLOBALS['_LANG']['no_basic_goods'], ERR_NO_BASIC_GOODS); return false; } } /* 是否正在销售 */ if ($goods['is_on_sale'] == 0) { $GLOBALS['err']->add($GLOBALS['_LANG']['not_on_sale'], ERR_NOT_ON_SALE); return false; } /* 不是配件时检查是否允许单独销售 */ if (empty($parent) && $goods['is_alone_sale'] == 0) { $GLOBALS['err']->add($GLOBALS['_LANG']['cannt_alone_sale'], ERR_CANNT_ALONE_SALE); return false; } /* 如果商品有规格则取规格商品信息 配件除外 */ $sql = "SELECT * FROM " . $GLOBALS['ecs']->table('products') . " WHERE goods_id = '{$goods_id}' LIMIT 0, 1"; $prod = $GLOBALS['db']->getRow($sql); if (is_spec($spec) && !empty($prod)) { $product_info = get_products_info($goods_id, $spec); } if (empty($product_info)) { $product_info = array('product_number' => '', 'product_id' => 0); } /* 检查:库存 */ if ($GLOBALS['_CFG']['use_storage'] == 1) { //检查:商品购买数量是否大于总库存 if ($num > $goods['goods_number']) { $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $goods['goods_number']), ERR_OUT_OF_STOCK); return false; } //商品存在规格 是货品 检查该货品库存 if (is_spec($spec) && !empty($prod)) { if (!empty($spec)) { /* 取规格的货品库存 */ if ($num > $product_info['product_number']) { $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $product_info['product_number']), ERR_OUT_OF_STOCK); return false; } } } } /* 计算商品的促销价格 */ $spec_price = spec_price($spec); $goods_price = get_final_price($goods_id, $num, true, $spec); $goods['market_price'] += $spec_price; $goods_attr = get_goods_attr_info($spec); $goods_attr_id = join(',', $spec); /* 初始化要插入购物车的基本件数据 */ $parent = array('user_id' => $_SESSION['user_id'], 'session_id' => SESS_ID, 'goods_id' => $goods_id, 'goods_sn' => addslashes($goods['goods_sn']), 'product_id' => $product_info['product_id'], 'goods_name' => addslashes($goods['goods_name']), 'market_price' => $goods['market_price'], 'goods_attr' => addslashes($goods_attr), 'goods_attr_id' => $goods_attr_id, 'cost_price' => $goods['cost_price'], 'is_real' => $goods['is_real'], 'extension_code' => $goods['extension_code'], 'is_gift' => 0, 'is_shipping' => $goods['is_shipping'], 'add_time' => gmtime(), 'rec_type' => CART_GENERAL_GOODS); //初始化为普通商品 $_SESSION['flow_type'] = CART_GENERAL_GOODS; /* 如果该配件在添加为基本件的配件时,所设置的“配件价格”比原价低,即此配件在价格上提供了优惠, */ /* 则按照该配件的优惠价格卖,但是每一个基本件只能购买一个优惠价格的“该配件”,多买的“该配件”不享 */ /* 受此优惠 */ $basic_list = array(); $sql = "SELECT parent_id, goods_price " . "FROM " . $GLOBALS['ecs']->table('group_goods') . " WHERE goods_id = '{$goods_id}'" . " AND goods_price < '{$goods_price}'" . " AND parent_id = '{$_parent_id}'" . " ORDER BY goods_price"; $res = $GLOBALS['db']->query($sql); while ($row = $GLOBALS['db']->fetchRow($res)) { $basic_list[$row['parent_id']] = $row['goods_price']; } /* 取得购物车中该商品每个基本件的数量 */ $basic_count_list = array(); if ($basic_list) { $sql = "SELECT goods_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND parent_id = 0" . " AND extension_code <> 'package_buy' " . " AND goods_id " . db_create_in(array_keys($basic_list)) . " GROUP BY goods_id"; $res = $GLOBALS['db']->query($sql); while ($row = $GLOBALS['db']->fetchRow($res)) { $basic_count_list[$row['goods_id']] = $row['count']; } } /* 取得购物车中该商品每个基本件已有该商品配件数量,计算出每个基本件还能有几个该商品配件 */ /* 一个基本件对应一个该商品配件 */ if ($basic_count_list) { $sql = "SELECT parent_id, SUM(goods_number) AS count " . "FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "'" . " AND goods_id = '{$goods_id}'" . " AND extension_code <> 'package_buy' " . " AND parent_id " . db_create_in(array_keys($basic_count_list)) . " GROUP BY parent_id"; $res = $GLOBALS['db']->query($sql); while ($row = $GLOBALS['db']->fetchRow($res)) { $basic_count_list[$row['parent_id']] -= $row['count']; } } /* 循环插入配件 如果是配件则用其添加数量依次为购物车中所有属于其的基本件添加足够数量的该配件 */ foreach ($basic_list as $parent_id => $fitting_price) { /* 如果已全部插入,退出 */ if ($num <= 0) { break; } /* 如果该基本件不再购物车中,执行下一个 */ if (!isset($basic_count_list[$parent_id])) { continue; } /* 如果该基本件的配件数量已满,执行下一个基本件 */ if ($basic_count_list[$parent_id] <= 0) { continue; } /* 作为该基本件的配件插入 */ $parent['goods_price'] = max($fitting_price, 0) + $spec_price; //允许该配件优惠价格为0 $parent['goods_number'] = min($num, $basic_count_list[$parent_id]); $parent['parent_id'] = $parent_id; /* 添加 */ $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT'); /* 改变数量 */ $num -= $parent['goods_number']; } /* 如果数量不为0,作为基本件插入 */ if ($num > 0) { /* 检查该商品是否已经存在在购物车中 */ $sql = "SELECT goods_number FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . " AND user_id= '" . $_SESSION['user_id'] . "'" . " AND rec_type = 'CART_GENERAL_GOODS'"; $row = $GLOBALS['db']->getRow($sql); if ($row) { $num += $row['goods_number']; if (is_spec($spec) && !empty($prod)) { $goods_storage = $product_info['product_number']; } else { $goods_storage = $goods['goods_number']; } if ($GLOBALS['_CFG']['use_storage'] == 0 || $num <= $goods_storage) { $goods_price = get_final_price($goods_id, $num, true, $spec); $sql = "UPDATE " . $GLOBALS['ecs']->table('cart') . " SET goods_number = '{$num}'" . " , goods_price = '{$goods_price}'" . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' " . " AND parent_id = 0 AND goods_attr = '" . get_goods_attr_info($spec) . "' " . " AND extension_code <> 'package_buy' " . "AND rec_type = 'CART_GENERAL_GOODS'"; $GLOBALS['db']->query($sql); } else { $GLOBALS['err']->add(sprintf($GLOBALS['_LANG']['shortage'], $num), ERR_OUT_OF_STOCK); return false; } } else { // 判断是否为预售商品 $pre_sale_id = is_pre_sale_goods($goods_id); if (!empty($pre_sale_id)) { /* 更新:记录购物流程类型:预售 */ $_SESSION['flow_type'] = CART_PRE_SALE_GOODS; $_SESSION['extension_code'] = PRE_SALE_CODE; $_SESSION['extension_id'] = $pre_sale_id; $parent['extension_code'] = PRE_SALE_CODE; $parent['rec_type'] = CART_PRE_SALE_GOODS; //获取预售信息 $pre_sale = pre_sale_info($pre_sale_id, $num); if ($pre_sale['deposit'] > 0) { //定金大于0则使用定金金额 $goods_price = $pre_sale['deposit']; } else { //计算当前价格 $goods_price = $pre_sale['cur_price']; //加入规格价格 if (!empty($spec)) { $spec_price = spec_price($spec); $goods_price += $spec_price; } } } else { $goods_price = get_final_price($goods_id, $num, true, $spec); } $parent['goods_price'] = max($goods_price, 0); $parent['goods_number'] = $num; $parent['parent_id'] = 0; $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('cart'), $parent, 'INSERT'); } /** * 判断是否为虚拟团购商品 */ $virtual_sale_id = is_virtual_sale_goods($goods_id); if (!empty($virtual_sale_id)) { /* 更新:记录购物流程类型:预售 */ $_SESSION['flow_type'] = CART_VIRTUAL_GROUP_GOODS; $_SESSION['extension_code'] = VIRTUAL_SALE_CODE; $_SESSION['extension_id'] = $virtual_sale_id; $GLOBALS['db']->query("update " . $GLOBALS['ecs']->table('cart') . " set rec_type=" . CART_VIRTUAL_GROUP_GOODS . " WHERE session_id = '" . SESS_ID . "' AND goods_id = '{$goods_id}' "); } } /* 把赠品删除 */ $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '" . SESS_ID . "' AND is_gift <> 0"; $GLOBALS['db']->query($sql); return true; }