Ecshop v2.7.3的购物车处理方面在现在看来有比较反用户体验的设计:

  1. 用户未登录时加入购物车的商品,在用户登录后会被清空而不是加入到登录用户的购物车中;
  2. 用户登录后加入购物车的商品,在退出后会被清空。

这两种设计在现在看来简直不可理喻,对用户极不友好,作为一个以流量至上的商城,这样的设计会导致客户的流失。

查看源码才发现,ecshop是以session_id作为保存购物车商品的依据,而不是用户id。个人认为这样的设计是由于其以下单为主,用户有没有注册都可以直接下单,这样就导致其整套逻辑以"会话”为主体。

修改ecshop购物车行为,使其以客户为主,具体设计是:

  1. 用户登录后加入购物车的商品,退出后依然保留;
  2. 用户未登录时加入购物车的商品:
    1. 如果用户登录,则合并到客户的购物车中;
    2. 如果未登录即关闭,则保存到cookie中一段时间(ecshop本身已实现)

策略:

  1.登录前用session_id,登录后用user_id查看,操作购物车数据;

  2.用户登录后,更新合并购物车数据;

  3.用户登出后,依然有无主商品的话,删除。

lib_main.php添加。

  1. /**
  2. * 选择购物车商品的获取条件
  3. * Desc: 如果已登录,返回user_id条件,否则返回session_id条件
  4. * @access public
  5. * @return where condition
  6. */
  7. function rec_select()
  8. {
  9. return (isset($_SESSION['user_id'])&&intval($_SESSION['user_id'])>0)?"user_id= ".intval($_SESSION['user_id'])." ":"session_id = '" . SESS_ID . "' ";
  10. }
  11.  
  12. /**
  13. * 更新购物车中的商品
  14. * Desc: 如果用户已登录且其在未登录时将商品加入了购物车,那么将未登录时的购物车与用户之前的购物车商品合并
  15. * @access public
  16. * @return boolean
  17. */
  18. function update_user_cart()
  19. {
  20. if(!isset($_SESSION['user_id']))
  21. return FALSE;
  22.  
  23. /*查看是否有未登录时加入购物车的商品*/
  24. $sql = "SELECT *, IF(parent_id, parent_id, goods_id) AS pid " .
  25. " FROM " . $GLOBALS['ecs']->table('cart') . " " .
  26. " WHERE session_id = '" . SESS_ID . "' AND user_id=0 AND rec_type = '" . CART_GENERAL_GOODS . "'" .
  27. " ORDER BY pid, parent_id";
  28. $res = $GLOBALS['db']->query($sql);
  29.  
  30. $_uid=intval($_SESSION['user_id']);
  31.  
  32. while ($row = $GLOBALS['db']->fetchRow($res))
  33. {
  34. if($_uid>0)
  35. {
  36. /* 检查该商品是否已经存在在购物车中 */
  37. $sql="SELECT * FROM {$GLOBALS['ecs']->table('cart')} WHERE user_id={$_uid} AND goods_id={$row['goods_id']} AND rec_type = '" . CART_GENERAL_GOODS."'
  38. AND goods_attr='{$row['goods_attr']}'
  39. AND goods_attr_id={$row['goods_attr_id']}
  40. AND product_id={$row['product_id']}
  41. AND parent_id={$row['parent_id']}
  42. AND is_gift={$row['is_gift']}
  43. AND is_shipping={$row['is_shipping']}
  44. ";
  45. $_one=$GLOBALS['db']->getOne($sql);
  46.  
  47. if(!empty($_one))
  48. {
  49. $goods_number=$_one['goods_number']+$row['goods_number'];
  50. $sql="UPDATE {$GLOBALS['ecs']->table('cart')} SET goods_number = {$goods_number} WHERE rec_id = {$_one['rec_id']}";
  51. $GLOBALS['db']->query($sql);
  52.  
  53. $sql="DELETE FROM {$GLOBALS['ecs']->table('cart')} WHERE rec_id = {$row['rec_id']}";
  54. $GLOBALS['db']->query($sql);
  55. }
  56. else
  57. {
  58. $sql="UPDATE {$GLOBALS['ecs']->table('cart')} SET user_id = {$_uid} WHERE rec_id = {$row['rec_id']}";
  59. $GLOBALS['db']->query($sql);
  60. }
  61.  
  62. }
  63. }
  64. return TRUE;
  65. }

核心代码

cls_session.php修改函数

  1. function destroy_session()
  2. {
  3. $GLOBALS['_SESSION'] = array();
  4.  
  5. setcookie($this->session_name, $this->session_id, 1, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure);
  6.  
  7. /* ECSHOP 鑷?畾涔夋墽琛岄儴鍒 */
  8. /*
  9. if (!empty($GLOBALS['ecs']))
  10. {
  11. $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id'");
  12. }
  13. */
  14. /*修改:只删除没有用户的购物车*/
  15. if (!empty($GLOBALS['ecs']))
  16. {
  17. $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id' AND user_id=0");
  18. }
  19.  
  20. /* ECSHOP 鑷?畾涔夋墽琛岄儴鍒 */
  21.  
  22. $this->db->query('DELETE FROM ' . $this->session_data_table . " WHERE sesskey = '" . $this->session_id . "' LIMIT 1");
  23.  
  24. return $this->db->query('DELETE FROM ' . $this->session_table . " WHERE sesskey = '" . $this->session_id . "' LIMIT 1");
  25. }

flow.php 在act=login,已登录的处理函数后;act=add_to_cart 加入购物车后,user.php action=act_login登录后加上

  1. update_user_info(); //更新用户信息
  2. /*如果用户已登录且其在未登录时将商品加入了购物车,那么将未登录时的购物车与用户之前的购物车商品合并*/
  3. update_user_cart();//新加上
  4. recalculate_price(); // 重新计算购物车中的商品价格

flow.php , lib_insert.php,lib_main.php,lib_order.php , lib_transaction.php ,order.php 等内容中的 session_id='".SESS_ID."'"改为 rec_select();

测试看看。

【Ecshop】修改处理用户购物车的行为的更多相关文章

  1. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码

    在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...

  2. mac 安装mysql + 修改root用户密码 + 及报Access denied for user 'root'@'localhost' (using password:YES)解决办法

    1.下载MySQL 到mysql的官网http://dev.mysql.com/downloads/mysql/然后在页面中会看到“MySQL Community Server”下方有一个“downl ...

  3. SYSDBA身份登陆时可以修改其他用户的密码

    在以SYSDBA身份登陆时可以修改其他用户的密码,比如:SQL> alter user user01 identified by user10;用户已更改.这个是把USER01用户密码修改为US ...

  4. ECSHOP修改后台地址

    为了保证ECSHOP商城安全,需要修改许多默认的程序路径,今天讲下后台路径修改. ECSHOP修改后台路径根据版本不同,修改的地方也不一样.我现在用的是2.7.3,上网查了资料,很少,所以自己先写下来 ...

  5. samba共享修改匿名用户为非nobody

    samba共享修改匿名用户为非nobody 1)linux的samba用户,如果开启匿名用户登陆共享权限,security 设置为 share ,配置如下:[root@centos69:~]$grep ...

  6. 修改linux用户密码

    对于初学者来说,如何修改linux用户密码也不是件容易的事,其实非常简单,下面举例说明: 如果是以root身份登录,修改root密码.只要输入 passwd 就会出现: New password:  ...

  7. 如何修改Oracle用户密码

    大家如果不知道oracle数据库的密码的话,我们可以通过简单的命令行把密码进行修改. 1.打开cmd 2 在弹出的命令提示窗口输入 set oracle_sid=数据库名称(实例),回车.例如数据库名 ...

  8. Linux创建修改删除用户和组

    Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...

  9. ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加

    原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...

随机推荐

  1. Java文件与io——打印流和对象流

    打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...

  2. 系统整理 精讲 swift 泛型

    泛型是一种非常领会的语法,让我很是膜拜! 真是让人又爱又恨,学不懂的时候很抓狂 允许程序在函数,枚举,结构体,类中定义类型形参(类型可以动态改变) 每次使用可以传入不同类型的形参! Array< ...

  3. Java集合框架—List

    Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢.线程不同步. |- ...

  4. 构建第一个Spring Boot2.0应用之集成mybatis(六)

    一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.步骤 方式一:利用配置文件配 ...

  5. zabbix文档3.4-7配置

    zabbix文档3.4-7配置 1 主机和主机组 典型的Zabbix主机是您希望监视的设备(服务器,工作站,交换机等). 创建主机是Zabbix中首个监控任务之一.例如,如果要监视服务器"x ...

  6. 谈谈bootstrap在实践中的应用

    bootstrap官网是http://www.bootcss.com/ bootstrap的CDN的网址是http://www.bootcdn.cn/ 在平时写的时候尽量用CDN,这样对于网站的运行效 ...

  7. Codeforces 802I Fake News (hard)

    Codeforces 802I 题意:统计所有不同子串出现次数的平方的和. 想法:建一个SAM,$Ans=\sum (step[i]-step[fa[i]])*right[i]^2$ #include ...

  8. JS每点击一次添加多少条数据

    很久不写文档,平时只写日记,所以对这个有点生疏,如果写的不好别介意. 今天闲的蛋疼,于是要写写白天的东西,并且以后也会一直更新(一直写)下去. 时间太仓促了,这几个月,今天算最晚的一次凌晨1点,吃不消 ...

  9. OpenGL glReadPixels 转成 CImage

    本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的 ...

  10. Unity结合Flask实现排行榜功能

    业余做的小游戏,排行榜本来是用PlayerPrefs存储在本地,现在想将数据放在服务器上.因为功能很简单,就选择了小巧玲珑的Flask来实现. 闲话少叙.首先考虑URL的设计.排行榜无非是一堆分数sc ...