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; }
Вот так вот, в общих чертах, всё и получается. По крайней мере, на этом сайте :)
Адрес электронной почты нигде не отображается, необходим только для обратной связи.
Веб-сайт вводите в формате http://example.org, при желании, конечно.