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

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

Комментарии

avatar
name
avatar
http://www.electrictoolbox.com/php-date-constants/
ответить
1 комментарий Написать что-нибудь
Адрес электронной почты нигде не отображается, необходим только для обратной связи.