RSSy w CakePHP
CakePHP posiada wiele ciekawych mechanizmów ułatwiających i przyśpieszających prace programiście. Wśród nich można znaleźć narzędzia do budowy kanałów RSS.
Pierwszą rzeczą jaką warto zrobić jest dodanie
Router::parseExtensions();
w pliku config/routes.php. Dzięki temu będziemy mogli wywołać np. akcje items/index jako zwykły widok oraz items/index.rss jako kanał RSS używając tego samego kontrolera.
W samym kontrolerze trzeba dodać helper Rss oraz komponent RequestHandler. Drugą rzeczą jaką warto zrobić jest ustawienie tytułu oraz opisu kanału RSS. Tytuł co prawda ustawiany jest automatycznie z $this->pageTitle, ale tag description trzeba już samemu ustawić. Może to wyglądać np. tak:
if ($this->RequestHandler->isRss())
{
$channel = array (
'title' => __('Rss title', true),
'description' => __('Rss description', true)
);
$this->set('channel', $channel);
}
$this->set('items', $this->paginate());
$this->pageTitle=__('Items title', true);
Komponent RequestHandler rozpoznaje czy dany request jest zapytaniem o kanał RSS i jeśli tak, to pobiera z słownika tytuł oraz opis dla tego kanału.
Poniżej znajduje się przykładowy kod dla akcji index, czyli pobranie danych z pomocą paginatora. Dane przekazywane do widoku dla kanału RSS mogą być takie same jak dla zwykłego widoku.
Kolejnym krokiem jest przygotowanie widoku. Dla kontrolera items i akcji index trzeba utworzyć plik views/items/rss/index.ctp. Trzeba w nim zaimplementować funkcję, która przetworzy każdy rekord pobranych danych do tablicy jaką przekazujemy do helpera Rss. W tym celu tworzymy jakąś funkcję np. transform z parametrem, którym będzie jeden rekord danych, a następnie za pomocą helpera Rss wyrzucamy wszystkie dane. Robimy to funkcją $rss->items(), która jako pierwszy parametr przyjmuje tablicę z danymi, a jako drugi nazwę funkcji przetwarzającej te dane.
function transform($item) {
return array(
'title' => $item['Item']['name'],
'link' => array('controller'=>'items', 'action'=>'view', $item['Item']['id']),
'guid' => $item['Item']['id'],
'description' => $item['Item']['description'],
'pubDate' => $item['Item']['created']
);
}
echo $rss->items($items, 'transform');
Tak więc w prosty sposób można szybko wyświetlić wszystkie dane i po niewielkich zmianach, przenieść ten widok do każdej innej akcji.
Zaletą tego rozwiązania jest to, że w kanale RSS jest pokazywane dokładnie to samo co w akcji index. To znaczy że jeśli używamy paginatora i wyświetlamy np. items/index/page:10 to możemy tą samą stronę zobaczyć w kanale RSS. Żeby to ułatwić użytkownikowi, można w tej akcji przekazać jakąś zmienną do widoku np. $isRSS ustawioną na true, a w domyślnym layoucie (views/layouts/default.ctp) w sekcji head dopisać następujący kod:
if ($isRSS):
?>
<link rel="alternate" type="application/rss+xml"
href="http://<?php echo $_SERVER["HTTP_HOST"].$this->here; ?>.rss"
title="<?php __('Rss description');?>" />
<?php
endif;
Jeśli tylko ta akcja przekazuje tą zmienną to oczywiście trzeba jeszcze sprawdzić czy została ona ustawiona. Dodanie tego taga powoduje, że w przeglądarka otrzyma informacje, że dla danej strony istnieje kanał RSS i powinna pojawić się ikonka obok adresu URL w przeglądarce. Po jej kliknięciu użytkownik oczywiście zobaczy daną stronę w czytniku.
wtorek, 31 Marzec 2009

Facebook
GoldenLine
LinkedIn