cart.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. <?php
  2. /**
  3. * 购物车操作
  4. **by 好商城V3 www.33hao.com 运营版*/
  5. defined('InShopNC') or exit('Access Invalid!');
  6. class cartControl extends BaseBuyControl {
  7. public function __construct() {
  8. parent::__construct();
  9. Language::read('home_cart_index');
  10. Tpl::output('hidden_nctoolbar', 1);
  11. $op = isset($_GET['op']) ? $_GET['op'] : $_POST['op'];
  12. //允许不登录就可以访问的op
  13. $op_arr = array('ajax_load','add','del');
  14. if (!in_array($op,$op_arr) && !$_SESSION['member_id'] ){
  15. $current_url = request_uri();
  16. redirect('index.php?act=login&ref_url='.urlencode($current_url));
  17. }
  18. Tpl::output('hidden_rtoolbar_cart', 1);
  19. }
  20. /**
  21. * 购物车首页
  22. */
  23. public function indexOp() {
  24. $model_cart = Model('cart');
  25. $logic_buy_1 = logic('buy_1');
  26. //购物车列表
  27. $cart_list = $model_cart->listCart('db',array('buyer_id'=>$_SESSION['member_id']));
  28. //购物车列表 [得到最新商品属性及促销信息]
  29. $cart_list = $logic_buy_1->getGoodsCartList($cart_list);
  30. //购物车商品以店铺ID分组显示,并计算商品小计,店铺小计与总价由JS计算得出
  31. $store_cart_list = array();
  32. foreach ($cart_list as $cart) {
  33. $cart['goods_total'] = ncPriceFormat($cart['goods_price'] * $cart['goods_num']);
  34. $store_cart_list[$cart['store_id']][] = $cart;
  35. }
  36. Tpl::output('store_cart_list',$store_cart_list);
  37. //店铺信息
  38. $store_list = Model('store')->getStoreMemberIDList(array_keys($store_cart_list));
  39. Tpl::output('store_list',$store_list);
  40. //取得店铺级活动 - 可用的满即送活动
  41. $mansong_rule_list = $logic_buy_1->getMansongRuleList(array_keys($store_cart_list));
  42. Tpl::output('mansong_rule_list',$mansong_rule_list);
  43. //取得哪些店铺有满免运费活动
  44. $free_freight_list = $logic_buy_1->getFreeFreightActiveList(array_keys($store_cart_list));
  45. Tpl::output('free_freight_list',$free_freight_list);
  46. //标识 购买流程执行第几步
  47. Tpl::output('buy_step','step1');
  48. Tpl::showpage(empty($cart_list) ? 'cart_empty' : 'cart');
  49. }
  50. /**
  51. * 异步查询购物车
  52. */
  53. public function ajax_loadOp() {
  54. $model_cart = Model('cart');
  55. if ($_SESSION['member_id']){
  56. //登录后
  57. $cart_list = $model_cart->listCart('db',array('buyer_id'=>$_SESSION['member_id']));
  58. $cart_array = array();
  59. if(!empty($cart_list)){
  60. foreach ($cart_list as $k => $cart){
  61. $cart_array['list'][$k]['cart_id'] = $cart['cart_id'];
  62. $cart_array['list'][$k]['goods_id'] = $cart['goods_id'];
  63. $cart_array['list'][$k]['goods_name'] = $cart['goods_name'];
  64. $cart_array['list'][$k]['goods_price'] = $cart['goods_price'];
  65. $cart_array['list'][$k]['goods_image'] = thumb($cart,60);
  66. $cart_array['list'][$k]['goods_num'] = $cart['goods_num'];
  67. $cart_array['list'][$k]['goods_url'] = urlShop('goods', 'index', array('goods_id' => $cart['goods_id']));
  68. }
  69. }
  70. } else {
  71. //登录前
  72. $cart_list = $model_cart->listCart('cookie');
  73. foreach ($cart_list as $key => $cart){
  74. $value = array();
  75. $value['cart_id'] = $cart['goods_id'];
  76. $value['goods_name'] = $cart['goods_name'];
  77. $value['goods_price'] = $cart['goods_price'];
  78. $value['goods_num'] = $cart['goods_num'];
  79. $value['goods_image'] = thumb($cart,60);
  80. $value['goods_url'] = urlShop('goods', 'index', array('goods_id' => $cart['goods_id']));
  81. $cart_array['list'][] = $value;
  82. }
  83. }
  84. setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
  85. $cart_array['cart_all_price'] = ncPriceFormat($model_cart->cart_all_price);
  86. $cart_array['cart_goods_num'] = $model_cart->cart_goods_num;
  87. if ($_GET['type'] == 'html') {
  88. Tpl::output('cart_list',$cart_array);
  89. Tpl::showpage('cart_mini','null_layout');
  90. } else {
  91. $cart_array = strtoupper(CHARSET) == 'GBK' ? Language::getUTF8($cart_array) : $cart_array;
  92. $json_data = json_encode($cart_array);
  93. if (isset($_GET['callback'])) {
  94. $json_data = $_GET['callback']=='?' ? '('.$json_data.')' : $_GET['callback']."($json_data);";
  95. }
  96. exit($json_data);
  97. }
  98. }
  99. /**
  100. * 加入购物车,登录后存入购物车表
  101. * 存入COOKIE,由于COOKIE长度限制,最多保存5个商品
  102. * 未登录不能将优惠套装商品加入购物车,登录前保存的信息以goods_id为下标
  103. *
  104. */
  105. public function addOp() {
  106. $model_goods = Model('goods');
  107. $logic_buy_1 = Logic('buy_1');
  108. if (is_numeric($_GET['goods_id'])) {
  109. //商品加入购物车(默认)
  110. $goods_id = intval($_GET['goods_id']);
  111. $quantity = intval($_GET['quantity']);
  112. if ($goods_id <= 0) return ;
  113. $goods_info = $model_goods->getGoodsOnlineInfoAndPromotionById($goods_id);
  114. //抢购
  115. $logic_buy_1->getGroupbuyInfo($goods_info);
  116. //限时折扣
  117. $logic_buy_1->getXianshiInfo($goods_info,$quantity);
  118. $this->_check_goods($goods_info,$_GET['quantity']);
  119. } elseif (is_numeric($_GET['bl_id'])) {
  120. //优惠套装加入购物车(单套)
  121. if (!$_SESSION['member_id']) {
  122. exit(json_encode(array('msg'=>'请先登录','UTF-8')));
  123. }
  124. $bl_id = intval($_GET['bl_id']);
  125. if ($bl_id <= 0) return ;
  126. $model_bl = Model('p_bundling');
  127. $bl_info = $model_bl->getBundlingInfo(array('bl_id'=>$bl_id));
  128. if (empty($bl_info) || $bl_info['bl_state'] == '0') {
  129. exit(json_encode(array('msg'=>'该优惠套装已不存在,建议您单独购买','UTF-8')));
  130. }
  131. //检查每个商品是否符合条件,并重新计算套装总价
  132. $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$bl_id));
  133. $goods_id_array = array();
  134. $bl_amount = 0;
  135. foreach ($bl_goods_list as $goods) {
  136. $goods_id_array[] = $goods['goods_id'];
  137. $bl_amount += $goods['bl_goods_price'];
  138. }
  139. $model_goods = Model('goods');
  140. $goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  141. foreach ($goods_list as $goods) {
  142. $this->_check_goods($goods,1);
  143. }
  144. //优惠套装作为一条记录插入购物车,图片取套装内的第一个商品图
  145. $goods_info = array();
  146. $goods_info['store_id'] = $bl_info['store_id'];
  147. $goods_info['goods_id'] = $goods_list[0]['goods_id'];
  148. $goods_info['goods_name'] = $bl_info['bl_name'];
  149. $goods_info['goods_price'] = $bl_amount;
  150. $goods_info['goods_num'] = 1;
  151. $goods_info['goods_image'] = $goods_list[0]['goods_image'];
  152. $goods_info['store_name'] = $bl_info['store_name'];
  153. $goods_info['bl_id'] = $bl_id;
  154. $quantity = 1;
  155. }
  156. //已登录状态,存入数据库,未登录时,存入COOKIE
  157. if($_SESSION['member_id']) {
  158. $save_type = 'db';
  159. $goods_info['buyer_id'] = $_SESSION['member_id'];
  160. } else {
  161. $save_type = 'cookie';
  162. }
  163. $model_cart = Model('cart');
  164. $insert = $model_cart->addCart($goods_info,$save_type,$quantity);
  165. if ($insert) {
  166. //购物车商品种数记入cookie
  167. setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
  168. $data = array('state'=>'true', 'num' => $model_cart->cart_goods_num, 'amount' => ncPriceFormat($model_cart->cart_all_price));
  169. } else {
  170. $data = array('state'=>'false');
  171. }
  172. exit(json_encode($data));
  173. }
  174. /**
  175. * 推荐组合加入购物车
  176. */
  177. public function add_combOp() {
  178. if (!preg_match('/^[\d|]+$/', $_GET['goods_ids'])) {
  179. exit(json_encode(array('state'=>'false')));
  180. }
  181. $model_goods = Model('goods');
  182. $logic_buy_1 = Logic('buy_1');
  183. if (!$_SESSION['member_id']) {
  184. exit(json_encode(array('msg'=>'请先登录','UTF-8')));
  185. }
  186. $goods_id_array = explode('|', $_GET['goods_ids']);
  187. $model_goods = Model('goods');
  188. $goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  189. foreach ($goods_list as $goods) {
  190. $this->_check_goods($goods,1);
  191. }
  192. //抢购
  193. $logic_buy_1->getGroupbuyCartList($goods_list);
  194. //限时折扣
  195. $logic_buy_1->getXianshiCartList($goods_list);
  196. $model_cart = Model('cart');
  197. foreach ($goods_list as $goods_info) {
  198. $cart_info = array();
  199. $cart_info['store_id'] = $goods_info['store_id'];
  200. $cart_info['goods_id'] = $goods_info['goods_id'];
  201. $cart_info['goods_name'] = $goods_info['goods_name'];
  202. $cart_info['goods_price'] = $goods_info['goods_price'];
  203. $cart_info['goods_num'] = 1;
  204. $cart_info['goods_image'] = $goods_info['goods_image'];
  205. $cart_info['store_name'] = $goods_info['store_name'];
  206. $quantity = 1;
  207. //已登录状态,存入数据库,未登录时,存入COOKIE
  208. if($_SESSION['member_id']) {
  209. $save_type = 'db';
  210. $cart_info['buyer_id'] = $_SESSION['member_id'];
  211. } else {
  212. $save_type = 'cookie';
  213. }
  214. $insert = $model_cart->addCart($cart_info,$save_type,$quantity);
  215. if ($insert) {
  216. //购物车商品种数记入cookie
  217. setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
  218. $data = array('state'=>'true', 'num' => $model_cart->cart_goods_num, 'amount' => ncPriceFormat($model_cart->cart_all_price));
  219. } else {
  220. $data = array('state'=>'false');
  221. exit(json_encode($data));
  222. }
  223. }
  224. exit(json_encode($data));
  225. }
  226. /**
  227. * 检查商品是否符合加入购物车条件
  228. * @param unknown $goods
  229. * @param number $quantity
  230. */
  231. private function _check_goods($goods_info, $quantity) {
  232. if(empty($quantity)) {
  233. exit(json_encode(array('msg'=>Language::get('wrong_argument','UTF-8'))));
  234. }
  235. if(empty($goods_info)) {
  236. exit(json_encode(array('msg'=>Language::get('cart_add_goods_not_exists','UTF-8'))));
  237. }
  238. if ($goods_info['store_id'] == $_SESSION['store_id']) {
  239. exit(json_encode(array('msg'=>Language::get('cart_add_cannot_buy','UTF-8'))));
  240. }
  241. if(intval($goods_info['goods_storage']) < 1) {
  242. exit(json_encode(array('msg'=>Language::get('cart_add_stock_shortage','UTF-8'))));
  243. }
  244. if(intval($goods_info['goods_storage']) < $quantity) {
  245. exit(json_encode(array('msg'=>Language::get('cart_add_too_much','UTF-8'))));
  246. }
  247. if ($goods_info['is_virtual'] || $goods_info['is_fcode'] || $goods_info['is_presell']) {
  248. exit(json_encode(array('msg'=>'该商品不允许加入购物车,请直接购买','UTF-8')));
  249. }
  250. }
  251. /**
  252. * 购物车更新商品数量
  253. */
  254. public function updateOp() {
  255. $cart_id = intval(abs($_GET['cart_id']));
  256. $quantity = intval(abs($_GET['quantity']));
  257. if(empty($cart_id) || empty($quantity)) {
  258. exit(json_encode(array('msg'=>Language::get('cart_update_buy_fail','UTF-8'))));
  259. }
  260. $model_cart = Model('cart');
  261. $model_goods= Model('goods');
  262. $logic_buy_1 = logic('buy_1');
  263. //存放返回信息
  264. $return = array();
  265. $cart_info = $model_cart->getCartInfo(array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  266. if ($cart_info['bl_id'] == '0') {
  267. //普通商品
  268. $goods_id = intval($cart_info['goods_id']);
  269. $goods_info = $logic_buy_1->getGoodsOnlineInfo($goods_id,$quantity);
  270. if(empty($goods_info)) {
  271. $return['state'] = 'invalid';
  272. $return['msg'] = '商品已被下架';
  273. $return['subtotal'] = 0;
  274. QueueClient::push('delCart', array('buyer_id'=>$_SESSION['member_id'],'cart_ids'=>array($cart_id)));
  275. exit(json_encode($return));
  276. }
  277. //抢购
  278. $logic_buy_1->getGroupbuyInfo($goods_info);
  279. //限时折扣
  280. $logic_buy_1->getXianshiInfo($goods_info,$quantity);
  281. $quantity = $goods_info['goods_num'];
  282. if(intval($goods_info['goods_storage']) < $quantity) {
  283. $return['state'] = 'shortage';
  284. $return['msg'] = '库存不足';
  285. $return['goods_num'] = $goods_info['goods_num'];
  286. $return['goods_price'] = $goods_info['goods_price'];
  287. $return['subtotal'] = $goods_info['goods_price'] * $quantity;
  288. $model_cart->editCart(array('goods_num'=>$goods_info['goods_storage']),array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  289. exit(json_encode($return));
  290. }
  291. } else {
  292. //优惠套装商品
  293. $model_bl = Model('p_bundling');
  294. $bl_goods_list = $model_bl->getBundlingGoodsList(array('bl_id'=>$cart_info['bl_id']));
  295. $goods_id_array = array();
  296. foreach ($bl_goods_list as $goods) {
  297. $goods_id_array[] = $goods['goods_id'];
  298. }
  299. $goods_list = $model_goods->getGoodsOnlineListAndPromotionByIdArray($goods_id_array);
  300. //如果其中有商品下架,删除
  301. if (count($goods_list) != count($goods_id_array)) {
  302. $return['state'] = 'invalid';
  303. $return['msg'] = '该优惠套装已经无效,建议您购买单个商品';
  304. $return['subtotal'] = 0;
  305. QueueClient::push('delCart', array('buyer_id'=>$_SESSION['member_id'],'cart_ids'=>array($cart_id)));
  306. exit(json_encode($return));
  307. }
  308. //如果有商品库存不足,更新购买数量到目前最大库存
  309. foreach ($goods_list as $goods_info) {
  310. if ($quantity > $goods_info['goods_storage']) {
  311. $return['state'] = 'shortage';
  312. $return['msg'] = '该优惠套装部分商品库存不足,建议您降低购买数量或购买库存足够的单个商品';
  313. $return['goods_num'] = $goods_info['goods_storage'];
  314. $return['goods_price'] = $cart_info['goods_price'];
  315. $return['subtotal'] = $cart_info['goods_price'] * $quantity;
  316. $model_cart->editCart(array('goods_num'=>$goods_info['goods_storage']),array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  317. exit(json_encode($return));
  318. break;
  319. }
  320. }
  321. $goods_info['goods_price'] = $cart_info['goods_price'];
  322. }
  323. $data = array();
  324. $data['goods_num'] = $quantity;
  325. $data['goods_price'] = $goods_info['goods_price'];
  326. $update = $model_cart->editCart($data,array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  327. if ($update) {
  328. $return = array();
  329. $return['state'] = 'true';
  330. $return['subtotal'] = $goods_info['goods_price'] * $quantity;
  331. $return['goods_price'] = $goods_info['goods_price'];
  332. $return['goods_num'] = $quantity;
  333. } else {
  334. $return = array('msg'=>Language::get('cart_update_buy_fail','UTF-8'));
  335. }
  336. exit(json_encode($return));
  337. }
  338. /**
  339. * 购物车删除单个商品,未登录前使用cart_id即为goods_id
  340. */
  341. public function delOp() {
  342. $cart_id = intval($_GET['cart_id']);
  343. if($cart_id < 0) return ;
  344. $model_cart = Model('cart');
  345. $data = array();
  346. if ($_SESSION['member_id']) {
  347. //登录状态下删除数据库内容
  348. $delete = $model_cart->delCart('db',array('cart_id'=>$cart_id,'buyer_id'=>$_SESSION['member_id']));
  349. if($delete) {
  350. $data['state'] = 'true';
  351. $data['quantity'] = $model_cart->cart_goods_num;
  352. $data['amount'] = $model_cart->cart_all_price;
  353. } else {
  354. $data['msg'] = Language::get('cart_drop_del_fail','UTF-8');
  355. }
  356. } else {
  357. //未登录时删除cookie的购物车信息
  358. $delete = $model_cart->delCart('cookie',array('goods_id'=>$cart_id));
  359. if($delete) {
  360. $data['state'] = 'true';
  361. $data['quantity'] = $model_cart->cart_goods_num;
  362. $data['amount'] = $model_cart->cart_all_price;
  363. }
  364. }
  365. setNcCookie('cart_goods_num',$model_cart->cart_goods_num,2*3600);
  366. $json_data = json_encode($data);
  367. if (isset($_GET['callback'])) {
  368. $json_data = $_GET['callback']=='?' ? '('.$json_data.')' : $_GET['callback']."($json_data);";
  369. }
  370. exit($json_data);
  371. }
  372. }