3

我试图让 simplepie 使用 codeigniter 循环遍历几个 rss 提要,但我只能让它显示来自数组中最后一个提要的提要项目。

我认为这与 _get_feed 函数中的 foreach 循环有关,但我尝试过的一切都未能修复它。

在我的控制器中,我有这个

class Main extends Controller{

function index()
{
    $this->load->library( 'Simplepie' );

    $feed_urls = array
    (
        'http://feeds.feedburner.com/SputnikmusicNews',
        'http://feeds2.feedburner.com/nmecom/rss/newsxml',
    );

    foreach ($feed_urls as $feed_url)
    {
        $data = $this->_get_feed($feed_url);
    }

    $data['main_content'] = 'main_view';
    $this->load->view('includes/template', $data);
}

function _get_feed($url)
{
    $feed = new SimplePie();
    $feed->set_feed_url($url);
    $feed->init();

    $count = 0;

    foreach($feed->get_items() as $item)
    {
        $data['feed'][$count]['title'] = $item->get_title();
        $data['feed'][$count]['permalink'] = $item->get_permalink();
        $count ++;
    }       
    return $data;
}

}

然后在我看来我有这个

<?php foreach($feed as $item) : ?>
    <br />
    <a href="<?php echo $item['permalink']; ?>"><?php echo $item['title']; ?  ></a>
<?php endforeach; ?>

我知道可以给 simplepie 一个提要数组以使用 set_feed_url 函数解析,但我不想这样做,因为它将所有提要项目混合在一起。

我还想知道在最佳实践方面将 _get_feed 函数放置在控制器中是否可以,或者在模型中获取数据时是否会更好?

4

1 回答 1

3

据我所知,您的 $data 数组不是全局的,因此仅在 index 函数中具有作用域。

就约定而言,我只将模型用于数据库连接,但我认为没有任何硬性规定。

class Main extends Controller{

function index()
{
    $this->load->library( 'Simplepie' );

    $feed_urls = array
    (
        'http://feeds.feedburner.com/SputnikmusicNews',
        'http://feeds2.feedburner.com/nmecom/rss/newsxml',
    );

    foreach ($feed_urls as $feed_url)
    {
        $data['feed'][] = $this->_get_feed($feed_url);
    }

    $data['main_content'] = 'main_view';
    $this->load->view('includes/template', $data);
}

function _get_feed($url)
{
    $feed = new SimplePie();
    $feed->set_feed_url($url);
    $feed->init();

    $count = 0;

    foreach($feed->get_items() as $item)
    {
        $return[$count]['title'] = $item->get_title();
        $return[$count]['permalink'] = $item->get_permalink();
        $count ++;
    }       
    return $return;
}

}

这会给你:

$data['feed'][0] = details from 1st url
$data['feed'][1] = details from 2nd url

因此,要访问第 1 个提要中第 1 篇文章的标题:

$data['feed'][0][0]['title']
//or within the view
$feed[0][0]['title'];

如果您想将 URL 合并在一起,您可以执行以下操作:

class Main extends Controller{

function index()
{
    $this->load->library( 'Simplepie' );

    $feed_urls = array
    (
        'http://feeds.feedburner.com/SputnikmusicNews',
        'http://feeds2.feedburner.com/nmecom/rss/newsxml',
    );

    foreach ($feed_urls as $feed_url)
    {
        $feed_info[] = $this->_get_feed($feed_url);
        $data['feed'][] = $this->_get_feed($feed_url);
    }

    foreach ($feed_info as $feed)
    {
        foreach($feed as $feed_item)
        {
            $data['feed'][] = array( 'title' => $feed_item->get_title(), 'permalink' => $feed_item->get_permalink() );
        }
    }

    $data['main_content'] = 'main_view';
    $this->load->view('includes/template', $data);
}

function _get_feed($url)
{
    $feed = new SimplePie();
    $feed->set_feed_url($url);
    $feed->init();

    return $feed;
}

}
于 2010-07-25T21:19:45.897 回答