快捷搜索:   服务器  安全  linux 安全  MYSQL  dedecms

将 Google Book Search 集成到 PHP 应用程序中(3)


// get first subject
if (is_array($entry->getSubjects())) {
$arr = $entry->getSubjects();
$book->subject = is_object($arr[0]) ?
$arr[0]->getText() : 'Unspecified';
}

// get first description
if (is_array($entry->getDescriptions())) {
$arr = $entry->getDescriptions();
$book->desc = is_object($arr[0]) ?
$arr[0]->getText() : 'No description available';
}
?>

<div class="entry">
<div class="thumbnail">
<img src="<?php echo ($entry->getThumbnailLink()) ?
$entry->getThumbnailLink()->getHref() : ''; ?>" />
</div>
<div class="data">
<?php echo $x; ?>. <?php echo ucwords(@implode(': ',
$book->titles)); ?><br/>
<?php echo @implode(', ', $book->authors); ?> |
<?php echo @implode(', ', $book->publishers); ?> |
<?php echo $book->subject; ?> |
<?php echo date('d M Y', strtotime($book->pubdate)); ?> <br/>
<span class="desc"><?php echo $book->desc; ?></span>
<br/>
<span class="small"><?php echo @implode(', ', $book->isbn); ?> |
<a href="<?php echo $entry->getInfoLink()->getHref(); ?>">
More information</a>
</span>
</div>
</div>
<?php $x++; ?>
<?php endforeach; ?>
<?php endif; ?>

</body>
</html>

在 清单 4 的这个修订版中,用户将看到针对标题、作者和可见性的单独的搜索字段。根据收到的输入参数,搜索查询由适当的限定符构造并传输到 Google Book Search API。注意 setMinViewability() 和 setMaxResults() 方法,它们为 min-viewability 和 max-results 输入参数提供面向对象的接口。

图 5 和 图 6 展示了 清单 5 的输出,前者显示了一个标题搜索的结果,后者显示了一个 “作者/标题” 联合搜索的结果。

图 5. 一个 Google Books 搜索的结果,根据标题过滤

图 6. 一个 Google Books API 结果,根据作者姓名和标题名称过滤

访问用户图书馆

除了支持公共搜索之外,Google Book Search 还允许验证用户创建他们自己的虚拟图书馆。这个 “My Library” 特性允许用户评论图书并对图书添加标签,创建并与其他用户共享图书集合。与其他 Google Book Search 特性一样,该特性通过 Google Book Search Data API 提供。

要查看 “My Library” 的工作方式,使用您的 Google Account 登录 Google Book Search,输入搜索词汇,然后使用每个搜索结果旁边的 “Add to my library” 链接来创建虚拟图书馆,您可以通过每个页面右上角的 “My Library” 链接来随时访问这个图书馆。图 7 展示了一个用户图书馆示例:

图 7. Google Books Web 站点上的一个用户图书馆

验证用户的图书馆的内容也可以作为一个 Atom 提要获取,以便在 PHP 应用程序中解析。与 清单 1 中展示的卷提要一样,该提要包含一组 <entry> 元素,每个元素表示用户图书馆中的一本书。该提要可以通过 Zend_Gdata_Books 对象的 getUserLibraryFeed() 方法解析为一组 PHP 对象,从而用于生成图书馆的 HTML 视图。清单 6 展示了如何检索用户图书馆的内容:

清单 6. 检索用户图书馆的内容

<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Books');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "[email protected]";
$pass = "secret";

try {
// perform login
$client = Zend_Gdata_ClientLogin::getHttpClient(
$user, $pass, 'print');
$client->setHeaders('X-Forwarded-For', $_SERVER['REMOTE_ADDR']);
$books = new Zend_Gdata_Books($client);

// get authenticated user's library feed
$feed = $books->getUserLibraryFeed();
} catch (Exception $e) {
die('ERROR:' . $e->getMessage());
}
?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title>Displaying a user's library</title>
<style>
.entry {
height: 120px;
border-bottom: dashed silver 2px;
padding-top: 10px;
}

.thumbnail {
float: left;
border: solid black 2px;
padding: 2px;
margin-right: 10px;
}

.desc {
font-style: italic;
}

.small {
font-size: smaller;
}
</style>
</head>
<body>
<?php if (isset($feed)): ?>
<h2>My Library</h2>
<div>
<?php echo $feed->totalResults; ?> result(s) found.
</div>

<div id="results">
<?php $x = 1; ?>
<?php foreach ($feed as $entry): ?>

<?php
$book = new stdClass;

// get title
if (is_array($entry->getTitles())) {
foreach ($entry->getTitles() as $title) {
$book->titles[] = $title->getText();
}
}

// get authors
if (is_array($entry->getCreators())) {
foreach ($entry->getCreators() as $creator) {
$book->authors[] = $creator->getText();
}
}

// get publishers
if (is_array($entry->getPublishers())) {
foreach ($entry->getPublishers() as $publisher) {
$book->publishers[] = $publisher->getText();
}
}

// get publication date
if (is_array($entry->getDates())) {
$arr = $entry->getDates();
$book->pubdate = (is_object($arr[0])) ?
$arr[0]->getText() : 'Unspecified';
}

// get ISBN numbers
if (is_array($entry->getIdentifiers())) {
foreach ($entry->getIdentifiers() as $id) {
if (preg_match('/ISBN/', $id->getText())) {
$book->isbn[] = $id->getText();
}
}
}

// get first subject
if (is_array($entry->getSubjects())) {
$arr = $entry->getSubjects();
$book->subject = is_object($arr[0]) ?
$arr[0]->getText() : 'Unspecified';
}

// get first description
if (is_array($entry->getDescriptions())) {
$arr = $entry->getDescriptions();
$book->desc = is_object($arr[0]) ?
$arr[0]->getText() : 'No description available';
}
?>

<div class="entry">
<div class="thumbnail">
<img src="<?php echo ($entry->getThumbnailLink()) ?
$entry->getThumbnailLink()->getHref() : ''; ?>" />
</div>
<div class="data">
<?php echo $x; ?>. <?php echo ucwords(@implode(': ',
$book->titles)); ?><br/>
<?php echo @implode(', ', $book->authors); ?> |
<?php echo @implode(', ', $book->publishers); ?> |
<?php echo $book->subject; ?> |
<?php echo date('d M Y', strtotime($book->pubdate)); ?> <br/>
<span class="desc"><?php echo $book->desc; ?></span>
<br/>
<span class="small"><?php echo @implode(', ', $book->isbn); ?> |
Added to library on: <?php echo ($entry->getPublished()) ?
date('d M Y', strtotime($entry->getPublished()->getText())) : '';
?> |
<a href="<?php echo $entry->getInfoLink()->getHref(); ?>"
>More information</a>
</span>
</div>
</div>
<?php $x++; ?>
<?php endforeach; ?>
<?php endif; ?>

</body>
</html>

清单 6 中的大部分内容已在本文前面的小节中出现过。这个脚本打开一个到 Google Book Search 服务的验证连接,初始化 Zend_Gdata_Books 对象,然后使用 getUserLibraryFeed() 方法来检索提要,该提要包含用户图书馆中的图书列表。该提要以 PHP 对象数组的形式表示,您现在可以轻松迭代这个数组,处理每个条目并使用适当的 HTML 标记来显示结果。

图 8 展示了一个结果示例:

图 8. 对用户图书馆提要的 Google Books API 请求结果

向用户图书馆添加图书

您已经了解了如何检索用户图书馆的内容......但如何向用户图书馆添加新标题呢?使用 Google Book Search Data API,您只需 POST 一个包含图书的唯一卷标识符的 XML 编码 <entry> 到用户的图书馆提要。清单 7 展示了这样一个 POST 请求示例:

清单 7. 向用户图书馆添加一本图书的 POST 请求示例

POST /books/feeds/users/me/collections/library/volumes HTTP/1.1
Host: books.google.com
Connection: close
User-Agent: MyCompany-MyApp-1.0 Zend_Framework_Gdata/1.9.0
authorization: GoogleLogin
Content-Type: application/atom+xml
Accept-encoding: identity
Content-Length: 97

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom">
<atom:id>BOOK_VOLUME_ID_HERE</atom:id>
</atom:entry>

要使用 Zend_Gdata_Books 完成相同的任务,初始化一个新的 Zend_Gdata_Books_VolumeEntry 对象,向它分配一个卷标识符,然后使用 insertVolume() 方法将它附加到用户的图书馆提要。清单 8 展示了相关代码:

清单 8. 向用户图书馆添加图书

<?php
// load Zend Gdata libraries
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata_Books');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

// set credentials for ClientLogin authentication
$user = "[email protected]";
$pass = "secret";

try {
// perform login
$client = Zend_Gdata_ClientLogin::getHttpClient(
$user, $pass, 'print');
$books = new Zend_Gdata_Books($client);

// add book to user's library using volume ID
$id = 'BOOK_VOLUME_ID_HERE';
$entry = new Zend_Gdata_Books_VolumeEntry();
$entry->setId(new Zend_Gdata_App_Extension_Id($id));
$books->insertVolume(
$entry,
Zend_Gdata_Books::MY_LIBRARY_FEED_URI
);

// display success message
echo "Volume added successfully with ID: $id";
} catch (Exception $e) {
die('ERROR:' . $e->getMessage());
}
?>

添加图书评论和标签

除允许用户向其图书馆添加图书外,Google Book Search API 还允许用户向图书添加评论和标签。评论和标签存储为 Google 所称的 “注释(annotation)”,如果您回顾一下 清单 1,您将看到每个条目都包含一个注释 URL。因此,要向一本图书添加评论或标签,您只需为该图书创建一个 XML 编码的 <entry>,将评论和/或标签附加到这个条目,然后将整个条目 POST 到概述的注释 URL。

清单 9 展示了这样一个 POST 请求示例:

清单 9. 一个用于添加图书评论的 POST 请求示例

POST /books/feeds/users/me/volumes HTTP/1.1
Host: www.google.com
Connection: close
User-Agent: MyCompany-MyApp-1.0 Zend_Framework_Gdata/1.9.0
authorization: GoogleLogin
Accept-encoding: identity
Content-Type: application/atom+xml
Content-Length: 3291

<atom:entry xmlns:atom="http://www.w3.org/2005/Atom">
<openAccess xmlns="http://schemas.google.com/books/2008"
value="http://schemas.google.com/books/2008#disabled"/>
<atom:category term="http://schemas.google.com/books/2008#volume"
scheme="http://schemas.google.com/g/2005#kind"/>
<atom:id>http://www.google.com/books/feeds/volumes/BOOK_VOLUME_ID_HERE
</atom:id>
<atom:link href="http://bks7.books.google.com/books?id=BOOK_VOLUME_ID_HERE
&printsec=frontcover&img=1&zoom=5&sig=ACfU3U0ayCK47roiq
7r_hf_Iy-tQ&source=gbs_gdata"
rel="http://schemas.google.com/books/2008/thumbnail" type="image/x-unknown"/>
<atom:link href="http://books.google.com/books?id=BOOK_VOLUME_ID_HERE
&ie=ISO-8859-1&source=gbs_gdata"
rel="http://schemas.google.com/books/2008/info" type="text/html"/>
<atom:link href="http://www.google.com/books/feeds/users/me/volumes"
rel="http://schemas.google.com/books/2008/annotation"
type="application/atom+xml"/>
<atom:link href="http://books.google.com/books?id=BOOK_VOLUME_ID_HERE
&ie=ISO-8859-1" rel="alternate" type="text/html"/>
<atom:link href="http://www.google.com/books/feeds/volumes/BOOK_VOLUME_ID_HERE"
rel="self" type="application/atom+xml"/>
<atom:title type="text">The Two Minute Rule</atom:title>
<atom:updated>2009-12-28T10:15:44.000Z</atom:updated>
<dc:creator xmlns:dc="http://purl.org/dc/terms">Robert Crais</dc:creator>
<dc:date xmlns:dc="http://purl.org/dc/terms">2006-01-01</dc:date>
<dc:format xmlns:dc="http://purl.org/dc/terms">Dimensions 10.8x17.2x3.0 cm
</dc:format>
<dc:format xmlns:dc="http://purl.org/dc/terms">465 pages</dc:format>
<dc:format xmlns:dc="http://purl.org/dc/terms">book</dc:format>
<dc:identifier xmlns:dc="http://purl.org/dc/terms">BOOK_VOLUME_ID_HERE
</dc:identifier>
<dc:identifier xmlns:dc="http://purl.org/dc/terms">ISBN:1111111111
</dc:identifier>
<dc:identifier xmlns:dc="http://purl.org/dc/terms">ISBN:1111111111111
</dc:identifier>
<dc:language xmlns:dc="http://purl.org/dc/terms">en</dc:language>
<dc:publisher xmlns:dc="http://purl.org/dc/terms">Pocket Books
</dc:publisher>
<dc:subject xmlns:dc="http://purl.org/dc/terms">Fiction / Action & Adventure
</dc:subject>
<dc:subject xmlns:dc="http://purl.org/dc/terms">Fiction / Suspense
</dc:subject>
<dc:subject xmlns:dc="http://purl.org/dc/terms">Fiction / Action & Adventure
</dc:subject>
<dc:title xmlns:dc="http://purl.org/dc/terms">The Two Minute Rule
</dc:title>
<gbs:embeddability xmlns:gbs="http://schemas.google.com/books/2008"
value="http://schemas.google.com/books/2008#not_embeddable"/>
<gd:rating xmlns:gd="http://schemas.google.com/g/2005" min="1" max="5"
average="4.20"/>
<gbs:review xmlns:gbs="http://schemas.google.com/books/2008">
This book is amazing - v!</gbs:review>
<gbs:viewability xmlns:gbs="http://schemas.google.com/books/2008"
value="http://schemas.google.com/books/2008#view_no_pages"/>
</atom:entry>
顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论