Как правильно создать Zend Feed? - PullRequest
4 голосов
/ 18 марта 2009

Я успешно создал простой канал RSS, но записи возвращаются как непрочитанные и обновленные, а записи, удаленные с клиента, появляются снова каждый раз, когда я запрашиваю почту для обновления канала.

Что я делаю не так?

Я использую эту простую функцию для создания RSS-канала:

public static function getFeed($db)
{
    $title = 'Latest feeds';
    $feedUri = '/rss/';

    //link from which feed is available
    $link = 'http://' . $_SERVER['HTTP_HOST'] . $feedUri;

    //create array according to structure defined in Zend_Feed documentation
    $feedArr = array('title' => $title,
                     'link'  => $link,
                     'description' => $title,
                     'language' => 'en-us',
                     'charset' => 'utf-8',
                   //'published' => 1237281011,
                     'generator' => 'Zend Framework Zend_Feed',
                     'entries' => array()
              );
    $itemObjs = array();
    $select = $db->select('id')->from('things')
                               ->order('createddate desc')
                               ->limit(10);
    $results = $db->fetchAll($select->__toString());
    $count = count($results);
    for($i=0;$i<$count;$i++) {
        $itemObjs[] = SiteUtil::getItemObjectInstance($db, $results[$i]['id']);
    }
    $count = count($itemObjs);
    for($i=0;$i<$count;$i++) {
        $obj = & $itemObjs[$i];
        $feedArr['entries'][] = array('title' => $obj->getSummary(),
                                      'link'    => 'http://' . $_SERVER['HTTP_HOST'] . $obj->getDetailUri(),
                                      'description' => $obj->description,
                                      'publishdate' => $obj->publishedDate,
                                      'guid' => 'http://' . $_SERVER['HTTP_HOST'] . $obj->getDetailUri()
                                      );
    }
    $feed = Zend_Feed::importArray($feedArr, 'rss');
    return $feed;
}

Действие в классе контроллера:

public function rssAction()
{
    $feed = FeedUtil::getFeed($this->db);
    $feed->send();
}

Итак, чтобы получить доступ к каналу, я указываю клиенту: http://mysite.com/rss

Я использую rss-клиент mac mail для тестирования. Фид загружается просто отлично, показывая все 5 элементов, которые у меня есть в базе данных для целей тестирования. Проблемы заключаются в следующем:

1) Если я отмечу один или несколько элементов как «прочитанные», а затем сообщу почте об обновлении канала, он снова извлекает все элементы, как будто я их никогда не загружал.

2) Если я удаляю один или несколько элементов, они возвращаются снова, непрочитанные, снова, как будто это был первый раз, когда я подписался на канал.

3) Ленты всегда помечены как обновленные. Это должно быть дело?

Это как-то связано с параметрами, которые я устанавливаю, я что-то опускаю, или решение может быть чем-то более тонким, например, установка заголовков содержимого HTTP (например, «304 Not Modified»)?

Насколько я понимаю, rss заключается в том, что после того, как элемент был помечен как прочитанный или удален с клиента, он никогда не должен возвращаться, как и я.

Просто отметим, что параметры 'link' и 'guid' всегда уникальны, и я попытался поэкспериментировать с атрибутами 'ключами' и 'publishdate' (оба необязательных), но получить один и тот же результат. Приведенный выше код является упрощенной версией того, что у меня есть, показывая только соответствующие биты, и, наконец, да, я прочитал спецификацию rss .

Заранее спасибо за любую помощь, предлагаемую здесь, я буду рад прояснить любой вопрос.

1 Ответ

4 голосов
/ 18 марта 2009

Согласно Zend Framework Doc, вы должны использовать параметр lastUpdate , чтобы установить дату последнего изменения записи.

 'entries'     => array(
                         array(
                               [...]
                               'lastUpdate'   => 'timestamp of the publication date', // optional
                               [...]

Итак опубликовано для фида и lastUpdate для записей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...