分享

用 PHP 创建 Amazon 店面,第 1 部分: 用 Amazon ECS 获得内容

 Ralf_Jones 2005-12-23

如何构建店面并显示商品

developerWorks



级别: 中级

Tyler Anderson , 自由撰稿人, Stexar 公司

2005 年 12 月 19 日

这是使用 PHP 和 Amazon 电子商务服务(ECS)建设 Amazon 店面的两部分教程的第一部分。建设的店面允许购物者查看列表中显示的商品,或者在商店中搜索特定商品。第 2 部分将介绍购物车、推荐服务以及建设专卖店。

开始之前

这个教程面向的是对于创建店面、自动连接 Amazon Web 服务并显示结果有兴趣的程序员。这个教程假设读者熟悉基本的 PHP 概念,包括 forwhile 循环,以及表单处理。如果对自己的 PHP 能力没把握,有许多优秀的教程可以帮助您达到要求(请参阅 参考资料)。

您应当熟悉 Amazon Web 服务,在 developerWorks 的 “Boost application development with Amazon Web Service” 系列文章中介绍了它(请参阅 参考资料)。

关于本系列

在这个两部分的系列中,我们要用 PHP 创建一个 Amazon 购物车。第 1 部分将讨论店面的架构,通过商品搜索请求与 Amazon Web 服务通信,显示选项并浏览商品分类。我们还将创建一个搜索框。

第 2 部分将讨论购物车的创建、添加商品和修改,这个购物车将使用叫作购物车请求的技术完全保存在 Amazon 的服务器上。我们将介绍构建藏品商店和向购物者提供浏览类似商品的能力。



回页首


关于本教程

我们将构建一个 Amazon 店面,包含分类链接和搜索框,允许购物者浏览商店中的商品目录。与多数 PHP 应用程序不同,这个程序不需要本地数据库,因为数据库保存在 Amazon 的服务器上。所以,这个教程严重地依赖简单对象访问协议(SOAP),这个 Web 服务协议用 XML 组织信息。Web 服务是应用程序(例如在这个教程中要构建的 PHP 应用程序)与中央服务器通信以获取信息的一种方式。

通过 Amazon 电子商务服务(ECS),可以从购物者选择的分类中获得和显示内容。当选中一个分类时,将创建参数,指明这个分类,收集相关信息,并启动 SOAP 客户。SOAP 客户会接受参数,形成 XML 文档,并把 XML 文档转交给 SOAP 服务器。Amazon 服务器访问自己的数据库,生成 XML 文档,里面包含的商品与参数匹配。最后,服务器把 XML 文档返回给 SOAP 客户,SOAP 客户再把文档解析成数据结构,从数据结构中可以提取出请求的数据。

 

获得内容

如何构建店面并显示商品

developerWorks
第 2 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


概述

Amazon ECS

Amazon 电子商务服务(ECS)允许任何人连接到它巨大的商品目录,在 Web 站点上显示商品,把购物者引导到 Amazon 进行销售,并得到销售的佣金。任何人都可以做这件事。需要做的只是遵守 Amazon 的应用程序编程接口(API)。就像 Amazon 说的“这就行了”。您的程序将成为一个Web 站点,在一个或多个分类中为 Amazon 的产品做广告、销售它的产品,得到每笔介绍成交的佣金。您不需要屯积商品或处理订单,唯一的责任就是维护好您的代码。

在这篇教程中,除了通过 PHP 使用 Amazon ECS,还将设计店面的架构,并向它添加功能,允许在分类中进行浏览和搜索特定商品。



回页首


与 Amazon ECS 通信

我们将使用 PHP 和 Web 服务,通过 SOAP 与 Amazon 通信。Web 服务(例如 Amazon ECS)允许程序员访问服务。在这个示例中,我们将连接到 Amazon ECS 去获取关于产品的信息。清单 1 显示了一条示例 SOAP 消息。


清单 1. 示例 SOAP 消息

					

<soap-env:Envelope
    xmlns:soap-env="http://schemas./soap/envelope/"
    xmlns:xsd="http://www./1999/XMLSchema">
  <soap-env:Header/>
  <soap-env:Body>
...
  </soap-env:Body>
</soap-env:Envelope>

SOAP 消息看起来就是这个样子。在 PHP 和 Web 服务 一节中,将学习如何使用 SOAP 消息制作到 SOAP 服务器的请求和接收来自 SOAP 服务器的请求。



回页首


店面

流行的店面拥有干净、简单的布局。在这份教程中,我们将设计一个基本的店面,在样式上比较朴素,这样就可以把精力集中在使店面运行的机械部分了。完成的产品将有一个容纳分类和搜索框的侧面板,在右侧的主内容区显示商品(请参阅图 1)。


图 1. 最后的应用程序
最后的应用程序


回页首


分类

多数在线商店只有一个或很少的分类。这份教程的店面将包含较少几个分类,但是在构建自己的店面时,可以喜欢多少分类就建立多少。分类被作为向 Amazon ECS 发送的 SOAP 请求中的信息,ECS 会返回与选中的分类匹配的商品。

可用的分类如图 2 所示。


图 2. 可用的分类
可用的分类

上面显示的分类是 SearchIndex 可能的值,我们将用它来搜索商品。



回页首


商品

默认情况下,Amazon 的分类包含充满商品的数百页。购物者需要缩小他们的搜索范围,以便找到他们想要的东西。我们将要设计的商品搜索功能会在分类内搜索商品,并把结果显示给购物者,显示的结果与 Amazon 上显示的商品类似。请参阅图 3 和图 4。


图 3. 最终应用程序在 Baby 分类中显示的商品
最终应用程序在 Baby 分类中显示的商品

图 4. Amazon 上在 Baby 分类中显示的商品
Amazon 上在 Baby 分类中显示的商品

请注意在图 4 中的前三项是相同的。不是所有商品都完全以同样顺序出现。但是,显示的商品是一样的。

获得内容

如何构建店面并显示商品

developerWorks
第 3 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


什么是 Amazon ECS?

Amazon 电子商务服务(ECS)允许得到 Amazon 信息的访问权,所有的信息与浏览 Amazon 时发现的信息一样。这一节将研究从 Amazon 检索信息的方法。

请求类型

搜索商品或其他内容有多种方法。在这里,我们只集中在 ItemSearch 上。第 2 部分还会使用 ItemSearch,以及 ItemLookupCartCreateCartAddCartModifyCartClearCartGet

下面是所有可能的请求的列表:

  • BrowseNodeLookup —— 返回 Amazon 特定产品区域的信息。
  • CartAdd —— 向购物车添加商品。
  • CartClear —— 删除购物车的所有内容。
  • CartCreate —— 创建时带有一件指定的商品,这个请求创建一辆新购物车。
  • CartGet —— 检索购物车的内容。
  • CartModify —— 用来修改购物车中商品的数量。把数量设为 0 会把商品从购物车删除。商品也可以移动到已经保存的购物车或者从中移出。
  • CustomerContentLookup —— 用来检索特定 Amazon 客户编写的可以公开得到的内容。
  • CustomerContentSearch —— 允许按照姓名或电子邮件地址搜索 Amazon 客户。
  • Help —— 用来检索关于使用 Amazon ECS 进行开发的信息。
  • ItemLookup —— 允许通过使用评论、相似性等信息检索最多 10 件产品。
  • ItemSearch —— 用来根据分类和关键字来搜索产品。
  • ListLookup —— 允许从特定列表检索所有商品。
  • ListSearch —— 允许搜索祝福列表、婴儿库或婚姻库。
  • SellerListingLookup —— 允许查询 Amazon Shops and Marketplace 的产品。
  • SellerListingSearch —— 允许搜索 Amazon Shops and Marketplace 的清单。
  • SellerLookup —— 允许检索关于特定销售人员的信息,包括客户反馈评级、位置等等。
  • SimilarityLookup —— 允许检索某个产品的类似商品。
  • TransactionLookup —— 允许检索 Amazon 客户所做交易状态的有限信息。


回页首


理解参数

每个请求都要求有合适的参数,好让 Amazon ECS 正确地处理请求。这个系列中使用的参数和它们的说明是:

  • Service —— 这个参数总是 AWSECommerceService
  • SubscriptionId —— 来自 Amazon 的开发人员令牌。
  • AssociateTag —— 来自 Amazon 的合伙人 ID。
  • Operation —— 要执行的操作或请求的类型。通常,只是把 Request 添加到每个请求类型。对于 ItemSearch 这个请求类型,操作将是 ItemSearchRequest。对于 ItemLookup,操作将是 ItemLookupRequest,如此类推。
  • ResponseGroup —— 这是个重要的参数,因为它告诉 Amazon 需要多少信息:从 Small(少量)、Medium(中量)和 Large(大量)到可用的 XML 元素的特定部分。

下面是一些可用的响应组:

  • Accessories —— 对于列表中有附件的产品,返回每件产品的附件商品列表。
  • Cart —— 返回购物车标识符,以及特定于每件产品的信息。
  • Images —— 返回某件产品拥有的全部图片的 URL。
  • Offers —— 返回列表中每件产品的供货信息。
  • Small —— 为列表中的每件商品提供“少量”信息。
  • Medium —— 为列表中的每件商品提供“中量”信息。
  • Large —— 为列表中的每件商品提供“大量”信息。


回页首


SOAP 与 REST

服务器为每个请求类型返回的数据都是相同的。但是,请求的设置和使用都有不同。REST 请求最简单,因为它们只是长长的 URL,URL 中包含每个商品的变量和它们的值 —— 非常像 PHP 中的 GET 请求。

另一方面,SOAP 请求更复杂,因此也就更强大。它们是通过 HTTP 传递给 SOAP 服务器的 XML 文档。SOAP 请求比 GET 请求更强大,因为它们能接受更多参数,而且多个请求也可以绑定在一个 SOAP XML 文档中,这样就支持同时请求。而且,SOAP 请求拥有优先级,这就增强了商店整体的响应性。

在这份教程中将使用 REST 请求来研究服务器返回的数据。在最终应用程序中(在第 2 部分中)使用 SOAP 请求,因为它们允许做的工作比简单的 REST 请求多得多。



回页首


简单 REST 请求

在这里将执行 REST 请求来研究返回的数据是什么。进行 ItemSearch 查询就是在这份教程后面要做的事。首先,需要设置参数。

服务的值是 AWSECommerceService,操作是 ItemSearchRequestResponseGroupSmallSubscriptionId 是开发人员令牌,AssociateTag 是 Amazon 合伙人 ID。通过 Sporting Goods 分类进行搜索,所以 SearchIndex 是 SportingGoods,具体的搜索是高尔夫俱乐部,所以 Keywords 是“golf clubs”。下面是使用的 URL,如清单 2 所示。


清单 2. REST 请求的 URL

					
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService
    &SubscriptionId=01AJBKQ38K8HM2R33Q82&Operation=ItemSearch
    &ResponseGroup=Small&AssociateTag=scubanecessit-20
    &SearchIndex=SportingGoods&Keywords=golf%20clubs

Amazon ECS 现在会返回包含搜索的商品信息的 XML 文档。



回页首


REST 响应

因为响应太大,所以在这里只能显示一部分。但是,自己可以把浏览器指向清单 2 中的 URL,查看完整的响应。清单 3 显示了 REST 响应的一小段。

这就是商品数组开始的地方。它把搜索商品的内容传回发送者。第一个 <item> 元素开始的是 Amazon ECS 发送的响应中第一个商品的信息。它显示了 ASIN、商品 ID、URL(如果是由浏览器指向的),还会显示产品的详细信息。如果请求了小型 ResponseGroup,它还会显示基本的属性,例如商品的标题。



回页首


理解 Amazon 的 WSDL 文件

Web 服务描述语言(WSDL)文件定义了 Web 服务需要的信息以及它应当返回的信息。这样,不需要去琢磨需要发送什么信息、向哪儿发送信息、从响应中能得到什么,就可以构建自己的应用程序。

Amazon 的 WSDL 文件 描述了可用的命令以及可能的查询和搜索语法。

请考虑上面文件中的 ItemSearch 项,如 清单 4 所示。

对于 REST 请求,清单 5 中显示的元素只是被插入 ItemSearch 元素(清单 3)。AWSECommerceService 服务定义了应当在哪里进行请求,它就是在 REST 响应面板中的 GET 请求的 URL 中发送的内容。


清单 5. ItemSearchRequest 项

					
<xs:complexType name="ItemSearchRequest">
<xs:sequence> 
<xs:element name="Keywords" type="xs:string" minOccurs="0" /> 
<xs:element name="ResponseGroup" type="xs:string" minOccurs="0" 
  maxOccurs="unbounded" /> 
<xs:element name="SearchIndex" type="xs:string" minOccurs="0" /> 
...
</xs:sequence>
</xs:complexType>

WSDL 文件定义了 SOAP 请求和响应以及 REST 响应的结构。(REST 请求就是带有编码过的参数的 URL。)请注意,清单 5 中名为 Request 的元素定义了可以产生的请求类型,是 ItemSearchRequest 请求;而且清单 5 中包含的请求结构把 ItemSearch 请求和 ItemSearchRequest 操作连接在一起。在继续阅读本教程时,或者在读完这份教程并准备构建自己的应用程序时,可以参考这个文件。

获得内容

如何构建店面并显示商品

developerWorks
第 4 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


PHP 和 Web 服务

在这一节,将学习如何通过 PHP 发送和接收简单 SOAP 请求,以及如何 PHP 从响应中提取数据。

创建 SOAP 请求

要创建 SOAP 请求,需要设置参数。因为 SOAP 比 REST 复杂,所以将从一个简单示例开始:产品库存检查器。XML 文档如清单 6 所示。


清单 6. 产品库存检查器的 XML 格式的 SOAP 请求

					
<soap-env:Envelope
    xmlns:soap-env="http://schemas./soap/envelope/"
    xmlns:xsd="http://www./1999/XMLSchema">
  <soap-env:Header/>
  <soap-env:Body>
    <tns:InStockQuantityRequest xmlns:tns="InStockByItemId"
       soap-env:encodingStyle=
           "http://schemas./soap/encoding/">
      <ItemId
         xmlns:xsi="http://www./1999/XMLSchema-instance"
         xsi:type="xsd:string">UWHD0023</ItemId>
    </tns:InStockQuantityRequest>
  </soap-env:Body>
</soap-env:Envelope>

清单 6 中的代码是 SOAP 请求在 XML 中看起来的样子。它指定了一个带有空 HeaderEnvelopeBody 包含要发送的参数。PHP 现在可以通过 HTTP 向 SOAP 服务器发送这个请求。



回页首


用 PHP 创建 SOAP 客户

要创建 SOAP 客户,可以利用 PHP 内置的 SOAP 功能:


<?php
$client = new
    SoapClient("http://webservices./services/example.wsdl");

然后,把请求传递给 SOAP 服务器。



回页首


用 PHP 传递 SOAP 请求

现在已经创建了客户,需要设置 SOAP 参数并调用示例函数 InStockCheck,如清单 7 所示。


清单 7. 设置参数并发送 SOAP 请求

					
<?php
$client = new
    SoapClient("http://webservices./services/example.wsdl");
$params = array( ‘ItemId‘ => UWHD0023);
$client->InStockCheck($params);
...
?>
				

以上代码把 SOAP 请求发送到 WSDL 文件中指定的服务器,URL 就是 REST 请求中使用的 URL。现在转到 SOAP 响应。



回页首


SOAP 响应

SOAP 响应也是 XML 文档 (请参阅清单 8)。


清单 8. 产品库存检查器的 XML 格式的 SOAP 响应

					
<soap-env:Envelope
    xmlns:soap-env="http://schemas./soap/envelope/"
    xmlns:xsd="http://www./1999/XMLSchema">
  <soap-env:Header/>
  <soap-env:Body>
    <tns:InStockQuantityResponse xmlns:tns=" InStockByItemId "
       soap-env:encodingStyle=
           "http://schemas./soap/encoding/">
      <InStockQuantity
          xmlns:xsi="http://www./1999/XMLSchema-instance"
          xsi:type="xsd:string">15</InStockQuantity>
    </tns:InStockQuantityResponse>
  </soap-env:Body>
</soap-env:Envelope>

生成的数据结构在 InStockQuantity 中包含对请求的回答。下面,将用 PHP 接收和提取需要的数据。



回页首


用 PHP 从响应中接收和提取数据

用清单 9 中的 PHP 代码捕获响应。


清单 9. 捕获响应

					
...
$client-<InStockCheck($params);
$result = $client-<InStockCheck($params);
...
?>

只要把变量 $result 设置为 InStockCheck 的 SOAP 调用即可。要提取回答 InStockQuantity,请使用清单 10 中的代码。


清单 10. 提取答案

					
...
$result = $client->lInStockCheck($params);
$answer = $result->lInStockQuantity;
?>

现在了解了如何传输和接收简单 SOAP 请求和响应。稍后,将制作带有层次结构的更复杂的 SOAP 请求。



回页首


处理故障

故障可能由于各种原因而发生。要想自行捕捉故障而不使用异常,并把故障显示到屏幕上,请使用以下 PHP 代码。


清单 11. 处理 SOAP 故障

					
...
$result = $client->InStockCheck($params);
$client = new
    SoapClient("http://webservices./services/example.wsdl");
$result = $client->InStockCheck($params);
if(is_soap_fault($result)){
    print("A fault occurred: " . $result->faultstring);
}
else{
    $answer = $result->InStockQuantity;
}
?>

如果您这边或服务器端发生了问题,SOAP 响应中就会返回故障,那么使用上面的代码就可以得到通知。故障看起来就像正常的 SOAP 响应一样。但是,变量 faultstring 包含故障发生的原因。

获得内容

如何构建店面并显示商品

developerWorks
第 5 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


设计店面架构

这一节将讨论店面架构的设计。它将指导 Web 站点模板的创建,模板包括:显示的标题,分类使用的侧面板,在分类中进行搜索的搜索框,以及页面底部的页脚。

处理点:storeFront.php

既然已经介绍了 Web 服务,现在就开始设计店面。为店面创建一个根目录,并创建一个文件:storeFront.php。开始编写它的代码,如清单 12 所示。


清单 12. 处理请求和显示店面

					
<?php
...
$title="Welcome to TylerCo.";
require(‘header.php‘);
...
print("

<p>Welcome to TylerCo., where you 
will find great value and great service!
Guaranteed!<p> Please browse the 
products on our Web site by clicking 
on one of the categories to the left");
...

require(‘footer.php‘);
?>

上面的代码介绍店面。随后当选择了某个分类时,就会调用方法与 Amazon ECS 连接,并显示返回的分类商品或与搜索条件对应的商品。



回页首


主链接和标题

storeFront.php 这个文件用来转发和接收应用程序的所有请求,这是创建店面要显示的余下内容所需要的。创建名为 header.php 的文件,把它放到 storeFront.php 的同一目录中。开始编写它的代码,如清单 13 所示。


清单 13. 主链接和标题

					
<?php

print(‘
<html>
<title>‘.$title.‘</title>
<body>
<table width="750px" align="center" valign="top">
<tr><td colspan="2">
‘);

if(!isset($_GET[‘keyword‘]) && !isset($_GET[‘category‘])){
    print("Home");
}
else{
    print("<a href=‘storeFront.php");
    print("‘>Home</a>");
}
...

在这里输出了标题,而且如果需要的话,还会输出主链接。如果 Web 浏览器被指向 storeFront.php,而不是某个关键字或分类,那么只会显示 Home 这个文本。但是,如果正在浏览分类,那么会显示这个链接,在链接上点击,会清空 GET 字符串中的变量并回到主页。



回页首


侧面板:分类

接下来,需要一些浏览用的分类。我们从五个分类开始:Baby、Computers、Outdoor Living、Software 和 Sporting Goods。继续处理 header.php,添加如清单 14 所示的代码。


清单 14. 显示分类链接

					
...
print(‘
</td></tr>
<tr><td colspan="2">
<center><h1>‘.$title.‘</h1><
  /center></tr></td><tr><td height="100%">

<table width="135px" align="left" border="2px" 
  height="100%"><tr><td valign="top">
<table width="135px">
  <tr>
    <td><b>Categories</b></td>
  </tr>
  <tr>
    <td>
<a href="storeFront.php?category=Baby&displayCat=Baby‘.
          processGETString("cadikepa").‘">Baby</a><br />
<a href="storeFront.php?category=PCHardware&displayCat=Computers‘.
          processGETString("cadikepa").‘">Computers</a><br />
<a href="storeFront.php?category=OutdoorLiving&displayCat=Outdoor Living‘.
          processGETString("cadikepa").‘">Outdoor Living</a><br />
<a href="storeFront.php?category=Software&displayCat=Software‘.
          processGETString("cadikepa").‘">Software</a><br />
<a href="storeFront.php?category=SportingGoods&displayCat=Sporting Goods‘.
          processGETString("cadikepa").‘">Sporting Goods</a>
    </td>
  </tr>
  <tr>
    <td> </td>
  </tr>
</table>
‘);
...

清单 14 创建的侧面板将容纳分类链接。当客户点击其中一个分类时,会在 URL 中设置这个分类和 displayCat(要求显示当前分类的值)。这样,应用程序就能用 GET 数组处理变量并显示适当的商品和信息。

图 5 显示了具有分类链接的当前店面。


图 5. 显示分类链接
显示分类链接

分类链接显示在左侧面板中。现在转到对在分类上点击的处理。

processGETString 将把当前变量放在 GET 数组中,根据店面中的每次点击添加变量的值。这很重要,这样客户每次在店面中点击时,他目前的数据就不会丢失。把这个函数放在 functions.php 中,如清单 15 所示。


清单 15. 处理和返回 URL 中编码的变量

					
function processGETString($vetoString=‘‘){
    $string = ‘‘;
    if($_GET[‘pagenum‘] != ‘‘ && strstr($vetoString, ‘pa‘) == ‘‘)
        $string .= "&pagenum=".$_GET[‘pagenum‘];
    if($_GET[‘keyword‘] != ‘‘ && strstr($vetoString, ‘ke‘) == ‘‘)
        $string .= "&keyword=".$_GET[‘keyword‘];
    if($_GET[‘category‘] != ‘‘ && strstr($vetoString, ‘ca‘) == ‘‘)
        $string .= "&category=".$_GET[‘category‘];
    if($_GET[‘displayCat‘] != ‘‘ && strstr($vetoString, ‘di‘) == ‘‘)
        $string .= "&displayCat=".$_GET[‘displayCat‘];
    return $string;
}

这个函数把当前的所有变量合并成一个变量,用来创建链接,这样就可以把变量的值从一个链接传递到下一个链接。作为参数传递的 $vetoString 变量(值为 cadikepa)用作指示:如果这个变量存在,它的值就不被传播。这在用户想转换分类时很重要。使用 displayCat 可以显示新的分类。关键字和 pagenum 变量需要一起被丢弃。

请点击 Baby 分类,注意 URL 中的当前分类和 displayCat 值:


http://localhost.localdomain/amazon_ecs_part1/storeFront.php?
   category=Baby&displayCat=Baby

现在点击 Computers 分类.


http://localhost.localdomain/amazon_ecs_part1/storeFront.php?
  category=PCHardware&displayCat=Computers

可以看到旧的分类和 displayCat 值没有被传播。这是因为通过传递 ‘ca‘ 取消分类并且传递 ‘di‘ 取消 displayCatprocessGETString() 函数已经取消了它们。



回页首


侧面板:搜索框

现在已经设置了浏览分类的功能。接下来,要添加功能,创建一个搜索框,在当前分类中进行搜索,继续使用 header.php,如清单 16 所示。


清单 16. 显示搜索框

					
...
</table>
‘);

if(isset($_GET[‘category‘])){
    print(‘
<table width="135px">
  <tr>
    <td><b>Search within<br>this category</b></td>
  </tr>
  <tr>
    <td>
      <form name="search" action="storeFront.php" method="GET">
...
        <input type="hidden" name="displayCat" 
		         value="‘.$_GET[‘displayCat‘].‘" />
        <input type="hidden" name="category" 
		         value="‘.$_GET[‘category‘].‘" />‘);
    print(‘
        <input type="text" name="keyword" size="10" />
        <input type="submit" value="Search" />
      </form>
    </td>
  </tr>
  <tr>
    <td> </td>
  </tr>
</table>
‘);
...

清单 16 的 HTML 代码会显示一个搜索框。一旦按下了 Search 按钮,就会提交输入的关键字,同时当前 displayCat 和分类变量也会作为隐含输入提交。这将允许应用程序处理数据,并把适当的商品作为结果显示出来。

请点击某个分类链接,查看带有搜索框的当前店面,如图 6 所示。


图 6. 显示搜索框
显示搜索框

搜索框在左侧面板中显示,有一个按钮。在 搜索商品 一节中将介绍在分类中搜索商品。现在转入主内容区域。



回页首


主内容区域:设置和内容

到了教程的这一部分,侧面板即将完成。在第 2 部分中还会添加其他一些东西,所以请一定要阅读那一部分。

现在,要设置主内容区域,稍后将在这里显示从 Amazon 返回的商品。这部分代码会结束侧面板并开始主内容区域:


print(‘
</td></tr></table>
</td><td valign="top" width="100%">‘);

主内容区域的内容是用来显示的。在做这件事之前,需要完成页脚。



回页首


页脚:站点信息

页脚是一个相当简单的文件,如果日后需要,可以做得更复杂。创建 footer.php 文件,并把它放在与 header.php 相同的目录中。把以下示例代码放在这个文件中,如清单 17 所示。


清单 17: 显示站点和版权信息

					
</td></tr>
<tr><td align="center" colspan="2">
<font size="2px"><br>
<center>Copyright 2005, TylerCo.<br>Product/
information and pictures Copyright Amazon</center>
</font>
</td></tr></table>
</body></html>

可以为自己的应用程序调整站点和版权信息。这就完成了店面。把浏览器指向 storeFront.php 后的示例输出如图 7 所示。


图 7. 完整的店面
完整的店面

店面现在应当包括标题、带有分类链接的侧面板,右侧是空的主内容区,页脚显示站点和版权信息。搜索框在这里不显示,因为还没有选择分类。

现在转到有趣的部分,开始从 Amazong 检索内容。

获得内容

如何构建店面并显示商品

developerWorks
第 6 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


浏览分类

既然店面已经设计完成,有了分类链接,现在是时候从 Amazon ECS 请求数据并显示返回的商品供客户浏览了。

从 GET 数据中检索当前分类

首先需要点击一个分类。先从点击 Sporting Goods 分类开始,然后在 storeFront.php 中处理,如清单 18 所示。


清单 18. 处理从 GET 数组得到的分类变量

					
...
require(‘header.php‘);

if($_GET[‘category‘] != ‘‘){
    printCategoryItems();
}
else{
    print("
<p>Welcome to TylerCo., where you will find 
great value and great service!
Guaranteed!<p> 
Please browse the products on our Web site by clicking 
on one of the categories to the left");
}

这次,不是介绍店面,GET 数组中存在分类变量,这告诉应用程序选择了一个分类,应当调用 printCategoryItems()。要想看看清单 18 中的代码的作用,可以创建一个空函数 printCategoryItems(),并把它放在 functions.php 文件中。



回页首


检验选中的分类

已经选择一个分类后,需要做的是检验它是否店面中的有效分类。请在 functions.php 文件中创建以下函数,并把这个文件放在店面根目录中叫作 includes 的子目录中,如清单 19 所示。


清单 19. 检验选中的分类在店面中是否有效

					
define(TOKEN, "YourDeveloperTokenHere");
define(ASSOCID, "YourAssociatesIdHere");

function printCategoryItems(){
...
    $category = $_GET[‘category‘];
    $displayCat = $_GET[‘displayCat‘];

    switch($category){
    case ‘Baby‘:
    case ‘PCHardware‘:
    case ‘OutdoorLiving‘:
    case ‘Software‘:
    case ‘SportingGoods‘:
        $innerTitle = "$displayCat";
        break;
    default:
        print("The $category category doesn‘t exist");
        return;
    }

    if(isset($_GET[‘pagenum‘])){
        $pagenum = $_GET[‘pagenum‘];
    }
    else{
        $pagenum = "1";
    }
...

请在 storeFront.php 的顶部包含这个文件。

前两行定义了开发人员令牌和 Amazon 合伙人 ID。需要用从 Amazon 得到的实际值替换它们。如果分类无效,方法会返回,并通知客户。但是,如果分类有效,主内容区的标题就会变成用来显示分类的值,比起传递给 Amazon 的分类代码,这个值更具可读性。$pagenum 变量指示 Amazon 要返回哪页结果显示给客户。



回页首


设置参数

现在要设置发送给 Amazon ECS 的参数。在分类中搜索商品,要使用清单 20 所示的参数。


清单 20. 在分类中搜索商品的参数

					
...
    $pagenum = "1";
}
$array = array(‘Operation‘ => ‘ItemSearchRequest‘,
               ‘ItemPage‘ => $pagenum,
               ‘SearchIndex‘ => $category,
               ‘ResponseGroup‘ => ‘Medium‘,
               ‘Keywords‘ => $displayCat);
...

这个操作告诉 Amazon 要执行的是 ItemSearchRequest 查询,第一页是 1(由 ItemPage 指示)。SearchIndex 指定要搜索哪个分类,ResponseGroup 告诉 Amazon 需要多少信息。把 $displayCat 作为 Keywords,表明将查询整个分类。Keywords 参数是必需的,不能为空,所以包含分类显示名称的 $displayCat 变量将被用作关键字。



回页首


创建请求函数

请在 functions.php 中创建另一个函数,它将把我们的请求发送到 Amazon 并返回结果,如清单 21 所示。


清单 21. 向 Amazon ECS 发送请求并返回结果

					
function callSOAPFunction($function, $array){
    $params = array(‘Service‘ => ‘AWSECommerceService‘,
                    ‘AssociateTag‘ => ASSOCID,
                    ‘SubscriptionId‘ => TOKEN,
                    ‘Request‘ => array($array));

    $client = new
SoapClient("http://webservices.amazon.com/AWSECommerceService
                  /AWSECommerceService.wsdl",
                   array(‘exceptions‘ => 0));

    return $client->__soapCall($function, array($params));
}

这个函数获得一个函数名(由 WSDL 文件决定)以及一个参数数组(是在前面的面板中创建的)。然后就创建一个新 SOAP 客户,指向 Amazon 的 ECS WSDL 文件。参数 ‘exceptions‘ => 0 表明要手工处理异常。最后,向 Amazon 发送请求,指明要使用 WSDL 文件的函数 $function,以及参数数组 $params。如果有效,函数会返回一个数据结构,其中包含与搜索请求匹配的商品。



回页首


使用请求函数

现在可以通过调用 callSOAPFunction 制作请求。请把如清单 22 所示的代码添加到 printCategoryItems() 函数中。


清单 22. 调用 callSOAPFunction 并把结果保存在 $result 中

					
...
               ‘ResponseGroup‘ => ‘Medium‘,
               ‘Keywords‘ => $displayCat);

$result = callSOAPFunction("ItemSearch", $array);
...

结果现在保存在 $result 中,可以对它进行处理。



回页首


商品显示区

如果请求有效,每件事都工作正常,那么可以为客户显示商品的信息了。异常处理会在这一节最后介绍。添加代码到 printCategoryItems() 函数中,如清单 23 所示。


清单 23. 判断请求是否返回了商品,显示商品,以及页面导航

					
...
    $result = callSOAPFunction("ItemSearch", $array);
    $items = $result->Items->Item;
    if($items){
        printItemsSection($innerTitle, $items);
        printPrevNextPage($result->Items->TotalPages, $pagenum);
    }
}
<><>>>>>>>>>

首先,需要从返回的 SOAP 构造中检索商品数组:$items = $result->Items->Item。然后,如果 $items 存在,printItemsSection() 就输出所有商品,而 printPrevNextPage() 则会输出页面导航链接。

现在,需要遍历 $items 数组(如果它是数组的话)中的所有商品,或者打印出 $items(如果它不是数组的话)中唯一的商品。请参阅清单 24 中的代码,并把这个函数放在 functions.php 中。


清单 24. 输出商品区的标题并遍历所有商品

					
function printItemsSection($title, $items){
    print("<center><h3>$title</h3></center>");
    print("
        <table width=‘100%‘ border=‘0‘ cellspacing=‘5‘ cellpadding=‘0‘>");
    if(is_array($items)){
        foreach($items as $i){
            printItem($i);
        }
    }
    else{
        printItem($items);
    }
    print("</table>");
}

对于每个商品元素,都调用 printItem() 函数。在这里把每个商品的 HTML 发送到 Web 浏览器。请把清单 25 所示的函数添加到 functions.php 中。


清单 25. 通过从 $i 变量检索商品数据,输出一件商品的信息

					
function printItem($i){
    print("<tr><td align=‘center‘ valign=‘top‘ rowspan=‘3‘>");
    print("<img border=‘0‘ src=‘".$i->SmallImage->URL."‘>");
    print("</td><td><font size=‘-1‘> ");
    print("<b>".$i->ItemAttributes->Title."</b><
	   /font></td> </tr> ");

    $price = $i->OfferSummary->LowestNewPrice->FormattedPrice;

    print("<tr> <td align=‘left‘ valign=‘top‘>");
    print("<font size=‘-1‘>Price: $price</font></td> </tr>");
    print("<tr><td colspan=2> </td> </tr> ");
}

首先,显示 URL 为 $i->SmallImage->URL 的图片。然后是商品名称 $i->ItemAttributes->Title,后面跟着的是价格 $i->OfferSummary->LowestNewPrice->FormattedPrice。显示的每件商品实际上都是一个对象,拥有各种属性,与 SOAP 响应返回的 XML 文件对应。

图 8 显示了目前为止应用程序的浏览器输出示例。


图 8. 显示 Sporting Goods 分类的第一页
显示 Sporting Goods 分类的第一页

下面,需要导航链接,以便在分类的页面间进行导航。



回页首


显示页面导航链接

清单 23 中,有一个对 printPrevNextPage() 函数的引用。请把这个函数添加到 functions.php 中,如清单 26 所示。


清单 26. 为前一页和下一页链接检索数据,并显示它们

					
function printPrevNextPage($totalPages, $pagenum){
    $previousPage = processPrevPage();
    $nextPage = processNextPage($totalPages);
    
    print("<table width=‘100%‘><tr><td width=‘33%‘ 
	              align=‘left‘>");
    print("$previousPage</td>");
    print("<td width=‘33%‘ align=‘center‘>Page ".$pagenum);
    print(" of $totalPages</td>");
    print("<td width=‘33%‘ align=‘right‘>$nextPage
	         </td></tr></table>");
    print("<font size=‘0‘><br><center>The 
	         above information came from ");
    print("Amazon.com. We make no guarantees to the accuracy of the above ");
    print("information.</center></font>");
}

清单 26 中的函数调用两个子函数:processPrevPage()processNextPage()。这个函数接受两个返回的链接,并显示它们,这样就允许客户在页面间游历。它还显示了一个免责声明,表明 Web 站点的作者对于 Amazon 提供的信息不承担责任。

添加函数 processPrevPage()processNextPage() 的代码到 functions.php 中,如清单 27 和清单 28 所示。


清单 27. 计算前一页链接

					
function processPrevPage($pagenum){
    if($pagenum > 1){
        $previousPage = "<a href=‘storeFront.php?pagenum=".
            ($pagenum-1).
            processGETString("pa");
        $previousPage .= "‘>Previous Page</a>";
    }
    else{
        $previousPage = "Previous Page";
    }
    return $previousPage;
}


清单 28. 计算下一页链接

					
function processNextPage($totalPages, $pagenum){
    if($pagenum < 300 && ($pagenum+1) <= $totalPages){
        $nextPage = "<a href=‘storeFront.php?pagenum=".($pagenum+1).
            processGETString("pa");
        $nextPage .= "‘>Next Page</a>";
    }
    else{
        $nextPage = "Next Page";
    }
    return $nextPage;
}

这两个清单中的代码处理前一页和下一页链接。请注意,processGETString() 的取消字符串会作为 pa 发送,从而确保当前的 pagenum 变量不会被传播。

现在介绍显示导航链接的代码。请参阅图 9 中显示导航链接的浏览器输出示例。


图 9. 在 Sporting Goods 分类第一页的底部显示导航链接
在 Sporting Goods 分类第一页的底部显示导航链接


回页首


异常处理

既然已经制作了请求,现在重要的是检验没有发生错误。首先,创建函数 error(),如清单 29 所示。


清单 29. 显示出错信息

					
function error($msg, $err, $result){
    print($msg);
    if(is_array($err)){
        $msg2 = $err[0]->Message;
    }
    else{
        $msg2 = $err->Message;
    }
    print($msg2);
    print_r($result->faultstring);
    print("<br><br>");
    print_r($result);
}

这个函数将显示出错信息,表示发生了错误。请修改 printCategoryItems(),如清单 30 所示。这个代码检查是否出错,并使用 error() 函数。


清单 30. 测试 $result 判断是否出错,如果为真就显示出错信息

					
...
$result = callSOAPFunction("ItemSearch", $array);

if($result->faultstring || $result->Items->Request->Errors){
    error("Your search return 0 results, or perhaps there was an 
	  error processing your request. The returned XML file with 
	  additional error information is as follows:<br><br>",
          $result->Items->Request->Errors->Error, $result);
}
else{
    $items = $result->Items->Item;
    if($items){
        printItemsSection($innerTitle, $items);
        printPrevNextPage($result->Items->TotalPages, $pagenum);
    }
}

...

在返回的 SOAP 构造中,有两个部分需要查看。一个是检查 $result->faultstring,如果没有出现故障,那么就需要查看 $result->Items->Request->Errors,检查是不是在请求中有错误。如果存在其中任何一种情况,都会显示出错信息;否则,代码会继续执行。

应用程序运行得很好!现在要转到搜索框,以便客户可以更好地缩小搜索范围。

获得内容

如何构建店面并显示商品

developerWorks
第 7 页, 总 共 12 页

文档选项
将此页作为电子邮件发送

将此页作为电子邮件发送

样例代码


对本教程的评价

帮助我们改进这些内容


搜索商品

在这一节,将学习如何用搜索框设置正确的 SOAP 请求并在分类中检索特定商品,这样客户就可以把他们的搜索集中于少量商品。这一节会重用 浏览分类 一节中的许多代码,所以这一节的目标是展示如何动态地设置 Amazon 的商品搜索请求的参数。



检索搜索框提交的关键字

在检索提交的关键字之前,需要在搜索框中输入一些关键字。请在搜索框中输入“golf clubs”,如图 10 所示。




图 10. 在搜索框中输入关键字“golf clubs”
输入关键字 golf clubs

现在按下回车或点击 Search 按钮。现在可以添加 printCategoryItems() 函数,并用 GET 提交的关键字变量确定它的参数(请参阅清单 31)。


清单 31. 从 GET 数组检索关键字变量

					
function printCategoryItems(){
    if(isset($_GET[‘keyword‘])){
        $keyword = $_GET[‘keyword‘];
        $innerTitle = "Results for ‘$keyword‘ ";
    }
    $category = $_GET[‘category‘];
...

这将可以确定发送到 Amazon 的请求的参数。



回页首


确定搜索参数

要确定 $array 构造中创建的搜索参数,请参阅清单 32。


清单 32. 确定用来构造发送给 Amazon 的请求的 $array 参数

					
...
    print("The $category category doesn‘t exist");
    return;
}

$array = array(‘Operation‘ => ‘ItemSearchRequest‘,
               ‘ItemPage‘ => $pagenum,
               ‘SearchIndex‘ => $category,
               ‘ResponseGroup‘ => ‘Medium‘,
               ‘Keywords‘ => getKeyword($keyword, $displayCat));

$result = callSOAPFunction("ItemSearch", $array);
...

通过 getKeyword(),可以动态地修改传递给商品搜索请求的关键字。创建函数 getKeyword() 并把它放在 functions.php 文件中(请参阅清单 33)。


清单 33. 根据是否设置了 $keyword,返回需要的关键字

					
function getKeyword(){
    if($_GET[‘keyword‘] == ‘‘){
        return $_GET[‘displayCat‘];
    }
    else{
        return $_GET[‘keyword‘];
    }
}

这样,如果设置了 keyword,就意味着客户使用搜索框进行搜索,那么关键字会通过清单 33 中的函数返回,并用作请求的 Keywords 的输入,这样就可以动态地修改请求的输入。

这就是动态地修改商品搜索请求输入参数所要做的全部工作。请参阅图 11 中在 Sporting Goods 分类中搜索 golf clubs 的示例输出。


图 11. 在 Sporting Goods 分类中搜索 golf clubs 的结果
在 Sporting Goods 分类中搜索 golf clubs 的结果

请注意,搜索的结果与搜索框中输入的内容匹配!现在有了一个可以工作的 Web 站点,用户可以浏览 Amazon 特定分类中的商品,还可以在这些分类中搜索商品。

结束语

在这篇教程中,用 PHP 创建了 Amazon 店面,允许客户浏览分类,在这些分类中搜索特定商品。应用程序成功地向 Amazon ECS 提交请求并从 Amazon ECS 接收请求,允许在这个 Web 站点上显示产品。在这个系列的第 2 部分中,将为应用程序创建购物车,允许客户在 Amazon 上安全地购买商品 —— 并为您提供佣金。

下载

描述 文件名称 文件大小  下载方法
Source code for the Amazon store, Part 1 os-amazonphpstore1.zip 3.5 KB  FTP

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多