Zend Framework → Использование Zend_Feed
Не претендую на лучшее решение, это скорее первый опыт общения с Zend_Feed вообще, но написать что-то надо. Хотя бы ради ссылки на спецификации RSS 2.0
Ну а теперь, собственно, реализация RSS-ленты. Поскольку я стараюсь придерживаться паттернов проектирования MVC, то запрос обрабатывается контроллером, а данные для ленты формируются в модели. Вид (View) нам не нужен, как таковой, потому в контроллере мы его выключаем.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php
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();
}
|
А теперь получение массива для ленты внутри модели. Заполнено только минимальное количество обязательных (и опциональных) полей, остальные пока не трогаем
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?php
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;
}
|
Вот так вот, в общих чертах, всё и получается. По крайней мере, на этом сайте :)
Комментарии