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添加。

 /**
* 选择购物车商品的获取条件
* 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】修改处理用户购物车的行为的更多相关文章

  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. Gym 100971D Laying Cables 二分 || 单调栈

    要求找出每个a[i],找到离他最近而且权值比它大的点,若距离相同,输出权利最大的那个 我的做法有点复杂,时间也要500+ms,因为只要时间花在了map上. 具体思路是模拟一颗树的建立过程,对于权值最大 ...

  2. Microsoft JET Database Engine (0x80004005)未指定的错误解决

    Microsoft JET Database Engine (0x80004005)未指定的错误,这个错误只有在使用Access数据库时才能出现 出现以上问题,可以使用以下步骤进行解决问题: 1.系统 ...

  3. c++概念字符串操作 (转)

    本文转自:http://www.jb51.net/article/37410.htm 一.char_traits 字符特征类 1)意义:包装特定串元素的通用行为界面,以便容器实现时依据特征信息而执行特 ...

  4. JQury各种ajax函数

    $.get(url,[data],[callback],[type]) 说明:以get方式发送请求,url为请求地址,data为请求数据的列表,callback为请求成功后的回调函数,该函数接受两个参 ...

  5. 《C#高效编程》读书笔记06-理解几个等同性判断之间的关系

    当创建自定义类型时(无论是class还是struct),应为类型定义"等同性"的含义.C#提供了4种不同的函数来判断两个对象是否"相等": public sta ...

  6. Java 编码规范有感

    应小组要求,开发测试都需要考阿里编码规范,因此,相当于是突击了一下关于编码规范方面的知识,目前做的项目后期需要进行项目迁移,数据迁移,功能迁移... 各种迁移... 阿里巴巴编码规范(Java)考试地 ...

  7. Linux下安装JDK及相关配置

    1.官网下载JDK:选择Linux压缩包进行下载 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...

  8. struts2的执行流程

    在浏览器端输入相应的访问地址>>>>把请求发送给tomact>>>>tomact判断应该交给那个webApplication>>>&g ...

  9. enable orgmode latex preview to support retina on mac

    Table of Contents 1. enable orgmode latex preview to support retina on mac 1.1. get the proper versi ...

  10. html常用的小技能

    在html中有很多常用小技能,记下来,下次直接看自己的,就不用四处找啦! 1.<li>标签去掉点号:list-style-type:none; 去掉前: 去掉后: 2.<li> ...