忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/20 23:25 |
PHP1-18:AjaxでRSSリーダ
前回の続き。

RSSをAjaxで動的に表示するようにしてみました

rssreader.php

<?php        
        #初期設定
        require_once('./rsslist.php');
        require_once('./rssreader.class.php');
        $rss = new pearMagpieRSSModel();
        $i=0;max=10;

        #引数チェック
        if(empty($_REQUEST['key']))            {die();}
        if(empty($rsslist[$_REQUEST['key']]))    {die();}
        $rsslist=$rsslist[$_REQUEST['key']];

        #RSS取得
        $ret=$rss->setUrl($rsslist);
        if(!$ret){die('rss->setUrl');}

        #チャンネル情報
        $channel=$rss->getRssChannel($rsslist);

        #内容
        $data=$rss->getAllItem($rsslist);
        //表示
        foreach($data as $key=>$val){
            if($i++>$max){die();}
            $val['summary']=mb_substr(strip_tags($val['summary']),0,500);
            print('<div class="title"><a href="'.htmlspecialchars($val['link']).'" target="_blank">'.htmlspecialchars($val['title']).'</a></div>');
            print('<div class="summary">'.htmlspecialchars($val['summary']).'</div>');
        }



rssreader.class.php

<?php
    //初期設定
    define('PEAR_MAGPIERSS_DIR',$_SERVER['DOCUMENT_ROOT'].'/src/php/pear/MagpieRSS/');
    define('MAGPIE_OUTPUT_ENCODING', 'UTF-8');
    define('MAGPIE_CACHE_DIR',PEAR_MAGPIERSS_DIR.'cache/');
    define('MAGPIE_CACHE_AGE',3600);
    require_once(PEAR_MAGPIERSS_DIR.'rss_fetch.inc');

    class pearMagpieRSSModel {

        //メンバ変数
        private $rss_array=array();
        
        //コンストラクタ
        public function __construct(){}
        
        //RSS取得
        public function setUrl($rss){
            $this->rss_array[$rss['name']] = fetch_rss($rss['url']);

                if(isset($this->rss_array[$rss['name']]->channel['dc']['date'])){
                    $this->rss_array[$rss['name']]->channel['dc']['timestamp']=parse_w3cdtf($this->rss_array[$rss['name']]->channel['dc']['date']);
                }else{
                    $this->rss_array[$rss['name']]->channel['dc']['timestamp']='';
                }
            return true;
        }

        //RSS情報
        public function getRssChannel($rss){
            if($this->rss_array[$rss['name']]){
                return $this->rss_array[$rss['name']]->channel;
            }else{
                return false;
            }
        }
        
        //各記事の内容
        public function getAllItem($rss){
            if($this->rss_array[$rss['name']]){
                foreach($this->rss_array[$rss['name']]->items as $key=>$val){
                    $ret[$key]['title']            =$val['title'];
                    $ret[$key]['link']            =$val['link'];
                    $ret[$key]['summary']        =$val['summary'];
                    $ret[$key]['desc']            =$val['description'];
                    if(isset($val['date_timestamp'])){$ret[$key]['date_timestamp']=$val['date_timestamp'];}else{$ret[$key]['date_timestamp']='';}
                }
                return $ret;                
            }else{
                return false;
            }
        }

    #↓クラスのおわり
    }


rsslist.php
<?php
    $rsslist[0]=array();
    $rsslist[]=array('name'=>'弱小PHPerの憂鬱0.91','url'=>'http://yuubiseiharukana.blog.shinobi.jp/RSS/091/');
    $rsslist[]=array('name'=>'弱小PHPerの憂鬱1.0','url'=>'http://yuubiseiharukana.blog.shinobi.jp/RSS/100/');
    $rsslist[]=array('name'=>'弱小PHPerの憂鬱2.0','url'=>'http://yuubiseiharukana.blog.shinobi.jp/RSS/200/');
    $rsslist[]=array('name'=>'日経トレンディ','url'=>'http://trendy.nikkeibp.co.jp/rss/trendy.rdf');
    $rsslist[]=array('name'=>'ITMediaD+','url'=>'http://rss.itmedia.co.jp/rss/2.0/plusd.xml');
    $rsslist[]=array('name'=>'ITMediaNews','url'=>'http://rss.itmedia.co.jp/rss/2.0/news_bursts.xml');
    $rsslist[]=array('name'=>'CnetJapan','url'=>'http://feed.japan.cnet.com/rss/index.rdf');

index.php

<?php
    require_once('rsslist.php');
?>

<html xmlns="http://www.w3.org/1999/xhtml">

    <head>
    <META http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
    <title>RSS</title>
    <STYLE TYPE="text/css">
        <!--
        .title    {margin-bottom:5px;margin-top:10px;}
        .summary{width:90%;margin-left:10px;padding:5px;background-color:#faffff;border:1px solid;}
        -->
    </STYLE>
    <script type="text/javascript" src="./index.js"></script>
    </head>

    <body>
            <div id="rssSelect">
                <form name="rssSelectForm">
                    <select name="rssSelectOpt" id="rssSelectId" onChange="rssLoad();">
                        <option value="index">RSSを選択</option>
                        <?php
                            foreach($rsslist as $key=>$val){
                                if($key==0){continue;}
                                print('<option value="'.$key.'">'.$val['name'].'</option>');
                            }
                        ?>
                    </select>
                </form>
            </div>            
            <div id="rssPrint"></div>
    </body>
</html>


index.js

    //グローバル変数
    var xmlhttp;
    var oldquery;

    /*----------------------------------------------------------*/
    /* HTTPリクエスト作成関数 */
    function rssLoad(){        
        
        var rssSelectOpt=document.rssSelectForm.rssSelectOpt.value;
        var rssPrint=document.getElementById("rssPrint");

        //0番目なら終了
        if(rssSelectOpt=="index"){rssPrint.style.display = "none";return;}
        //既にXMLHttpRequestがあったら破棄
        if (xmlhttp){xmlhttp.abort();}

        xmlhttp = createXmlHttpRequest();

        //検索文字列が空なら何も出力しない
        if (rssSelectOpt==""){
            rssPrint.style.display = "none";

        //検索文字が更新されたら
        } else if (oldquery != rssSelectOpt) {
            //クエリを作成
            xmlhttp.open("GET", "rssreader.php?key="+rssSelectOpt, true);
            //クエリの返答が帰ってきたら表示を更新する無名関数
            xmlhttp.onreadystatechange = function() {
                //正しいレスポンスが来た
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                    //返り値が入っていれば
                    if(xmlhttp.responseText){
                        rssPrint.style.display = "block";
                        rssPrint.innerHTML = xmlhttp.responseText;
                    //正しく終了していなければ
                    }else{
                        rssPrint.style.display = "block";
                        rssPrint.innerHTML = "ファイルが見つかりません"+xmlhttp.status;
                    }
                }
            }
                //クエリ送信
            xmlhttp.send(null);
        }
            //検索文字のチェック用
        oldquery = query;
    }

    /*==========================================================*/
    //サブルーチン

        /*----------------------------------------------------------*/
        /* HTTPリクエスト作成関数 */
        function createXmlHttpRequest() {
            var xmlhttp = false;
                if( window.XMLHttpRequest) {
                    xmlhttp = new XMLHttpRequest();
                } else if(window.ActiveXObject) {
                    try {
                        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
                    } catch(e) {
                        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                    }
                }
            return xmlhttp;
        }



RSSの取得対象を、ひとつの共通の設定ファイルから動的に呼び出せるようにしました。
取得対象を変更したいときはrsslist.phpを書き換えるだけで済みます。

rssreader.phpおよびrssreader.class.phpは、summaryだっつうてるのに本文全文を突っ込んできたりする行儀の悪いRSSを適当に打ち切るためにmb_substrを追加したり、$rsslistを外部化したり、最大10件で打ち切りにしたりしている他は、前回とほぼ同じです。

そしてフロント側の表示のためにindex.phpおよびindex.jsを追加しました。
単にテキストを取得して見栄えを整えているだけなのでAjaxの活用とかそういうのからは程遠いですが、なんとなくそれなりのものはできたのではないか感はあります。

RSS0.91と1.00と2.00何れのバージョンに対しても、MagpieRSSが差異を吸収してくれるので、ほぼ同じように扱うことが出来ました。

これ以上いじくっても日付順に並べてとかそういう細々した話にしかなりそうにないので、RSSについてはこんなところで終了ということで。

PR


2008/08/21 19:28 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-19:CAPTCHA認証 | HOME | PHP1-17:RSSリーダを作ってみる>>
忍者ブログ[PR]