【Ecshop】修改处理用户购物车的行为
Ecshop v2.7.3的购物车处理方面在现在看来有比较反用户体验的设计:
- 用户未登录时加入购物车的商品,在用户登录后会被清空而不是加入到登录用户的购物车中;
- 用户登录后加入购物车的商品,在退出后会被清空。
这两种设计在现在看来简直不可理喻,对用户极不友好,作为一个以流量至上的商城,这样的设计会导致客户的流失。
查看源码才发现,ecshop是以session_id作为保存购物车商品的依据,而不是用户id。个人认为这样的设计是由于其以下单为主,用户有没有注册都可以直接下单,这样就导致其整套逻辑以"会话”为主体。
修改ecshop购物车行为,使其以客户为主,具体设计是:
- 用户登录后加入购物车的商品,退出后依然保留;
- 用户未登录时加入购物车的商品:
- 如果用户登录,则合并到客户的购物车中;
- 如果未登录即关闭,则保存到cookie中一段时间(ecshop本身已实现)
策略:
1.登录前用session_id,登录后用user_id查看,操作购物车数据;
2.用户登录后,更新合并购物车数据;
3.用户登出后,依然有无主商品的话,删除。
lib_main.php添加。
- /**
- * 选择购物车商品的获取条件
- * Desc: 如果已登录,返回user_id条件,否则返回session_id条件
- * @access public
- * @return where condition
- */
- function rec_select()
- {
- return (isset($_SESSION['user_id'])&&intval($_SESSION['user_id'])>0)?"user_id= ".intval($_SESSION['user_id'])." ":"session_id = '" . SESS_ID . "' ";
- }
- /**
- * 更新购物车中的商品
- * Desc: 如果用户已登录且其在未登录时将商品加入了购物车,那么将未登录时的购物车与用户之前的购物车商品合并
- * @access public
- * @return boolean
- */
- function update_user_cart()
- {
- if(!isset($_SESSION['user_id']))
- return FALSE;
- /*查看是否有未登录时加入购物车的商品*/
- $sql = "SELECT *, IF(parent_id, parent_id, goods_id) AS pid " .
- " FROM " . $GLOBALS['ecs']->table('cart') . " " .
- " WHERE session_id = '" . SESS_ID . "' AND user_id=0 AND rec_type = '" . CART_GENERAL_GOODS . "'" .
- " ORDER BY pid, parent_id";
- $res = $GLOBALS['db']->query($sql);
- $_uid=intval($_SESSION['user_id']);
- while ($row = $GLOBALS['db']->fetchRow($res))
- {
- if($_uid>0)
- {
- /* 检查该商品是否已经存在在购物车中 */
- $sql="SELECT * FROM {$GLOBALS['ecs']->table('cart')} WHERE user_id={$_uid} AND goods_id={$row['goods_id']} AND rec_type = '" . CART_GENERAL_GOODS."'
- AND goods_attr='{$row['goods_attr']}'
- AND goods_attr_id={$row['goods_attr_id']}
- AND product_id={$row['product_id']}
- AND parent_id={$row['parent_id']}
- AND is_gift={$row['is_gift']}
- AND is_shipping={$row['is_shipping']}
- ";
- $_one=$GLOBALS['db']->getOne($sql);
- if(!empty($_one))
- {
- $goods_number=$_one['goods_number']+$row['goods_number'];
- $sql="UPDATE {$GLOBALS['ecs']->table('cart')} SET goods_number = {$goods_number} WHERE rec_id = {$_one['rec_id']}";
- $GLOBALS['db']->query($sql);
- $sql="DELETE FROM {$GLOBALS['ecs']->table('cart')} WHERE rec_id = {$row['rec_id']}";
- $GLOBALS['db']->query($sql);
- }
- else
- {
- $sql="UPDATE {$GLOBALS['ecs']->table('cart')} SET user_id = {$_uid} WHERE rec_id = {$row['rec_id']}";
- $GLOBALS['db']->query($sql);
- }
- }
- }
- return TRUE;
- }
核心代码
cls_session.php修改函数
- function destroy_session()
- {
- $GLOBALS['_SESSION'] = array();
- setcookie($this->session_name, $this->session_id, 1, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure);
- /* ECSHOP 鑷?畾涔夋墽琛岄儴鍒 */
- /*
- if (!empty($GLOBALS['ecs']))
- {
- $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id'");
- }
- */
- /*修改:只删除没有用户的购物车*/
- if (!empty($GLOBALS['ecs']))
- {
- $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id' AND user_id=0");
- }
- /* ECSHOP 鑷?畾涔夋墽琛岄儴鍒 */
- $this->db->query('DELETE FROM ' . $this->session_data_table . " WHERE sesskey = '" . $this->session_id . "' LIMIT 1");
- return $this->db->query('DELETE FROM ' . $this->session_table . " WHERE sesskey = '" . $this->session_id . "' LIMIT 1");
- }
flow.php 在act=login,已登录的处理函数后;act=add_to_cart 加入购物车后,user.php action=act_login登录后加上
- update_user_info(); //更新用户信息
- /*如果用户已登录且其在未登录时将商品加入了购物车,那么将未登录时的购物车与用户之前的购物车商品合并*/
- update_user_cart();//新加上
- 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】修改处理用户购物车的行为的更多相关文章
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...
- 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 ...
- SYSDBA身份登陆时可以修改其他用户的密码
在以SYSDBA身份登陆时可以修改其他用户的密码,比如:SQL> alter user user01 identified by user10;用户已更改.这个是把USER01用户密码修改为US ...
- ECSHOP修改后台地址
为了保证ECSHOP商城安全,需要修改许多默认的程序路径,今天讲下后台路径修改. ECSHOP修改后台路径根据版本不同,修改的地方也不一样.我现在用的是2.7.3,上网查了资料,很少,所以自己先写下来 ...
- samba共享修改匿名用户为非nobody
samba共享修改匿名用户为非nobody 1)linux的samba用户,如果开启匿名用户登陆共享权限,security 设置为 share ,配置如下:[root@centos69:~]$grep ...
- 修改linux用户密码
对于初学者来说,如何修改linux用户密码也不是件容易的事,其实非常简单,下面举例说明: 如果是以root身份登录,修改root密码.只要输入 passwd 就会出现: New password: ...
- 如何修改Oracle用户密码
大家如果不知道oracle数据库的密码的话,我们可以通过简单的命令行把密码进行修改. 1.打开cmd 2 在弹出的命令提示窗口输入 set oracle_sid=数据库名称(实例),回车.例如数据库名 ...
- Linux创建修改删除用户和组
Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(16)-类库架构扩展以及DLL文件生成修改和用户的简单添加 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) ...
随机推荐
- Java文件与io——打印流和对象流
打印流的主要功能是用于输出,在整个IO包中打印流分为两种类型: 字节打印流:PrintStream 字符打印流:PrintWriter 打印流可以很方便的进行输出 public class Print ...
- 系统整理 精讲 swift 泛型
泛型是一种非常领会的语法,让我很是膜拜! 真是让人又爱又恨,学不懂的时候很抓狂 允许程序在函数,枚举,结构体,类中定义类型形参(类型可以动态改变) 每次使用可以传入不同类型的形参! Array< ...
- Java集合框架—List
Collection |--List:元素是有序的,元素可以重复.因为该集合体系有索引. |--ArrayList:底层的数据结构使用的是数组结构.特点:查询速度很快.但是增删稍慢.线程不同步. |- ...
- 构建第一个Spring Boot2.0应用之集成mybatis(六)
一.环境: IDE:IntelliJ IDEA 2017.1.1 JDK:1.8.0_161 Maven:3.3.9 springboot:2.0.2.RELEASE 二.步骤 方式一:利用配置文件配 ...
- zabbix文档3.4-7配置
zabbix文档3.4-7配置 1 主机和主机组 典型的Zabbix主机是您希望监视的设备(服务器,工作站,交换机等). 创建主机是Zabbix中首个监控任务之一.例如,如果要监视服务器"x ...
- 谈谈bootstrap在实践中的应用
bootstrap官网是http://www.bootcss.com/ bootstrap的CDN的网址是http://www.bootcdn.cn/ 在平时写的时候尽量用CDN,这样对于网站的运行效 ...
- Codeforces 802I Fake News (hard)
Codeforces 802I 题意:统计所有不同子串出现次数的平方的和. 想法:建一个SAM,$Ans=\sum (step[i]-step[fa[i]])*right[i]^2$ #include ...
- JS每点击一次添加多少条数据
很久不写文档,平时只写日记,所以对这个有点生疏,如果写的不好别介意. 今天闲的蛋疼,于是要写写白天的东西,并且以后也会一直更新(一直写)下去. 时间太仓促了,这几个月,今天算最晚的一次凌晨1点,吃不消 ...
- OpenGL glReadPixels 转成 CImage
本来是一件很简单的事情,就是将View上使用OpenGL画出来的数据生成图片让其实现打印的功能,我们知道MFC提供打印的接口是不支持OpenGL的(至少我不清楚),必须将它转成GDI再画在Print的 ...
- Unity结合Flask实现排行榜功能
业余做的小游戏,排行榜本来是用PlayerPrefs存储在本地,现在想将数据放在服务器上.因为功能很简单,就选择了小巧玲珑的Flask来实现. 闲话少叙.首先考虑URL的设计.排行榜无非是一堆分数sc ...