主题:  购物车的问题

arnica

职务:普通成员
等级:1
金币:0.0
发贴:19
注册:2003/4/23 20:49:23
#12003/6/9 21:50:59
我在网上看见个购物车的例子,但是我不知道改怎么用,那位老大可以给讲一下吗

class cart {

var $sortCount; //商品种类数
var $totalCost; //商品总金额
/* 所有的商品,如:$myCart[5][$name]:商品编号为5的名称
* $myCart[5][$price]:商品编号为5的单价
*        $myCart[5][$count]:商品编号为5的数量
* $myCart[5][$cost]:商品编号为5的合计金额
*/
var $myCart ;
var $Id; //每类商品的ID(数组)
var $Name; //每类商品的名称(数组)
var $Price; //每类商品的价格(数组)
var $Count; //每类商品的件数(数组)
var $Cost; //每类商品的价值(数组)


//******构造函数
function cart(){
$this->sortCount = 0 ;
$this->totalCost = 0 ;
$this->myCart = array() ;
session_start(); //初始化一个session
if(session_is_registered("myCart")==false) session_register('myCart');
$this->update();
// $this->Calculate();

}

//********私有,根据session的值更新类中相应数据
function update(){
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
if(false==$myCart)
{
$this->sortCount = 0 ;
$this->totalCost = 0 ;
$this->myCart = array() ;
return false;
}
//得到商品的总数量
$this->sortCount=count($myCart);
if($this->sortCount>0)
{
//开始计算商品的金额
$totalCost = 0 ;
foreach($myCart as $key=>$val)
{
//先四舍五入
foreach($val as $proName=>$proVal)
{
if($proName !="name")
{
$val[$proName] = round(eregi_replace(",", "",$proVal),2) ;
$myCart[$key][$proName] = $val[$proName] ;
}
}

//计算每件商品的金额
$myCart[$key]["cost"] = round($val["count"]*$val["price"], 2) ;
//得到所有商品的金额
$totalCost += $myCart[$key]["cost"] ;
}
$this->totalCost = $totalCost ;
$this->myCart = $myCart ;
$_SESSION["myCart"] = $myCart ;

}

}

/**
* 格式化数字为货币数据
*
*
**/
function formatNum($data)
{
foreach($data as $key=>$val)
{
foreach($val as $sName=>$svalue)
{
if($sName !="name")
{
$data[$key][$sName] = number_format($svalue, 2) ;
}
}
}
return $data ;

}
//**************以下为接口函数

//*** 加一件商品
// 判断是否蓝中已有,如有,加count,否则加一个新商品
//首先都是改session的值,然后再调用update() and calculate()来更新成员变量
function addOne($id,$na,$pr)
{
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
//设置购物车中的数量
$myCart[$id]["name"] = $na ;
$myCart[$id]["price"] = $pr ;
++$myCart[$id]["count"] ;
$_SESSION["myCart"] = $myCart ;
//更新一下类的成员数据
$this->update();

}
/**
* 向购物车中添加一组商品,如果没有,进行添加,如果已经存在,则更新为data
* @param $data - 要添加的商品,格式为:
* $data[0][id], $data[0][name],
* $data[0][price],$data[0][count]
* @return boolean
*/
function addData($data)
{
if(count($data > 0))
{
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
foreach($data as $val)
{
extract($val) ;
//设置购物车中的数量
$myCart[$id]["name"] = $name ;
$myCart[$id]["price"] = $price ;
$myCart[$id]["count"] = $count ;
}
$_SESSION["myCart"] = $myCart ;
//更新一下类的成员数据
$this->update();
}
}
/*
* 更改一件商品的单价
*
*
*
**/
function updatePrice($id, $price)
{
if($price <=0) return false ;
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
if($myCart[$id]==true)
{
$myCart[$id]["price"]=$price;

$_SESSION["myCart"] = $myCart ;
$this->update();
}
}
//将一件商品的数量减1
function removeOne($id)
{
$count = $this->myCart[$id]["count"] ;
if($count>0)
{
$this->modifyCount($id, --$count) ;
}

}

//改变商品的个数,如果传入单价,则一起更改单价
function modifyCount($id, $ncount, $price=0)
{
if($ncount <= 0) return false ;
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
if($myCart[$id]==true)
{
$myCart[$id]["count"]=$ncount;
//如果有传入单价,则一起更改单价
if($price >0 ) $myCart[$id]["price"]=$price;

$_SESSION["myCart"] = $myCart ;
$this->update();
}

}

//清空一种商品
function emptyOne($i)
{
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;
unset($myCart[$i]) ;
if(count($myCart)==0)
{
$this->emptyAll() ;
}else{
$_SESSION["myCart"] = $myCart ;
$this->update();
}
}


/***************************
清空所有的商品

因为在win里PHP不支持session_destroy()函数,所以这个清空函数不完善,
只是把每种商品的个数置为0。
如果是在linux下,可以直接用session_destroy()来做。
*****************************/
function emptyAll()
{
session_start(); //初始化一个session
$myCart = $_SESSION["myCart"] ;

unset($myCart) ;
$_SESSION["myCart"] = $myCart ;
$this->update();

}

/**
* 返回所有购物车中的数据
*
**/
function getData()
{
if($this->sortCount > 0)
{
return $this->myCart ;
}else{
return array() ;
}
}
//取一件商品的信息,主要的工作函数
//返回一个关联数组,下标分别对应 id,name,price,count,cost
function getOne($i){
$data = $this->myCart[$i] ;
if(false==$data) return array() ;

$data["id"] = $i ;
return $data ;

}

//取总的商品种类数
function getSortCount(){
return $this->sortCount;
}

//取总的商品价值
function getTotalCost(){
return $this->totalCost;
}

//end class
}

?>

这是我当时写的一个列出所有购物车中的清单的程序,各位可自己根据需要改写一下
ob_start();
session_start() ;
/*
$s=array("id" => 6, "name" => "测试a", "price" => "6", "count" =>3);
$t=array("id" => 7, "name" => "测试b", "price" => "7", "count" =>15);
$u=array("id" => 8, "name" => "测试c", "price" => "8", "count" =>21);
$rst=array($s, $t, $u);

*/
require_once("HTML/IT.php");
$tpl = new HTML_Template_IT("./");
//读取模板文件
$tpl->setRoot("./");
$tpl->loadTemplatefile("listcart.html", true, true);
require_once "../classes/cart.php" ;
$cart = new cart ;
// $cart->addData($rst);
$i=count($_POST[lines]) ;
if($_POST["emptyAll"]==true)
{
//如果清空条件为真
$cart->emptyAll() ;
}else{
//如果用户提交更新
if( $i > 0)
{
//如果提交过来的数据大于一个商品
$addData = $_POST[lines] ;
foreach($addData as $key=>$val)
{
if($val["del"]==true)
{
$cart->emptyOne($key) ;
unset($addData[$key]) ;
}
}
$cart->addData($addData) ;
}
}
$dat = $cart->getData();
if(count($dat) > 0)
{
foreach($dat as $key=>$val)
{
$tpl->setCurrentBlock("lines") ;
// $tpl->setVariable($lan) ;
$tpl->setVariable("id", $key) ;
$tpl->setVariable("i" , $key) ;
$tpl->setVariable("totalCount" , $cart->getSortCount()) ;
$tpl->setVariable("totalMoney" , $cart->getTotalCost()) ;
$tpl->setVariable($val) ;
$tpl->parseCurrentBlock("lines") ;
}
}
//替换模板页面中的标记
$tpl->setCurrentBlock("page") ;
if($key==false)$key=0;
$tpl->setVariable("i" , $key) ;
$tpl->setVariable("mytitle", "我的购物篮") ;
// $tpl->setVariable($language->getLanUrl()) ;
$tpl->parseCurrentBlock("page") ;

//显示页面
$tpl->show();

ob_end_flush();
?>



arnica

职务:普通成员
等级:1
金币:0.0
发贴:19
注册:2003/4/23 20:49:23
#22003/6/9 21:56:09
我想作个商品的页,里面有几样商品,页上还可以显示当前购物车的
状态(购物车内有几样东西),用户点击购物车,可以显示购物车的
具体内容,那位可以讲一下具体怎么实现



5D荣誉斑竹

职务:普通成员
等级:2
金币:1.0
发贴:400
注册:2001/5/27 23:27:59
#32003/6/11 22:19:00
其实购物车听起来好象很复杂,其实和最简单的新闻系统几乎没区别。无非就是给每一个购物车记录分配一个单独的ID。



arnica

职务:普通成员
等级:1
金币:0.0
发贴:19
注册:2003/4/23 20:49:23
#42003/6/12 8:33:55
版主能讲具体点吗,我如果几个商品,
ID Name Price
1 Mouse 25.00 add
2 Key 100.00 add
3 Car 5000.00 add
4 Game 25.00 add
怎么改add前面的代码,让顾客点击add后,就把商品加入购物车



5D荣誉斑竹

职务:普通成员
等级:2
金币:1.0
发贴:400
注册:2001/5/27 23:27:59
#52003/6/13 23:29:19
这个不太好说,建议多找些购物车的例子,对比着多看看就明白了。
而且你贴的这个类很复杂,先从简单的开始研究巴。
不过我倒是可以给你一个数据表,很早以前我做的,你看看或许能明白。

CREATE TABLE cart (
cart_id BIGINT(7) DEFAULT '0' NOT NULL AUTO_INCREMENT,
psessionid VARCHAR(32) NOT NULL,
product_id BIGINT(5) NOT NULL,
product_buynum INT(3) NOT NULL,
PRIMARY KEY(cart_id)
);



arnica

职务:普通成员
等级:1
金币:0.0
发贴:19
注册:2003/4/23 20:49:23
#62003/6/14 0:11:49
我在网上倒是找了很多购物车的例子,都只是写了购物车的类,而没有讲具体怎么用,而且我不想用数据库可以吗。斑竹看看下面的例子,是不是简单了一点。
--minibasket.inc--
if ($basket!=""){
    if (session_is_registered("ses_basket_items")){
        $basket_position_counter=0;
        $double=0;
        if ($ses_basket_items>0){
         foreach ($ses_basket_name as $basket_item){
         if ($basket_item==$basket){
         $double=1;
         $basket_position=$basket_position_counter;
         }
         $basket_position_counter++;
         }
        }
        if ($double==1){
         $oldamount=$ses_basket_amount[$basket_position];
         $ses_basket_amount[$basket_position]++;
         $amount=$ses_basket_amount[$basket_position];
         $oldprice=$ses_basket_price[$basket_position];
         $newprice=($oldprice/$oldamount)*$amount;
         $ses_basket_price[$basket_position]=$newprice;
        }else{
         $ses_basket_name[]=$basket;
         $ses_basket_amount[]=1;
         $ses_basket_price[]=$price;
         $ses_basket_id[]=$id;
         $ses_basket_items++;
        }
    }else{
        $ses_basket_items=1;
        $ses_basket_name[0]=$basket;
        $ses_basket_amount[0]=1;
        $ses_basket_price[0]=$price;
        $ses_basket_id[0]=$id;
        session_register("ses_basket_items");
        session_register("ses_basket_name");
        session_register("ses_basket_amount");
        session_register("ses_basket_price");
        session_register("ses_basket_id");
    }
}

if ($ses_basket_items>0){
for ($basket_counter=0;$basket_counter<$ses_basket_items;$basket_counter++){
$price=sprintf("%01.2f",$ses_basket_price[$basket_counter]);
$amount=$ses_basket_amount[$basket_counter];
$name=$ses_basket_name[$basket_counter];
echo "$amount $name $price";
echo "
\n";
}
} else {
    $ses_basket_items=0;
    unset($ses_basket_name);
    unset($ses_basket_amount);
    unset($ses_basket_price);
    unset($ses_basket_id);
}

?>

basket.php

include ("minibasket.inc");
?>

ID Name Price
1 Mouse 25.00 add
2 Key 100.00 add
3 Car 5000.00 add
4 Game 25.00 add


我运行basket.php,点击add,就回在页面的顶部显示我点击的商品,但是每次都是显示一样商品,怎么才能显示当前购物篮所有的商品



5D荣誉斑竹

职务:普通成员
等级:2
金币:1.0
发贴:400
注册:2001/5/27 23:27:59
#72003/6/15 22:21:33
建议用数据库,安全可靠,用起来也简单。



arnica

职务:普通成员
等级:1
金币:0.0
发贴:19
注册:2003/4/23 20:49:23
#82003/6/15 22:27:19
我是帮别人写作业,要求不用数据库