【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实现权限管系列 (开篇) ...
随机推荐
- 转 安装EBS前期检查工具 - RDA - Health Check / Validation Engine Guide
http://blog.itpub.net/35489/viewspace-1295028/ 参考文档 RDA - Health Check / Validation Engine Gu ...
- 017 Letter Combinations of a Phone Number 电话号码的字母组合
给定一个数字字符串,返回数字所有可能表示的字母组合. 输入:数字字符串 "23"输出:["ad", "ae", "af" ...
- Android中常用的几种加密
1.数字摘要 是指通过算法将长数据变为短数据,通常用来标识数据的唯一性,是否被修改,常用的加密算法有md5和sha1两种,如Android的App签名也是用的这两种算法. md5具有不可逆性,也可用来 ...
- UnityError 动画系统中anystate跳转重复播放当前动画解决方案
- JVM基础知识1--JAVA内存区域与内存溢出异常
1,运行时数据区域 根据JAVA虚拟机规范的规定:JAVA虚拟机所管理的内存将会包括以下几个运行时数据区域 程序计数器(Program Counter Register)是一块较小的内存空间,它的作用 ...
- 学习笔记:MDN的服务器端网站编程
互联网是如何工作的 互联网(Internet)和网络(web) 互联网是基础设施,网络是建立在这种基础设施之上的服务. 网页,网站,网络服务器和搜索引擎的区别是什么? 网页(webpage) 一份能够 ...
- Visual Studio Code的快捷键和相关技巧
编辑相关的键盘快捷键: Shift + Alt + F = 格式化代码(似乎不好用) Ctrl + Shift + Enter = 在上一行新建空行并转到上一行 Ctrl + K,Ctrl + C = ...
- Yii2.0 高级版安装 windows
最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...
- 【Shell脚本学习23】Shell函数参数
在Shell中,调用函数时可以向其传递参数.在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数... 带参数的函数示例: #!/bin/bash funWit ...
- cmd中不能输入中文
在命令行窗口下不能输入中文,只能输入英文,这是因为cmd.exe窗口启动时并没有启动conime.exe进程.事实上,这个进程容易被后门病毒利用,因此网上很多人都把它当成病毒看待,一些网上下载的系统就 ...