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"按钮结束(在结账之后再使用该函数的时候,我们希望用户不能修改订单)。

该函数中没有特别复杂的逻辑,但是它完成了许多操作,因此,仔细阅读它,会觉得它非常有用。