新版购物车类,加入查找功能以及完善错误处理功能

类别:编程语言 点击:0 评论:0 推荐:

<?php
//购物车类
//支持自定义列名及列数
// 作者:天地小子 [email protected]
//Create Time: 2004-10
//转载或修改请保留原版权,谢谢
//Last Modify Time : 2005-1-12 加入查找功能和出错处理
/*--------------------------使用手册----------------------------
本购物车支持自定义物品属性(即列)和设置 标识关键字、金额关键字、数量关键字,依此自动计算金额
及金额小计。功能:增加商品、修改商品数量、修改商品单价、商品加1、商品减1、删除商品、商品查找
本类中关于商品加1、减1、删除时没有做商品是否存在的判断,因为出错也不会影响购物车的使用,如果
你需要的话可能加入判断语句。
1.类的初始化
$thiscart=new twt_Cart;
//设置购物车商品属性或者说设置自定义列,列名将作为读取商品信息时的数组下标
//这里以 ID 品名,数量,金额为例
$spfield=array("id","name","num","gold");
$thiscart->setfield($spfield);
//设置购物车关键字,用于自动金额计算,及查找商品初始化
//本例设置为: 关键字 id 数量列: num 金额列: gold
$thiscart->setkey("id","num","gold");
//-----------------类方法
//增加商品 本例为增加 2个单价为1.5元的苹果  如果购物车内已经有ID为1的商品则作数量增加处理
$sp=array(1,"苹果",2,1.5);
$thiscart->addone($sp);
//删除一件商品 本例为删除购物车中序号为 2 的商品 序号从0开始,为类cart属性的第一个下标,以下皆同
$thiscart->delone(2);
//某商品加1 本例为商品序号为 2 的商品数量加1
$thiscart->add1(2);
//某商品减1 商品数量低于2件则不作减操作并返回警告信息 本例为商品序号为 2 的商品数量减1
$thiscart->del1(2);
//修改某件商品数量 本例为将商品序号为2的商品数量改为5
$thiscart->modifyone(2,5);
//修改某件商品单价 本例为将商品序号为2的商品单价改为 12.5 元
$thiscart->modifyprice(2,12.5);
//商品查找,例1 是单关键字查找,例2 是以多关键字查找,查找结果将返回为下标起始值为0,值为商品
//在购物车内的序号 的数组,未查找到符合条件的将返回空数组。
例1:
$sel=$thiscart->find("苹果","name");
$sel=$thiscart->find(2);//本句是查找关键字值为2的商品 省略第二个参数将自动匹配 setkey方法所设置的关键列
例2:
$scontent=array("苹果",12.5);
$skey=array("name","gold");
$sel=$thiscart->find($scontent,$skey);//本例将查找名称为苹果,价格为12.5的产品序号
//清空购物车
$thiscart->clear();
//重置错误信息
$thiscart->clearerr();
//----------------------类属性
//商品种数
$thiscart->sp_count;
//商品总金额
$thiscart->sp_sumgold;
//商品属性数组(自定义列名,设计时用)
$thiscart->fields;
//商品属性个数(自定义列数,设计时用)
$thiscart->f_num;
//判断重复关键字(自定义,设计时用)
$thiscart->f_key;
//金额关键字(列名,设计时用)
$thiscart->f_goldkey;
//数量关键字(列名,设计时用)
$thiscart->f_numkey;
//错误信息
$thiscart->errmessage;//中果招行退回值 为 FALSE,则此属性中存储出错情况信息
//商品信息数组 此属性为二维数组,第一维为商品序号,第二维为自定义列名
$thiscart->cart[$xh][$fieldname];
//如 获得序号为2的商品的品名则:
$spname=$thiscart->cart[2]["name"];
-----------------------------------------------------------------*/

class twt_Cart
{
  //类属性*************************************************************
  var $sp_count;//商品类数
  var $sp_sumgold;//商品总金额
  var $fields;//自定义列
  var $f_num;//自定义列数
  var $f_key;//作为判断商品是否重复的关键字
  var $f_goldkey;//商品金额字段名 用于商品统计信息计算时用
  var $f_numkey;//商品数量字段名 用于商品统计信息计算时用
  var $errmessage;//出错信息

 
  var $cart;
 
   //构造函数
  function twt_Cart()
    {
 //从SESSION中读出一些必须参数
 //session_start();
 if (! session_is_registered("mycart")) session_register("mycart");
 $mycart=$_SESSION["mycart"];
 $this->sp_count=count($mycart);
 if (! session_is_registered("mc_fields")) session_register("mc_fields");
 $this->fields=$_SESSION["mc_fields"];
 $this->f_num=count($this->fields)-1;
 if (! session_is_registered("mc_key")) session_register("mc_key");
 $this->f_key=$_SESSION["mc_key"];
 if (! session_is_registered("mc_goldkey")) session_register("mc_goldkey");
 $this->f_goldkey=$_SESSION["mc_goldkey"];
 if (! session_is_registered("mc_numkey")) session_register("mc_numkey");
 $this->f_numkey=$_SESSION["mc_numkey"];
 $this->cart=$mycart;
 $this->errmessage="";
 $this->updatecart();
 }
 
 
//类方法***************************************************************
  //更新总金额
   function updatecart()
   {
     //session_start();
  if (! session_is_registered("mycart"))
    {$this->errmessage="SESSION初始化错误!";
    return false;}
  $mycart=$_SESSION["mycart"];
  $tmp=0;
  for ($i=0;$i<$this->sp_count;$i++)
    $tmp+=$mycart[$i][$this->f_goldkey]*$mycart[$i][$this->f_numkey];
  $this->sp_sumgold=$tmp;
   }
   //设置自定义字段及初始化类 参数为数组,下标以0开头
  function setfield($tfield)
    {
   if (is_array($tfield))
     {
  $this->fields=$tfield;
  //初始化一些值
  $this->f_num=count($tfield)-1;
  $this->f_key=$tfield[0];
  $this->f_goldkey=$tfield[0];
  $this->f_numkey=$tfield[0];
  //session_start();
  $_SESSION["mc_fields"]=$tfield;
  $_SESSION["mc_key"]=$tfield[0];
  $_SESSION["mc_goldkey"]=$tfield[0];
  $_SESSION["mc_numkey"]=$tfield[0];
  }
   else
     {$this->errmessage="参数传输错误,请传入从0开始下标的数组!";
  return false;}
 }//setfield end

  //设置关键字 (唯一关键字,如ID,数量列名称,金额列名称)
  function setkey($key,$numkey,$goldkey)
    {
   $this->f_key=$key;
   $this->f_goldkey=$goldkey;
   $this->f_numkey=$numkey;
   //session_start();
   $_SESSION["mc_key"]=$key;
   $_SESSION["mc_goldkey"]=$goldkey;
   $_SESSION["mc_numkey"]=$numkey;
 }
 
  //清除错误信息
  function clearerr()
    {
    $this->errmessage="";
 }
 
  //清除购物篮
  function clear()
    {
   $mycart=$_SESSION["mycart"];
   unset ($mycart);
   $_SESSION["mycart"]=$mycart;
   session_unregister("mycart");
   session_unregister("mc_fields");
   session_unregister("mc_key");
   session_unregister("mc_goldkey");
   session_unregister("mc_numkey");
   $this->cart=$mycart;
   $this->sp_count=0;
   $this->sp_sumgold=0;
 }
 
 //功能方法/////////////////////////////////////////////////////////
 /*查找某件商品,给出 查找内容或内容数组  查找字段名或字段名数组 返回商品序号数组 找不到返回FALSE
 黙认查找关键列  如果给的参数是数组,那么内容数组和字段名组必须对应,且数量相等
 */
 function find($sstr,$sfield="0")
   {
  //session_start();
  $skey=array();
  $sfstr=array();
  $mycart=$_SESSION["mycart"];
  //统一参数
  if (is_array($sstr))
    {
      if (! is_array($sfield))
     {
       $this->errmessage="参数类型不一致!";
    return false;
     }
   $skey=$sfield;
   $sfstr=$sstr;
    }
  else
    {
      if (is_array($sfield))
     {
       $this->errmessage="参数类型不一致!";
    return false;
     }
      if ($sfield=="0")
     $skey[0]=$this->f_key;
   else
     $skey[0]=$sfield;
   $sfstr[0]=$sstr;
    }
  $rtarray=array();
  //查找
  $cnt=0;
  for ($i=0;$i<$this->sp_count;$i++)
    {$tflag=true;
       //数组关键字及内容对应查找
    for ($j=0;$j<count($skey);$j++)
      if ($mycart[$i][$skey[$j]] != $sfstr[$j]) $tflag=false;
     
   if ($tflag)
       $rtarray[$cnt++]=$i;
    }
   return $rtarray;
   }
 //添加商品 数组参数,以自定义的字段名为下标
 function addone($splist)
   {
     if ((! is_array($splist)) || ((count($splist)-1) != $this->f_num))
    {$this->errmessage="参数传输错误,请传入以自定义字段名为下标且元数个数吻合的数组!";
    return false;}
  //session_start();
  $mycart=$_SESSION["mycart"];
  //判断商品是否已经存在,如果存在,则加上
  $tflag=true;
  for ($i=0;$i<$this->sp_count;$i++)
    { if ($mycart[$i][$this->f_key]==$splist[$this->f_key])
     { $tflag=false;
    //增加商品个数
    $mycart[$i][$this->f_numkey]+=$splist[$this->f_numkey];
    $i=$this->sp_count;
     }
    }
   //添加商品到列表中
   if ($tflag)
     { for ($i=0;$i<=$this->f_num;$i++)
                 $mycart[$this->sp_count][$this->fields[$i]]=$splist[$this->fields[$i]];
    $this->sp_count+=1;
     }
     $this->cart=$mycart;
     $_SESSION["mycart"]=$mycart;
      $this->updatecart();
   }//add end 
  
  
 //删除一个商品 参数为商品在购物车内的序号
 function delone($id)
   {    //session_start();
            $mycart = $_SESSION["mycart"] ;
   for ($i=$id;$i<$this->sp_count-1;$i++)
     { for ($j=0;$j<=$this->f_num;$j++)
         $mycart[$i][$this->fields[$j]]=$mycart[$i+1][$this->fields[$j]];
     }
            unset( $mycart[$this->sp_count-1] ) ;
   $this->sp_count-=1;
            $_SESSION["mycart"] = $mycart ;
   $this->cart=$mycart;
            $this->updatecart();
   }//del end
  
  //修改一件商品的数量  参数为 商品在购物车内的序号  需要改变的数量
  function modifyone($id,$num)
    {
          //session_start();
          $mycart = $_SESSION["mycart"] ;
    if (! empty($mycart[$id][$this->f_key]))
      { if ($num>0)
          { $mycart[$id][$this->f_numkey]=$num;
            $this->cart=$mycart;
            $_SESSION["mycart"]=$mycart;
            $this->updatecart();
        }
        else
       { $this->errmessage="商品数量小于或等于零!";
      return false;
       }
      }
    else
   {$this->errmessage="商品不存在!";
    return false;
   }
    }
 
  //修改一件商品的单价 参数介绍同修改商品数量
  function modifyprice($id,$num)
    {
          //session_start();
          $mycart = $_SESSION["mycart"] ;
    if (! empty($mycart[$id][$this->f_key]))
   { if ($num>0)
       { $mycart[$id][$this->f_goldkey]=$num;
      $this->cart=$mycart;
      $_SESSION["mycart"]=$mycart;
      $this->updatecart();
     }
     else
       {$this->errmessage="商品金额小于或等于零!";
     return false;
    }
      }
    else
   {$this->errmessage="商品不存在!";
    return false;
   }
    }//modifyprice end
   
   
   //某件商品加1 参数为商品在购物车内的序号
  function add1($id)
    {
          //session_start();
          $mycart = $_SESSION["mycart"] ;
    $mycart[$id][$this->f_numkey]+=1;
    $this->cart=$mycart;
    $_SESSION["mycart"]=$mycart;
    $this->updatecart();
    }
   
   
   //某件商品减1 参数为商品在购物车内的序号
  function del1($id)
    {
          //session_start();
          $mycart = $_SESSION["mycart"] ;
    if($mycart[$id][$this->f_numkey]>1)
      $mycart[$id][$this->f_numkey]-=1;
    else
      {$this->errmessage="购物车内此商品只有一件,不可减1!";
   return false;}
    $this->cart=$mycart;
    $_SESSION["mycart"]=$mycart;
    $this->updatecart();
    }
   
 
}//class end
?>

本文地址:http://com.8s8s.com/it/it23657.htm