В CakePHP RSS-каналы создаются не просто, а очень просто: нужно только отредактировать 2 файла и создать еще один.
Как это сделать – читайте ниже.
Если вы до сих пор не знаете, что такое RSS и для чего этот формат создан, прочитайте эту статью из Википедии.
А по этому адресу вы можете найти полную спецификацию формата RSS на русском языке.
Итак, первым делом нужно добавить строчку
1 | Configure::write('Routing.rss', 'rss'); |
в файл app\config\core.php.
Грубо говоря, она предписывает обрабатывать особым образом запросы к файлам с расширением .rss. Вернее сказать, это не запросы к файлам, а просто еще один маршрут Route. Этот маршрут сработает, когда приложение получит примерно такой запрос: http://mysite.com/news/index.rss. По правилам маршрута будет вызван метод index контроллера News, но также будет установлен параметр, который сообщает контроллеру, что клиент запросил информацию в виде потока RSS.
Теперь нужно слегка изменить метод index. Изначально в моем приложении он выглядел так:
1 2 3 4 5 6 7 | function index() { $this->News->recursive = 1; $this->paginate = array( 'limit' => 10 ); $this->set('news', $this->paginate()); } |
После редактирования этот метод должен иметь такой вид (для наглядности я снабдил код своими комментариями):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function index() { $this->News->recursive = 1; $this->paginate = array( 'limit' => 10 ); // Проверим, запрашивает ли клиент RSS-поток if($this->RequestHandler->isRss()){ // если да, передадим в скрипт отображения (View) параметры канала $this->set('channel', array('title' => 'Черновецкому - НЕТ', 'description' => 'Статьи')); // и собственно выборку статей $this->set('news', $this->News->findAll(null, null, null, 10, 1)); } else { $this->set('news', $this->paginate()); } } |
И теперь создадим скрипт отображения для RSS:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php // в качестве первого аргумента передается массив новостей, // а в качестве второго - имя функции-обработчика echo $rss->items($news, 'transformRSS'); function transformRSS($data) { $result = array( 'title' => $data['News']['title'], 'link' => '/news/view/'.$data['News']['id'], 'guid' => '/news/view/'.$data['News']['id'], 'description' => $data['News']['description'], 'author' => $data['User']['name'], 'category' => $data['Category']['name'], 'comments' => array('url' => '/news/view/' . $data['News']['id'] . '#comments'), 'pubDate' => $data['News']['created_at'] ); if (!empty($data['News']['image'])) { $result['enclosure']['url'] = $data['News']['image']; $result['enclosure']['length'] = filesize(WWW_ROOT . $data['News']['image']); $result['enclosure']['type'] = 'image/jpeg'; } return $result; } |
Сохранить его следует в app\views\news\rss\index.ctp
Вот и все. Должно работать
ЗЫ. Как добавить ссылку на RSS-канал в шапку страницы, я писал в прошлом посте.

апреля 5, 2009 в 7:25
В статье не отображается ни одна строчка кода.
апреля 21, 2009 в 14:55
Какая-то проблема с плагином, который подсвечивает синтаксис… Буду разбираться. Спасибо за коммент!
сентября 13, 2009 в 1:32
Тайтл в канале внезапно порадовал