如何使用 Zend_HTTP_Client 模块加载网站数据。
如何保存提要条目的全文以及那些不支持提要的网页的全文。
如何在提要阅读器界面中阅读已保存提要条目的全文。
在本文的末尾,将完成提要阅读器应用程序的框架。首先,修改纲要,其次,更新代码以支持新的纲要,然后添加将提要条目和网页保存到数据库中的功能。最后,使用 Zend_HTTP_Client 模块支持用户有选择地将条目保存到数据库中,并在已更新的在线提要阅读器中查看它们。
更新数据库纲要
为了将提要条目保存到提要阅读器界面中,首先我们需要更新数据库纲要。在 控制台中键入清单 1 中的SQL 语句。
清单 1. 更改数据库纲要
drop table feeds;
create table feeds
(feedname varchar(256), link varchar(512), varchar(5));
insert into feeds values
('Fox Sports',
'',
'true'),
('Google News',
'',
'true'),
('Yahoo News',
'',
'true'),
('phpbb',
'',
'false'),
('MySQL Forums :: PHP',
'',
'false'),
('SitePoint Forums :: PHP',
'',
'false');
drop table savedentries;
create table savedentries
(username varchar(20), feedname varchar(256), channelname varchar(256),
link varchar(512), entrysaved varchar(5), entrydata varchar(307200));
您能看到 feeds 表添加了一个新的字段:rss。这个字段用于辨别该提要是 RSS 提要还是不支持提要的网页。订阅列表中添加了另外三个不同 论坛的提要。请注意,对于第 3 部分中的提要,这个新字段值为 true,而三条新提要的值则为 false,这说明它们是网页,而非 RSS 提要。savedentries 表有两个新的字段:entrysaved 和 entrydata。entrysaved 字段说明 entrydata 字段中的数据是有效数据。entrydata 字段保存了该文章的全文。新的可订阅网页如图 1 所示。
现在需要回到第 3 部分的代码中做一些更改。
更新 IndexController 类
稍后我们将对 viewFeeds 视图进行更新,这需要当前用户所订阅的非 RSS 提要的列表,该列表列出了已订阅的提要和网页。在 IndexController 类中更改 indexAction 方法,如下所示。
清单 2. IndexController 类中的 indexAction 方法
public function indexAction()
{
...
$select->where('feeds.feedname=subscribedfeeds.feedname');
$select->where('feeds.rss=?', 'true');
$rssResults = $db->fetchAll($select);
$select = $db->select();
$select->from('subscribedfeeds, feeds', '*');
$select->where('subscribedfeeds.Username = ?', $username);
$select->where('feeds.feedname=subscribedfeeds.feedname');
$select->where('feeds.rss=?', 'false');
$webResults = $db->fetchAll($select);
$view = ::registry('view');
$view->username = $username;
$view->rssFeeds = $rssResults;
$view->webFeeds = $webResults;
echo $view->render('viewFeeds.php');
}
}
这里包含了两个结果列表:一个包含用户订阅的 RSS 提要,而另一个包含当前用户订阅的网页。这些提要随后被传送到 viewFeeds 视图,并被显示出来。
更新 saveEntryAction 方法
我们需要更新那些可以用来将条目保存到数据库中的链接,这样我们就可以更新这两个新字段了。更改 FeedController 类中的 saveEntryAction 方法,如下所示。
清单 3. FeedController 类中的 saveEntryAction 方法
public function saveEntryAction()
{
$filterSession = Zend::registry('fSession');
$username = $filterSession->getRaw('username');
$filterPost = Zend::registry('fPost');
$feedTitle = $filterPost->getRaw('feedTitle');
$channelTitle = $filterPost->getRaw('title');
$channelLink = $filterPost->getRaw('link');
$type = $filterPost->getRaw('type');
$saveFullText = $filterPost->getRaw('saveFullText');
...
$db = Zend::registry('db');
$row = array(
'Username' => $username,
'feedname' => $feedTitle,
'channelname' => $channelTitle,
'link' => $channelLink,
'entrysaved' => $saveFullText ? 'true' : 'false',
'entrydata' => $fullText
);
$table = 'savedentries';
$rowsAffected = $db->insert($table, $row);
if($type == 'webPage')
$this->_redirect("/");
Else
$this->_redirect("/feed/viewChannel?title=$feedTitle");
}
清单 3 中第一段黑体代码将数据从 POST 数组(而不是 GET 数组)中提取出来,因为这就是请求保存提要的方式(不想在 URL 中发送文章的全文)。请注意 savedentries 表中的两个新字段 type 和 saveFullText 是如何被检索的。已经检索的数据被保存为 savedentries 表中的一个新行,并且,如果保存了一个网页,那么用户将被转回到主页;否则用户将被转回到他正在查看的频道。
更新 deleteEntryAction 方法
我们更新了从数据库中删除条目的代码。更改 FeedController 类中的 deleteEntryAction 方法,如下所示。
清单 4. FeedController 类中的 deleteEntryAction 方法
public function deleteEntryAction()
{
$filterSession = Zend::registry('fSession');
$username = $filterSession->getRaw('username');
$filterPost = Zend::registry('fPost');
$feedTitle = $filterPost->getRaw('feedTitle');
$channelTitle = $filterPost->getRaw('channelTitle');
$type = $filterPost->getRaw('type');
$db = Zend::registry('db');
$table = 'savedentries';
$where = "username='$username' and feedname='$feedTitle'";
if($type == 'rssFeed')
$where = "$where and channelname='$channelTitle'";
$rowsAffected = $db->delete($table, $where);
$this->_redirect('/feed/viewSavedEntries/');
}
第一段黑体代码从 POST 数组中获取数据。同样,也获得了条目中的 type 字段。我们可以看到新的 where 子句根据 RSS 提要搜寻匹配的 channelname,因为网页不包含 channelname。
将数据库变更和新功能添加到视图中
既然控制器与将传送给视图的新数据是一起更新的,那么我们需要更新该视图来捕获此数据,并适当地将其展示给用户。
viewFeeds 视图
这个视图向已登录用户展示了已订阅的提要和 Web 站点。我们需要更改此视图,以展示用户当前订阅的非 RSS Web 站点。所以,让我们来更改 viewFeeds.php 文件,如下所示。
清单 5. viewFeeds 视图
...
echo "".
"$feedTitle
";
}
?>
Subscribed Web Pages: | Save Entry to Database | Save Full Text |