【Ecshop】修改处理用户购物车的行为

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修改函数

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登录后加上

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();

测试看看。

时间: 2024-10-12 19:30:54

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

ecshop网店前对ecshop修改的讲究

如何开ecshop网店,这个问题非常重要,用ecshop开网店的朋友都应该注意,一个站的运营,在运营前的二次开发当然重要.也格外重要,但是每个 人都应该清楚,ecshop只适合做中小型网店,也就是说.你用ecshop的用户,基本定位在中小心企业.有人反驳我,那zoshow呢.我不想讨论哪个, 你只能当他是一个特例. 既然你准备开网店,那么你对的产品应该是非常熟悉,非常熟悉.你对产品熟悉,你就对你这个产品的交易流程应该熟悉,你这个商品,最该如何去 展示,如何去购 买,说个很简单的道理.你卖虚拟商品

oracle如何修改单个用户密码永不过期

Oracle的密码过期规则是用Profile来管理的,系统默认只有一个Profile(DEFAULT),该profile的密码过期规则为180天:而所有的用户都使用该DEFAULT的profile,所以如果修改DEFAULT的过期规则会影响所有的用户.如果你想修改某个用户的密码让其永不过期,则需要新建一个profile,修改该profile的过期规则为无限期,这样该用户的过期规则会改变,并且不会影响到其他用户. 首先查看用户的proifle是哪个,一般是default: sql>SELECT u

RHEL7修改root用户密码

linux中忘记管理员密码是很麻烦的事情,RHEL5和RHEL6中修改root用户密码我们都已经很熟悉了,下面说一下RHEL7中修改root密码; 重新启动RHEL7,到启动菜单按e键: 找到linux16开始的行,按end键把光标移动到该行的末尾 在该行的末尾添加rd.break,然后按ctrl+x组合键启动系统: 进入命令提示符后连续输入命令,如图: 关闭selinux,修改/etc/selinux/config配置文件,把SELINUX=enforcing修改为SELINUX=disabl

用sql语句来修改sa用户的登陆密码

用sql语句来修改sa用户的登陆密码. 步骤一: 打开sql server manager studio,用Windows验证登陆,新建查询,执行以下语句: 步骤二: 1)打开对象资源管理器视图,在数据库链接上右键->属性. 2)在打开的窗口点击安全性,将sql server和windows身份验证模式勾上. 3)展开安全性菜单,将登陆名下的sa属性-状态-登陆-启用 alter login sa with password=’你的新密码’ 3然后把mssql server服务重启一下,很重要!

在虚拟机下安装ubuntu 10.04 64bit,并修改root用户密码

实验的环境: 笔记本是:HP 虚拟机:VMware  9 准备安装的操作系统: ubuntu 10.04  64bit 实验步骤: 一:让自己的hp支持虚拟化技术(由于ubuntu 10.04  64bit需要CPU支持虚拟化技术,所以要通过bios来更改电脑的默认设置) 启动时根据提示按 Esc 键 按 F10 键以配置 BIOS 使用箭头键滚动到"System Configuration" 选择"Virtualization Technology",然后按 En

ubuntu14.04修改root用户密码,安装搜狗输入法

修改root用户的密码 -------------------------华丽的分割线--------------------------------- ubuntu14.04安装搜狗输入法 1.卸载sudo apt-get purge fcitx* 2.sudo apt-get install fcitx sudo apt-get install fcitx-pinyin 3.下载http://pinyin.sogou.com/linux/?r=pinyin   sogoupinyin_2.1

Linux创建修改删除用户和组

Linux 创建修改删除用户和组 介绍 在日常的维护过程中创建用户操作用的相对会多一些,但是在这个过程中涉及到的知识点就不单单就是useradd了,接下来就来详细了解账号管理的相关信息. 用户信息 先从用户信息开始分析,可以通过查询/etc/password文件,每一行代表一个用户信息 root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin m

通过WMI接口,修改VisualSVN用户密码

VisualSVN 控制台通过 WMI 接口实现各功能,如果需要修改用户密码,就可以利用这个接口来实现,以下是示例脚本(在本机运行): var strComputer="."; var objWMIService = GetObject("winmgmts:\\\\" + strComputer + "\\root\\VisualSVN"); var colItems = objWMIService.ExecQuery("SELECT

liunx下修改ftp用户对网站的目录使用权限

照做 http://lnmp.org/faq/ftpserver.html 分配了一个myftp用户,可以下载.却不能上传. 进入网站目录, ll 查看权限, chmod -R 777 Apps,即给Apps目录777的权限 如果没写-R,就会外面看,是有权限,里面的目录仍然没有权限,仍不能上传. 扩展学习: linux 修改目录文件权限,目录文件所属用户,用户组 http://hepanxi.blog.163.com/blog/static/8886313620122753511634/ 1: