分类分类
关注+2010-02-04作者:
PHP和AJAX创建的rss聚合器:
示例使用AJAX来把一请求从一个RSS馈送发送到一定制的PHP对象。该PHP对象复制一份在本地服务器上的该馈送并返回这一路径。该请求对象收到这一路径,分析它,并且把数据以HTML形式显示给用户。这听起来涉及很多步骤,其实它仅由4个小文件组成。之所以使用了4个小文件,是为了平衡它们各自特定的力量而使整个系统的处理极富效率性。
有些读者可能会问,为什么你要创建在本地服务器上的馈送的一个副本而不是简单分析最原始的馈送。原因是,这样以来可以允许绕过XML HTTP Request对象所强加的跨域限制。后面,我还会解释怎样创建这个定制的PHP对象;但是首先,让我们从表单创建开始。
创建发出请求的表单
你要做的第一事情是,在你的HTML的head标签之间包括你可能想使用的JavaScript和任何css文件。我包括了一个式样表来实现该聚合器的最后布局并用一个JavaScript文件来发出请求和进行馈送分析:
<link href="css/layout.css" rel="stylesheet" type="text/css" /> <script src="js/request.js"></script> |
下一步,创建一个表单,它针对你所选择的一个RSS馈送发出请求。我创建的表单只包括一个输入字段和一个提交该请求的按钮。该请求的查询是一个字符串,它由馈送输入值和一个将在服务器端被校验的口令字组成;作为一个示例,我使用了下面形式:
"password=mypassword
该代码在每次页面加载之时发出一次请求;因此,如果页面被刷新,现有的在该输入域中的馈送串将在页面加载时被请求。下面是一个表单数据的示例,连同一些div标签用来显示已分析的馈送的特定结点:
<body onload=""password=mypassword');"> <form name="feedForm" method="post" action=""password=mypassword');"> Enter a feed: <input type="text" name="feed" id="feed" size="20"> <input type="submit" name="submit" value="Add Feed"> </form> <div id="logo"></div> <hr/> <div id="copy"></div> <div id="details"></div> </body> |
我所创建的这三个div标签是logo,copy和details,其中每一个都在布局样式表中有一个与之相关联的样式。当我们分析馈送时将会用到它们,但是我们首先需要能够存取我们所请求的馈送。这可以使用我前面所提到的PHP对象来完成。
创建定制的PHP对象
我用PHP创建了一个小型RSS类,它在本地服务器上创建一个请求馈送的副本,这样它可以为我们稍后要创建的XML HTTP Request对象所存取。典型地,你不能跨域请求一个文件,这意味着你要请求的文件需要位于本地服务器上。这个类是一种解决跨域问题的办法,因为它创建该馈送的一个副本,这个副本在本地服务器上被请求并且把本地路径返回到该馈送,然后它由该Request对象来存取。 这个类中唯一的方法是一个请求方法,它仅有一个指向所请求的RSS 馈送的URL的参数。然后,它通过rss的名字来检查是否一目录位于本地服务器上。如果不存在,就创建一个并把其权限模式设置为0666,这意味着该目录可读写。当被设置为可读的时,该目录就可以在以后被存取;而当被设置为可写的时,就可以把该馈送的一个副本写向本地服务器上的目录:
//如果不存在目录就创建一个 $dir = "rss"; if(!is_dir($dir)) { mkdir($dir, 0666); } |
注意
在一台Windows机器上,对于PHP 4.2.0及以上版本中模式设置是不被要求的。但是,如果它存在的话,它将被忽略;因此,我保留了它,以备该工程被迁移到一台UNIX或Linux服务器上。
在把馈送复制到该服务器前,我们需要一个唯一的文件名。我对这个完整的URL使用了md5加密方法以确保所有馈送的名字是唯一的。通过这个新的文件名,它可以连接一个描述指向该文件的目录的字符串;这将在创建该馈送的副本时使用:
//创建唯一的命名 $file=md5($rss_url); $path="$dir/$file.xml"; |
//复制馈送到本地服务器 copy($rss_url,"$path"); return $path; Following is the small, yet powerful RSS class in its entirety: <?php class RSS { function get($rss_url) { if($rss_url != "") { //如果不存在目录就创建一个 $dir = "rss"; if(!is_dir($dir)) { mkdir($dir, 0666); } // 创建一个唯一的名字 $file = md5($rss_url); $path = "$dir/$file.xml"; //复制馈送到本地服务器 copy($rss_url, "$path"); return $path; } } } ?> |
<? if($password == "mypassword") { require_once('classes/RSS.class.php'); $rss = new RSS(); echo $rss->get($request); } else { echo "You are an unauthorized user"; } ?> |
function sendFeed(url){ post.onreadystatechange = sendRequest; post.open("POST", url, true); post.send(url); } |
function sendRequest(){ if(checkReadyState(post)){ request = createRequestObject(); request.onreadystatechange = onResponse; request.open("GET", post.responseText, true); request.send(null); } } |
var _logo = ""; var _title = response.getElementsByTagName('title')[0].firstChild.data; var _link = response.getElementsByTagName('link')[0].firstChild.data;; _logo += "<a href='" + _link + "' target='_blank'>" + _title + "</a><br/>"; if(checkForTag(response.getElementsByTagName('image')[0])) { var _url = response.getElementsByTagName('url')[0].firstChild.data; _logo += "<img src='" + _url + "' border='0'><br/>" } document.getElementById('logo').innerHTML = _logo; |
if(checkForTag(response.getElementsByTagName('image')[0]) "" i>0){ var _title=response.getElementsByTagName('title')[i+1].firstChild.data; var _link=response.getElementsByTagName('link')[i+1].firstChild.data; } else{ var _title =response.getElementsByTagName('title')[i].firstChild.data; var _link = response.getElementsByTagName('link')[i].firstChild.data; } |
function checkForTag(tag){ if(tag != undefined) { return true; } else{ return false; } } |
if(i>1){ var previousPubDate = response.getElementsByTagName('pubDate')[i-1].firstChild.data; } if(pubDate != previousPubDate || previousPubDate == undefined){ _copy += "<div id='detail'>" + pubDate + "</div><hr align='left' width='90%'/>"; } _copy += "<a href=\"" + i + "');\">" + _title + "</a><br/><br/>"; document.getElementById('copy').innerHTML += _copy; |
function showDetails(index){ document.getElementById('details').innerHTML = response.getElementsByTagName('description')[index].firstChild.data; } |
相关文章
更多+相同厂商
热门推荐
点击查看更多
点击查看更多
点击查看更多
说两句网友评论