24.11 收银台模块设计
视频讲解:光盘TMlx24收银台模块设计.exe
24.11.1 收银台模块概述
当用户停止浏览商品准备结账时,可以通过单击购物车页面中的“去收银台”按钮来实现,该按钮将触发onclick事件调用formset()函数来显示订单,当用户提交订单后,系统将订单保存到数据表tb_form中,同时清空购物车,并显示订单信息提醒用户记录订单号。当货款发出后,还可以对订单进行查询。收银台页面的运行结果如图24.24所示。
图24.24 收银台页面运行结果
本节所涉及的页面有显示订单(formset()函数)、填写订单(settle.php、settle.html)、处理订单(settle_chk.php)、反馈订单(forminfo.php、forminfo.html)和查询订单5部分。首先来介绍formset()函数。
24.11.2 收银台模块技术分析
在收银台模块中,通过PDO中的方法完成订单信息的添加和数据的更新操作。同样调用数据库管理类AdminDB中的ExecSQL方法,完成数据的添加操作。
24.11.3 显示订单
订单信息提交页面的输出由formset()函数决定,它将商品信息整理,通过open方法打开settle.php页来显示订单,并将整理后的商品信息传递到settle.php文件中。formset()函数的代码如下:
【例24.39】代码位置:光盘TMsl24 jsshopcar.js
function formset(form){ var uid = form.uid.value; var n_pre='cnum'; //数量 var lang = form.chk.length; if(lang == undefined){ var fst=form.chk.value; //商品id var snd=form.cnum0.value; //购买数量 }else{ var fst= new Array(); var snd = new Array(); for(var i = 0; i < lang; i++){ var nm = n_pre+i.toString(); var stmp = document.getElementById(nm).value; if(stmp ==''||isNaN(stmp)){ alert(’不允许为空、必须为数字’); document.getElementById(nm).select(); return false; } snd[i] = stmp; var ftmp = form.chk[i].value; fst[i] = ftmp; } } open('settle.php? uid='+uid+'&fst='+fst+'&snd='+snd, '_blank', 'width=500 height=450', false); }
说明
因为open方法使用了_blank参数来打开一个新的页面,session值传不过去,所以这里使用隐藏域来传递用户名称。
24.11.4 填写订单
settle.php直接将接收的值传给settle.tpl模板,并载入settle.tpl模板。settle.php页面代码如下:
【例24.40】代码位置:光盘TMsl24settle.php
<?php session_start(); header("Content-type: text/html; charset=UTF-8"); //设置文件编码格式 require("system/system.inc.php"); //包含配置文件 $fst = $_GET['fst']; $snd = $_GET['snd']; $uid = $_GET['uid']; $smarty->assign('title', ’收银台’); $smarty->assign('fst', $fst); $smarty->assign('snd', $snd); $smarty->assign('uid', $uid); $smarty->display('settle.tpl'); ?>
settle.tpl模板显示一个表单,这个表单的内容需要用户来填写,包括收货人、联系电话等信息。而从PHP页传过来的几个变量则被保存到隐藏域以传递到处理页,在表单中将数据提交到settle_chk.php处理页。
24.11.5 处理订单
处理页settle_chk.php获取表单中提交的数据,根据用户提交的商品信息,重新查找数据表tb_commo,并从数据表中提取商品信息,保存到数组中,然后处理页将数组作为一条记录添加到表tb_form内。
数据添加成功的同时,处理页会根据uid找到该用户,将shopping字段清空,最后调用forminfo.php页来显示新添加的订单信息。settle_chk.php页的代码如下:
【例24.41】代码位置:光盘TMsl24 settle_chk.php
<?php header("Content-type: text/html; charset=UTF-8"); //设置文件编码格式 require("system/system.inc.php"); //包含配置文件 $sql="insert into tb_form(formid, commo_id, commo_name, commo_num, agoprice, fold, total, vendee, taker, address, tel, code, pay_method, del_method, formtime, state)values ("; $formid=time(); $tmpid = explode(', ', $_POST['fst']); $tmpnm = explode(', ', $_POST['snd']); $number = count($tmpid); $tmpna = array(); $tmpvp = array(); $tmpfd = array(); $tmptt = 0; if($number >1){ for($i = 0; $i < $number; $i++){ $tmpsql = "select name, v_price, fold from tb_commo where id = '".$tmpid[$i]."'"; $tmprst = $admindb->ExecSQL($tmpsql, $conn); $tmpna[$i] = $tmprst[0]['name']; $tmpvp[$i] = $tmprst[0]['v_price']; $tmpfd[$i] = $tmprst[0]['fold']; $tmptt += $tmprst[0]['v_price'] * $tmpnm[$i]; @$tmpsell = $tmprst[0]['sell'] + 1; $addsql = "update tb_commo set sell = '".$tmpsell."' where id = '".$tmpid[$i]."'"; $addrst = $admindb->ExecSQL($addsql, $conn); } $sql.="'".$formid."', '".$_POST['fst']."', '".implode(', ', $tmpna)."', '".$_POST['snd']."', '".implode(', ', $tmpvp)."', '".im plode(', ', $tmpfd)."', '".$tmptt."', '".$_POST['uid']."'"; }else if($number == 1){ $tmpsql = "select name, v_price, fold from tb_commo where id = '".$tmpid[0]."'"; $tmprst = $admindb->ExecSQL($tmpsql, $conn); $tmptt= $tmprst[0]['v_price'] * $tmpnm[0]; @$tmpsell = $tmprst[0]['sell'] + 1; $addsql = "update tb_commo set sell = '".$tmpsell."' where id = '".$tmpid[0]."'"; $addrst = $admindb->ExecSQL($addsql, $conn); $sql.="'".$formid."', '".$_POST['fst']."', '".$tmprst[0]['name']."', '".$_POST['snd']."', '".$tmprst[0]['v_price']."', '".$t mprst[0]['fold']."', '".$tmptt."', '".$_POST['uid']."'"; }else{ echo 'error'; exit(); } $sql.=", '".$_POST['taker']."', '".$_POST['address']."', '".$_POST['tel']."', '".$_POST['code']."', '".$_POST['pay']."', '".$ _POST['del']."', '".date("Y-m-d H:i:s")."',0)"; $InsertSQL = $admindb->ExecSQL($sql, $conn); if(false == $InsertSQL){ echo "<script>alert(’购买失败’); history.back; </script>"; }else{ $updsql = "update tb_user set consume='".$tmptt."', shopping='' where name = '".$_POST['uid']."'"; $updrst = $admindb->ExecSQL($updsql, $conn); echo "<script>top.opener.location.reload(); </script>"; echo "<script>open('forminfo.php? fid=$formid', '_blank', 'width=750 height=650', false); window.close(); </script>"; } ?>
由于篇幅所限,有关反馈订单和查询订单的内容这里不再讲解,请读者参考本书光盘中的源代码。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。