ECSHOP - 二次開發指南---購物車篇

huidaoli發表於2013-07-22

第一個問題 儲存使用者購物車資料ECSHOP的購物車資料,是以Session 方式儲存在資料庫裡,並在Session結束後 ,Distroy 掉,解決方法是:

1.購物車內容讀取方式. 更改登陸後購物車獲取條件 "Session 單獨方式"為 Session +使用者名稱 ,該修改位於Lib_order 下 function get_cart_goods();

2. 購物車內容記錄方式,未登陸方式依然是Session , 使用者登陸後,自動UPdate Cart 一次,將同一UserID下購物車內資料不是當前Session的Update到當前Session , 並將當前Session 下UserID為0的部分(未登陸情況下,Userid是0),UpdateID到當前UserID ,該修改位於 Flow.php 下面function flow_update_cart($arr) 

3.更改退出時,自動Clear Cart的部分,將Distroy 當前Session 的內容,更改為Distroy 當前Session 下 User ID為0的部分。 該修改位於:Includes/cls_session.php ,     function destroy_session() 部分說明:這種情況下就是遊客關閉瀏覽器後,購物車清空, 註冊使用者購物車永久儲存, 可能會對伺服器造成輕微壓力,主要取決於使用者的數量,如果數量較多資料伺服器壓力較大,可以通過程式,自動清理超過一定時間段未登陸的User Cart (或者是額外增加一個資料,來標示加入購物車的時間,根據此時間判斷是否自動清理).

 

1.購物車內容讀取方式. 

更改登陸後購物車獲取條件 "Session 單獨方式"為 Session +使用者名稱 ,該修改位於Lib_order 下 function get_cart_goods();具體更改程式碼部分:

function get_cart_goods(){

/* 初始化 */

$goods_list = array();

$total = array(

       'goods_price'   => 0, // 本店售價合計(有格式)

       'market_price' => 0, // 市場售價合計(有格式)

       'saving'    => 0, // 節省金額(有格式)

       'save_rate' => 0, // 節省百分比

       'goods_amount' => 0, // 本店售價合計(無格式));

/* 迴圈、統計 */

$uid=$_SESSION['user_id']; 

if($uid==0){

$sql = "SELECT *, IF(parent_id, parent_id, goods_id) AS pid " .

         " FROM " . $GLOBALS['ecs']->table

  ('cart') . " " ." WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'" .

         " ORDER BY pid, parent_id";}else{$sql = "SELECT *, IF(parent_id, parent_id, goods_id) AS pid " .

         " FROM " . $GLOBALS['ecs']->table('cart') . " " .

         " WHERE (user_id='".$uid."' OR session_id = '" . SESS_ID . "') AND rec_type = '" . CART_GENERAL_GOODS . "'" .         " ORDER BY pid, parent_id";}$res = $GLOBALS['db']->query($sql);

   ........後面不變

2. 購物車內容記錄方式,未登陸方式依然是Session , 使用者登陸後,自動UPdate Cart 一次,將同一UserID下購物車內資料不是當前Session的Update到當前Session , 並將當前Session 下UserID為0的部分(未登陸情況下,Userid是0),UpdateID到當前UserID ,該修改位於 Flow.php 

下面function flow_update_cart($arr)

    function flow_update_cart($arr)

{foreach ($arr AS $key => $val){

       $val = intval(make_semiangle($val));

       if ($val <= 0)

       {

         continue;

       }

       $sql = "SELECT `rec_id`, `goods_id`, `goods_attr_id`, `extension_code` FROM" .$GLOBALS['ecs']->table('cart').

            " WHERE rec_id='$key' AND (session_id='" . SESS_ID . "' OR user_id='".$_SESSION['user_id']."')";

       $goods = $GLOBALS['db']->getRow($sql);// 更新購物車Session & user id

       $sql ="UPDATE " .$GLOBALS['ecs']->table('cart')." SET session_id='" . SESS_ID . "',user_id='".$_SESSION['user_id']."' where rec_id='".$goods['rec_id']."'";

       $g = $GLOBALS['db']->query($sql);

       $sql = "SELECT g.goods_name, g.goods_number ".

            "FROM " .$GLOBALS['ecs']->table('goods'). " AS g, ".

                   $GLOBALS['ecs']->table('cart'). " AS c ".

            "WHERE g.goods_id = c.goods_id AND c.rec_id = '$key'";

...........................後面不變

在使用者登陸後,Flow.php開啟購物車地方,需要呼叫一次自動更新購物車,

/* 取得商品列表,計算合計 */

$cart_goods = get_cart_goods();

之後增加如下程式碼for(

$i=0; 

$i<count($cart_goods['goods_list']);

$i++){$a[$cart_goods['goods_list'][$i]['rec_id']]=$cart_goods['goods_list'][0]['goods_number'];}if(count($a)>0){flow_update_cart($a);}

第三項自己琢磨吧,懶得去翻那程式碼了,改掉SQL語句中session_id部分為user_id就行了這裡發帖真麻煩地說,兩套驗證...

相關文章