Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Symfony] RSS
Forum PHP.pl > Forum > PHP > Frameworki
Foxx
Mam problem ze stworzeniem RSS dla mojej strony w Symfony.
Widzę dwie metody jakimi można to wykonać, ale obie są problematyczne:

1. Stworzyć moduł 'rss', w akcji pobierać dane, np. newsy z bazy i przekazywać do szablonu. Szablon jako plik o strukturze xml'a rss. Problem z takim rozwiązaniem polega na tym, że szablon dostaje jeszcze m.in. nagłówki od sf więc nie będzie nigdy poprawnym dokumentem xml. Być może da się to jakoś obejść, np. jakieś ustawienie sf być może zwraca "goły" szablon - nie znalazłem tego.

2. Mogę na chama stworzyć plik rss.php w katalogu web/ obok index.php i tam będzie kierował link "rss" ze strony.
Problem z tym rozwiązaniem jest taki, że nie będą tam dostępne żadne helpery sf i połączenie z bazą będę musiał nawiąząć w tym pliku osobno, podobnie jak obsługę zapytań sql, co brzmi bardzo słabo.

Jestem pewien że moje problemy i moje propozycje rozwiązań wynikają z tego, że nie wiem o jakiejś jednej bardzo ważnej rzeczy i będę wdzięczny za nakierowanie mnie na prawidłowe tory smile.gif
destroyerr
Przecież w symfony można zmienić nagłówki. Sposoby są różne. Możesz w zmienić w view.yml. Możesz też zmieniać w akcji w filtrze gdzie chcesz (za pomocą obiektu klasy sfWebResponse). Wszystko jest w dokumentacji.
Nie chce Ci się poszukać samemu? Wolisz czekać?

Żeby nie wyszło, że jestem złośliwy to może ten plugin Ci się przyda.
phpion
To ja będę nieco milszy i naprowadzę kolegę. W view.yml możesz zdefiniować osobny layout dla danej akcji:
Kod
akcjaSuccess:
  layout: layout_simple

Tworzysz plik apps/frontend/templates/layout_simple.php i już masz dane wpakowane w osobny layout. O nagłówkach to sobie sam poszukaj tongue.gif
Foxx
Dzięki, chyba o ten plugin mi chodziło.
Cytat
Wszystko jest w dokumentacji. Nie chce Ci się poszukać samemu? Wolisz czekać?

Nie popadajmy w paranoję, że nie mogę spytać o to na forum. Wiadomo, że każda wiadomość jest
też "gdzieś indziej". Poza tym zauważ, że miałem świadomość tego, że można modyfikować sposób
wyświetlania layoutu a istotą moich wątpliwości było raczej to, czy jest to poprawne postępowanie dla
zrobienia rss. Linki do plugina świadczą, że być może nie do końca (chyba że on działa tak samo smile.gif )

Dalsza część problemów z tworzeniem kanału rss.
Mój plik szablonu wygląda tak:
  1. ini_set("short_open_tag",0);
  2. header('Content-type: application/xml; charset="utf-8"');
  3. echo '<?xml version="1.0" encoding="utf-8"?>
  4. <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  5. <channel>
  6. <title>a</title>
  7. <atom:link href="http://www.domena.pl/rss/read" rel="self" type="application/rss+xml" />
  8. <link>http://www.domena.pl/rss.xml</link>
  9. <description>a</description>
  10. <language>pl</language>
  11. <copyright>a</copyright>
  12. <item>
  13.  <title>temat</title>
  14.  <link>http://www.domena.pl/news/read/id/3</link>
  15.  <pubDate>data</pubDate>
  16.  <description><![CDATA[opis]]></description>
  17.  <category>kategoria</category>
  18.  <author>mail</author>
  19. </item>
  20. </channel>
  21. </rss>';


Jeżeli wrzucę ten plik obok index.php w katalogu web/ i wywołam z pominięciem sf (www.domena.pl/plik.php) to wszystko jest w porządku a opera pyta mnie czy zasubskrybować kanał.
Natomiast jeżeli ten plik wywołuję jako szablon, opera nie reaguje.
Wyłączyłem layout dla tego modułu, nie ma też żadnych nagłówków. Źródło strony jako modułu nie różni się od tego jako osobny skrypt - drugi działa, ten pierwszy nie.
Jaki może być tego powód? Będę jak zwykle wdzięczny za pomoc.

Zauważyłem pewną różnicę między tymi dwoma przypadkami: w pliku wyświetlanym jako moduł treść kanału jest o parę milimetrów odsunięta od wewnętrznych krawędzi okna przeglądarki a gdy plik wyświetlam poza sf to tego odstępu nie ma. Czy to możliwe że sf podpina jakieś style? Przecież wyłączyłem layout dla modułu... skąd może brać się ta wizualna różnica?
Whisller
@Foox
Ale nie musisz tworzyć osobnych plików poza strukturą symfony aby mieć RSS. Pozwól że pokaże Ci bardzo prosty przykład.
W przykładzie wykorzystana jest biblioteka Feed z paczki ezComponents. Ale nic nie stoi na przeszkodzie abyś użył czegoś innego.

1.
Tworzymy nowy moduł, np. Rss

2. Tworzymy akcję "AllAction.class.php" która to będzie odpowiedzialna za wyświetlenie RSS'a dla całego serwisu.

  1. <?php
  2. class AllAction extends sfAction
  3. {
  4.  public function execute( $request )
  5.  {
  6.    # Tworzymy RSS i ustawiamy dla niego podstawowe argumenty
  7.    $feed = new ezcFeed();
  8.    $feed->title       = 'Our feed';
  9.    $feed->description = 'It is our brand new feed';
  10.    $feed->published   = date('Y-m-d', time());
  11.    
  12.    $author = $feed->add('author');
  13.    $author->name  = 'You';
  14.    $author->email = 'mail@example.com';
  15.    
  16.    $link = $feed->add('link');
  17.    $link->href = 'http://example.com';
  18.    
  19.    # Dodajemy wpis do RSS
  20.    $item = $feed->add('item');
  21.    $item->title       = 'First item from atom';
  22.    $item->description = 'Some description';
  23.    $item->published   = date('Y-m-d', time());
  24.    
  25.    $author = $item->add( 'author' );
  26.    $author->name = 'You';
  27.    $author->email = 'mail@example.com';
  28.    
  29.    $link = $item->add( 'link' );
  30.    $link->href = 'http://example.com/something';
  31.    
  32.    $this->getResponse()->setHttpHeader('Content-Type', 'application/xml; charset=utf-8');
  33.    
  34.    $this->getResponse()->setContent( $feed->generate('rss2') );
  35.    return sfView::NONE;
  36.  }
  37. }
  38. ?>


Oczywiście dane do kanału RSS możesz pobrać z bazy danych, pliku etc. Ale osobiście radzę napisanie prostego taska który będzie raz dziennie generował plik rss.xml który będziemy już w akcji (AllAction) tylko zczytywać i wyświetlać. Dzięki temu nasz serwer jak i baza danych nie będzie obciążona ciągłym pobieraniem jak i generowaniem RSS'a.
Foxx
Dzięki.
Rzeczywiście, z pomocą plugina było łatwiej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.