morontt.info

Zend Framework → Использование Zend_Feed

Не претендую на лучшее решение, это скорее первый опыт общения с Zend_Feed вообще, но написать что-то надо. Хотя бы ради ссылки на спецификации RSS 2.0

Ну а теперь, собственно, реализация RSS-ленты. Поскольку я стараюсь придерживаться паттернов проектирования MVC, то запрос обрабатывается контроллером, а данные для ленты формируются в модели. Вид (View) нам не нужен, как таковой, потому в контроллере мы его выключаем.

public function feedAction()
{
    //определяем тип ленты, RSS или Atom
    $feedType = $this->_getParam('feed');

    //выключаем View и Layout
    $this->_helper->layout->disableLayout();
    $this->_helper->viewRenderer->setNoRender(true);

    $topics = new Application_Model_DbTable_Topics();

    //запрашиваем данные ленты из модели
    $feedArray = $topics->getFeedData($feedType);

    //Импортируем ленту с помощью Zend_Feed и выводим её
    $feed = Zend_Feed::importArray($feedArray, $feedType);
    $feed->send();
}

А теперь получение массива для ленты внутри модели. Заполнено только минимальное количество обязательных (и опциональных) полей, остальные пока не трогаем

public function getFeedData($feedType)
{	
    //Получаем базовый URL и хост
    $request = Zend_Controller_Front::getInstance()->getRequest();
    $baseUrl = $request->getScheme()
             . '://'
             . $request->getHttpHost() . '/';
    $host = $request->getHttpHost();
        
    //Готовим массив, содержащий ленту
    $result = array('title'       => $host,
                    'link'        => $baseUrl,
                    'description' => $host . ' - последние записи',
                    'language'    => 'ru-ru',
                    'charset'     => 'utf-8',
                    'generator'   => 'Zend Framework Generator',
                    );
        
    //выбираем последние статьи блога, если они не скрытые
    $select = $this->select()
                   ->where('hide <> 1')
                   ->order('time_created DESC')
                   ->limit(25);
        
    $topics = $this->fetchAll($select);
        
    $lastDate = '';
        
    //Массив отдельных записей ленты
    $entries = array();
    foreach ($topics as $topic) {
    //В таком уж виде в базе лежит дата и время, приходится расшифровывать
    //в нужный формат (метка времени UNIX)
    list($year, $month, $day, $hour, $min, $sec)
    = sscanf($topic->time_created, "%d-%d-%d %d:%d:%d");
    $timestamp = mktime($hour, $min, $sec, $month, $day, $year);
    
    //время самой свежей публикации        
    if (empty($lastDate)) $lastDate = $timestamp;
            
    $item = array(
                'title'       => $topic->title,
                'link'        => $baseUrl . 'topic/' . $topic->post_id,
                'description' => $topic->text_post,
                'lastUpdate'  => $timestamp,
                'comments'    => $baseUrl . 'topic/' . $topic->post_id,
                'guid'        => 'topic_' . $topic->post_id);
    $entries[] = $item;
    }
        
    $result['entries'] = $entries;
    $result['lastUpdate'] = $lastDate;
		
    return $result;
}

Вот так вот, в общих чертах, всё и получается. По крайней мере, на этом сайте :)

g-plus-icon
comments powered by Disqus
Учтите, что комментарии добавляются только при включённом JavaScript в браузере. В ином случае информация хоть и не пропадёт бесследно, но будет отправлена в спам и вряд ли хоть кто-нибудь её увидит.
name
avatar
http://www.electrictoolbox.com/php-date-constants/
Ответить
1 комментарий Написать что-нибудь
Поля, помеченные asterisk, обязательны для заполнения.
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Веб-сайт вводите в формате http://example.org, при желании, конечно.