28.5.2 浏览购物车
不论我们从哪个页面进入,都需要显示购物车的内容。在这个最基本的例子中,当用户点击"View Cart"按钮后,系统将只执行如下所示的代码:
if(($_SESSION['cart'])&&(array_count_values($_SESSION['cart']))){
display_cart($_SESSION['cart']);
}else{
echo"<p>There are no items in your cart</p><hr/>";
}
可以从这段代码看出,如果购物车里有一些物品,我们就调用display_cart()函数。如果购物车是空的,会给用户发送一条消息,告诉他们购物车为空。
display_cart()函数只以可读的HTML格式打印出购物车的内容,这点可从图28-6和图28-7看出。尽管函数的代码可以在output_fns.php中找到,但我们还是给出了output_fns.php的源代码,如程序清单28-10所示。尽管该函数只是一个显示函数,但是它比较复杂,因此在这里我们讨论一下。
程序清单28-10 output_fns.php文件中的display_cart()函数——该函数将格式化并打印购物车的内容
function display_cart($cart,$change=true,$images=1){
//display items in shopping cart
//optionally allow changes(true or false)
//optionally include images(1-yes,0-no)
echo"<table border=\"0\"width=\"100%\"cellspacing=\"0\">
<form action=\"show_cart.php\"method=\"post\">
<tr><th colspan=\"".(1+$images)."\"bgcolor=\"#cccccc\">Item</th>
<th bgcolor=\"#cccccc\">Price</th>
<th bgcolor=\"#cccccc\">Quantity</th>
<th bgcolor=\"#cccccc\">Total</th>
</tr>";
//display each item as a table row
foreach($cart as$isbn=>$qty){
$book=get_book_details($isbn);
echo"<tr>";
if($images==true){
echo"<td align=\"left\">";
if(file_exists("images/".$isbn.".jpg")){
$size=GetImageSize("images/".$isbn.".jpg");
if(($size[0]>0)&&($size[1]>0)){
echo"<img src=\"images/".$isbn.".jpg\"
style=\"border:1px solid black\"
width=\"".($size[0]/3)."\"
height=\"".($size[1]/3)."\"/>";
}
}else{
echo" ";
}
echo"</td>";
}
echo"<td align=\"left\">
<a href=\"show_book.php?isbn=".$isbn."\">".$book['title']."</a>
by".$book['author']."</td>
<td align=\"center\">\$".number_format($book['price'],2)."</td>
<td align=\"center\">";
//if we allow changes,quantities are in text boxes
if($change==true){
echo"<input type=\"text\"name=\"".$isbn."\"value=\"".$qty."\"
size=\"3\">";
}else{
echo$qty;
}
echo"</td>
<td align=\"center\">\$".number_format($book['price']*$qty,2)."</td>
</tr>\n";
}
//display total row
echo"<tr>
<th colspan=\"".(2+$images)."\"bgcolor=\"#cccccc\"> </td>
<th align=\"center\"bgcolor=\"#cccccc\">".$_SESSION['items']."</th>
<th align=\"center\"bgcolor=\"#cccccc\">
\$".number_format($_SESSION['total_price'],2)."
</th>
</tr>";
//display save change button
if($change==true){
echo"<tr>
<td colspan=\"".(2+$images)."\"> </td>
<td align=\"center\">
<input type=\"hidden\"name=\"save\"value=\"true\"/>
<input type=\"image\"src=\"images/save-changes.gif\"
border=\"0\"alt=\"Save Changes\"/>
</td>
<td> </td>
</tr>";
}
echo"</form></table>";
}
该函数的基本流程如下所示:
1.对购物车中所有物品执行循环,将每个物品的ISBN传递给get_book_details()函数,这样,可以总结每本书的详细信息。
2.如果有图片存在,可以为每本书提供一个图片。我们使用HTML图像的高度标记和宽度标记将图片改得小了一点。这意味着这些图片可能有一些扭曲,但是因为它们很小,扭曲一点不会有太大问题。(如果看起来还是不舒服,可以使用第22章“创建图像”中介绍的gd库来修改它的大小,或者手动为每个产品生成一个不同大小的图片。)
3.让每个购物车包含一个指向适当图书的链接,也就是以ISBN作为show_book.php的参数显示图书。
4.如果以change作参数调用函数,而且该change设置为true(或不设置——其默认值是true),则看到的是以表单形式显示的购物车中所有物品的数量,点击"Save Changes"按钮结束(在结账之后再使用该函数的时候,我们希望用户不能修改订单)。
该函数中没有特别复杂的逻辑,但是它完成了许多操作,因此,仔细阅读它,会觉得它非常有用。