Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [Symfony] RSS
Foxx
post
Post #1





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
kwiateusz
post
Post #2


Admin Techniczny


Grupa: Administratorzy
Postów: 2 071
Pomógł: 93
Dołączył: 5.07.2005
Skąd: Olsztyn




http://www.symfony-project.org/plugins/sfFeed2Plugin
Go to the top of the page
+Quote Post
destroyerr
post
Post #3





Grupa: Zarejestrowani
Postów: 879
Pomógł: 189
Dołączył: 14.06.2006
Skąd: Bytom

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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 (IMG:http://forum.php.pl/style_emoticons/default/tongue.gif)
Go to the top of the page
+Quote Post
Foxx
post
Post #5





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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?

Ten post edytował Foxx 9.10.2008, 15:58:41
Go to the top of the page
+Quote Post
Whisller
post
Post #6





Grupa: Zarejestrowani
Postów: 77
Pomógł: 5
Dołączył: 29.03.2006
Skąd: Poznań

Ostrzeżenie: (0%)
-----


@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.
Go to the top of the page
+Quote Post
Foxx
post
Post #7





Grupa: Zarejestrowani
Postów: 896
Pomógł: 76
Dołączył: 15.11.2003
Skąd: Sosnowiec/Kraków

Ostrzeżenie: (0%)
-----


Dzięki.
Rzeczywiście, z pomocą plugina było łatwiej.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 23.08.2025 - 05:19