Использование нескольких каналов в simplepie с codeigniter - PullRequest
3 голосов
/ 26 июля 2010

Я пытаюсь заставить simplepie перебирать несколько RSS-каналов с помощью codeigniter, но я могу получить его только для отображения элементов канала из последнего канала в массиве.

Я думаю, что это связано с циклом foreach в функции _get_feed, но все, что я пробовал, не смогло это исправить.

В моем контроллере у меня есть это

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 в контроллере с точки зрения передового опыта или будет лучше в модели при получении данных?

1 Ответ

3 голосов
/ 26 июля 2010

Насколько я знаю, ваш массив $ data не был глобальным и поэтому имел только область видимости в функции индекса.

Что касается соглашений, я использую только модели для соединений с базой данных, но я не думаю, что есть какие-то жесткие и быстрые правила.

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;
}

}
...