0

AJAX を利用した RSS フィードの作成に取り組んでいます。これは、Google リーダーに似た単一のペインで、左側にフィードのリスト、右側にフィード コンテンツが表示されます。いずれかのフィードをクリックすると、 ajax コマンド (jquery の$.ajax()) がトリガーされ、RSSFeed クラスの publicgetFeed($feed_url)関数 (次に SimplePie を使用して必要なデータを取得します) がトリガーされます。

これは以下を使用します。

  • AJAX 呼び出しを処理し、ブラウザーを更新するための jQuery 1.9.1
  • レイアウト/正規化/スタイリング用の Twitter Bootstrap 2.3.0
  • RSS フィード自体を処理するための SimplePie 1.3.1。

ページが読み込まgetFeed($feed_url);れると、データを正しく取得するために を使用しています (これは機能します)。

<div class="row">
    <div class="span7" id="feedBody">
        <?php
           $RSSFeed->getFeed("http://rss1.smashingmagazine.com/feed/");
        ?>
    </div>
</div>

これは期待どおりに機能します。次に、フィード アイテムをクリックすると、次の AJAX コマンドがトリガーされます (デバッグ目的でアラートが表示されます)。

"use strict";

//Update the feed
$("a.feedName").click(function(e) {
    e.preventDefault();
    var feedURL;
    feedURL = $(this).attr("href");
    $.ajax('model/RSSFeed.php', {
        data: {url: feedURL},
        beforeSend: function() {
            $("#feedBody").html("<div class=\"alert alert-info span7\"><button type=\"button\" class=\"close\" data-dismiss=\"alert\">&times;</button><strong>Loading Feed&hellip;</strong>");
        },
        cache: false,
        success: function(result) {
            $("#feedBody").html(result);
            alert(result);
        },
        error: function(result) {
            $("#feedBody").hide();
            alert("Error!");
        }
    });
});

次にmodel/RSSFeed.php、このリクエストを確認し、次を使用して新しいコンテンツの取得をトリガーする必要があります。

if (isset($_GET['url'])) {
    $RSS = new RSSFeed();
    $RSS->getFeed($_GET['url']);
} else if(isset($_POST['url'])) {
    $RSS = new RSSFeed();
    $RSS->getFeed($_POST['url']);
}

これは、次のように RSSFeed クラスを呼び出します。

class RSSFeed {
    //Get the feed at the $feed_url and echo it out to the browser for the ajax request to display
    public function getFeed($feed_url) {
        $feed = new SimplePie($feed_url);
        $feed->init();
        $feed->handle_content_type();
        foreach ($feed->get_items() as $item) {
            $output = "<article>"
            . "<h3><a href=\"" . $item->get_permalink() . "\" title=\"" . $item->get_title() . "\" class=\"articleTitle\">" . $item->get_title() . "</a></h3><p>";

            if ($category = $item->get_category()) {
                $output .= $category->get_label() . " ";
            }

            $output .= $item->get_date();


            $output .= "</p><p>";

            $output .= shorten($item->get_description(), 600) . "<br /><br />" . "<a href=\"" . $item->get_permalink() . "\" title=\"Read More\" class=\"btn btn-info\">Read More</a>";

            $output .= "</p>";

            echo $output;
        }//end foreach($feed->get_items() as $item)
    }//end getFeed($feed_url)

    //Begin setting up to allow Google Reader takeout files to be imported into the database.
    public function importRSSFeeds($xmlFile, $DB) {
        $xml = simplexml_load_file($xmlFile);
        foreach($xml as $feed) {
            foreach($feed->outline as $thisFeed) {
                if($thisFeed->outline['type'] == "rss") {
                        $DB->addFeedToDatabase($thisFeed['text'], $thisFeed['title'], "folder", "", "");
                    foreach($thisFeed->outline as $feeds) {
                        $DB->addFeedToDatabase($feeds['text'], $feeds['title'], $feeds['type'], $feeds['xmlUrl'], $feeds['htmlUrl']);
                    }
                    echo "<br /><br />";
                }
            }
        }
    } //end importRSSFeeds($xmlFile)
    //Get the feeds from the database and display them on the left for the user.
    public function getFeedList() {
        $lastType = "";
        $DB = new Database();
        $result = $DB->returnFeedList();
        foreach($result as $individualFeed) {
                if($individualFeed['type'] == "folder") {
                    if ($lastType == "rss") {
                        echo "</ul></div>";
                    }
                    echo "<li><a href=\"#\" data-toggle=\"collapse\" data-target=\"#" . str_replace(" ", "", $individualFeed['title']) ."\"><i class=\"icon-folder-close\"></i>" . $individualFeed['title'] . "</a></li>";
                    echo "<div class=\"collapse in\" id=\"" . str_replace(" ", "", $individualFeed['title']) . "\">";
                    echo "<ul class=\"nav nav-list\">";
                } else if($individualFeed['type'] == "rss") {
                    echo "<li><a href=\"" . $individualFeed['xmlUrl'] . "\" class=\"feedName\">" . $individualFeed['title'] . "</a></li>";
                }
                $lastType = $individualFeed['type'];
            }
        $DB->closeDatabaseConnection();
    }
}//end class RSSFeed

JavaScriptアラートをチェックすると、success:ケースがトリガーされますが、エコーされたデータは返されません。SimplePie クラスがechoAJAX 経由で正しいデータをid="feedBody"div に返すようにするには、どの部分が欠けていますか? 私は何が欠けていますか?

編集: Firebug は、XHR に関して次のように述べています。

//Response Headers
Status: 200 OK
Connection  Keep-Alive
Content-Length  0
Content-Type    text/html
Date    Thu, 11 Apr 2013 19:54:33 GMT
Keep-Alive  timeout=5, max=100
Server  Apache
X-Powered-By    PHP/5.4.4

//Request Headers
Accept  text/html, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Cookie  __utma=111872281.446718044.1365710024.1365710024.1365710024.1; __utmb=111872281.2.10.1365710024; __utmc=111872281; __utmz=111872281.1365710024.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)
DNT 1
Host    localhost:8888
Referer http://localhost:8888/Charcoal-Bootstrap_RSSReader/
User-Agent  Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:20.0) Gecko/20100101 Firefox/20.0
X-Requested-With    XMLHttpRequest

パラメータが正しく渡されているように見えます (ほんの一例): url http://iphone.keyvisuals.com/feed/

完全な index.php: http://pastebin.com/UJiFuBvG

完全な RSSFeed.php: http://pastebin.com/CGU2nQHB

完全な main.js (AJAX を処理): http://pastebin.com/1pPQuPUx

ありがとう!

4

1 に答える 1

1

答えは、アラート/例外を実際にプッシュしてデバッグしたときに得られたもので、simplepie ファイルを正しくロードしていないように見えるため、致命的なエラーが発生して終了します。ごめんなさい!でもブラッドありがとう

于 2013-04-12T11:54:30.490 に答える