【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");
    }
View Code

 

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(); // 重新計算購物車中的商品價格
View Code

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

 

 

測試看看。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM