31
Marzec
wtorek, 31 Marzec 2009

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 
Tagi: ,
Kategoria: CakePHP
Możesz śledzić ten wpis przez RSS 2.0 lub dodać komentarz.
Zostaw komentarz

Home Home O mnie O mnie Efekty
JavaScript, jQuery, AJAX
Efekty
Inspiracje
Ciekawe strony WWW
Inspiracje
Programowanie
CakePHP, PHP, MySQL
Programowanie
SEO
Wyszukiwarki
SEO
Web Building
HTML i CSS
Web Building
Projekty Linki Kontakt Kontakt