Мар 24

В 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-канал в шапку страницы, я писал в прошлом посте.

Share

Автор: Кирилл Павлюков \\ Метки: ,


3 коммент. к “Как создать RSS-канал в CakePHP 1.2”

  1. 1. CakePHP пишет:

    В статье не отображается ни одна строчка кода.

  2. 2. Кирилл Павлюков пишет:

    Какая-то проблема с плагином, который подсвечивает синтаксис… Буду разбираться. Спасибо за коммент!

  3. 3. Cakebaker пишет:

    Тайтл в канале внезапно порадовал :-)

Оставьте комментарий или два