PHP: Generarea unui flux RSS


Avem o nouă jucărie pe CNet.ro: cu ajutorul unui plugin WordPress vom putea vedea secvenţele de cod mai estetic. Şi vom putea vorbi mai uşor despre ele. Sunt foarte curios dacă între cititorii noştri sunt persoane interesate (începătoare în special… avansaţii au resursele lor în engleză) de diverse secvenţe de cod care să le ajute la diferite sarcini. Dacă da, aş putea încerca să scriu şi în această direcţie pe viitor mai multe materiale. Zilele trecute, când am scris despre Biblia în MySQL Dorin îşi exprima dorinţa să afle câte ceva şi despre cod. Sunt oare şi alţii interesaţi de incursiuni în coduri? Fie ele PHP, JScript, ASP, SQL…

Şi ca să începem cu ceva concret, vă propun un cod generic pentru generarea unui flux RSS. Este producţie proprie (se poate să existe ceva similar prin alte părţi – eu nici măcar nu am căutat, având nişte pretenţii specifice de la cod). Concret, astăzi am făcut două RSS-uri (1 şi 2) pentru o bază de date cu lecturile din ritul latin. Dar e vorba de codul pe care îl folosesc şi pe Catholica.ro la feed-urile generate acolo. Am curăţat puţin codul şi l-am făcut mai generic. Practic pornind de la el puteţi genera un RSS pornind de la orice bază de date ce are un câmp de tip dată.

Observaţie: Dacă folosiţi CMS-uri gen WordPress, aveţi deja feed-uri generate automat. Şi atunci un astfel de cod, o parte din el, v-ar putea fi util pentru cerinţe foarte speciale, neacoperite de WP. În esenţă însă, articolul de mai jos este util celor care au situri realizate în PHP fără vreun CMS, ci manual. Sau celor care vor să adauge feed-uri CMS-urilor lor în baza unor tabele ce nu sunt standard în CMS.

Şi acum codul. La final vin explicaţiile.

<?php
   define("CODARE","ISO-8859-2");
   define("DESC_SCURTA","Feedul meu de test");
   define("DESC_LUNGA","Acest feed este realizat doar de test. Desigur, poate fi ceva util!");
   define("SIT_URL","www.situlmeu.ro");
   define("SIT_NUME","SitulMeu.ro");
   define("SIT_LOGO","www.situlmeu.ro/imagini/logo.jpg");
   define("ART_URL","www.situlmeu.ro/articole.asp?id=");
   define("FEED_URL","www.situlmeu.ro/feed.php");
   define("DB_HOST","localhost");
   define("DB_USER","root");
   define("DB_PASSWORD","parola");
   define("DB_NAME","bazadedate");
 
   header('Content-type: application/xml; charset="'.CODARE.'"',true);
 
   $link = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
   mysql_select_db(DB_NAME);
 
   function feedGeneric(){
      $result = '<?xml version="1.0" encoding="'.CODARE.'"?>';
      $result .= "<rss version=\"2.0\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" 
         xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\">\n";
      $result .= "<channel>";
      $result .= "<title>".DESC_SCURTA."</title>\n";
      $result .= "<link>http://".SIT_URL."</link>\n";
      $result .= "<description>".DESC_LUNGA."</description>\n";
      $result .= "<generator>".SIT_NUME."</generator>\n<language>en-us</language>\n";
      $result .= "<copyright>".SIT_URL."</copyright>\n";
      $candanume=Date("D, j M Y H:i:s",mktime(10,0,0,8,20,2008))." GMT";
      $result .= "<pubDate>".$candanume."</pubDate>\n";
      $result .= "<lastBuildDate>".$candanume."</lastBuildDate>\n";
      $result .= "<category>News</category>\n<docs>http://blogs.law.harvard.edu/tech/rss</docs>\n";
      $result .= "<image><url>http://".SIT_LOGO."</url>\n";
      $result .= "<title>".DESC_SCURTA."</title>\n<link>http://".SIT_URL."/</link></image>\n";
      $sqlstr = mysql_query("SELECT * FROM tabela WHERE (1=1) ORDER BY id DESC LIMIT 20");
      while ($row = mysql_fetch_array($sqlstr)){
         $id=$row["id"];
         $titlu=$row["titlu"];
         $dataart=$row["dataart"];
         $candanume=Date("D, j M Y H:i:s",mktime(substr($dataart,11,2),substr($dataart,14,2),substr($dataart,17,2),
            substr($dataart,5,2),substr($dataart,8,2),substr($dataart,0,4)))." GMT";
         $continut=$row["continut"];
         $result .= "<item><title>".$titlu."</title><link>http://".ART_URL.$id."</link><description><![CDATA[";
         $result .= "<p align=justify>".$continut."]]></description>\n";
         $result .= "<pubDate>".$candanume."</pubDate>\n";
         $result .= "<source url=\"http://".FEED_URL."\" /><guid>http://".ART_URL.$id."</guid></item>\n";
      }
      $result .= "</channel></rss>\n";
      return $result;
   }
 
   echo feedGeneric(); 
?>

Prima parte conţine definirea unei serii de constante. În principiu ele se explică singure. Aş sublinia prima constantă: CODARE. Cel mai adesea s-ar putea să fie UTF-8. Puneţi codarea care ştiţi că se potriveşte sursei datelor Dvs. Apoi vin date descriptive şi datele de conectare la baza de date. În linia 15 am indicat faptul că pagina va fi una XML (formatul pentru RSS).

Urmează funcţia care construieşte feed-ul. Atenţia trebuie să ni se îndrepte spre linia 36 (cu o scurtă oprire la linia 30, unde indicaţi data de „înfiinţare” a feed-ului: oră,minute,secunde,luna,zi,an). La linia 36 desigur va trebui să scriem o interogare conform dorinţelor noastre pentru feed. Vom specifica o condiţie (în loc de 1 egal 1) iar limita se poate lăsa la 20 (de regulă feed-urile oferă ultimele 20 de articole, dar desigur puteţi „regla” la cât doriţi Dvs). Liniile 38-40 şi 43 vă aparţin în totalitate. Eu am presupus că tabela, care o fi ea, are câmpurile id, titlu, dataart şi continut. De la caz la caz numele câmpurilor poate fi altul. Poate titlu şi continut vor fi stringuri compuse? Cum ştiţi Dvs. În aceea zonă, păstrând numerele variabilelor, puteţi face ce modificări doriţi. Liniile 41-42 trebuie de asemenea conservate.

De test am pus scriptul de mai sus să se conecteze la baza de date de ştiri de pe Catholica.ro. Am pus la titlu titlul ştirii, la conţinut corpul ştirii, la dată data ştirii (evident, nu?). Şi am obţinut imediat un feed pentru Catholica.ro. Aveţi baze de date pe situl propriu? Puteţi şi Dvs în câteva minute – dacă aveţi informaţii cu câmp dată – să creaţi un feed. Succes!


Apreciază articolul:

1 stea2 stea3 stea4 stea5 stea (2 evaluări, media: 5,00 din 5)
Loading...Loading...

7 comentarii

  1. dorin spune:

    Cautam de mult un cod sa fac un rss pentru phpbb 3.0.x. Mi-ati o idee cu acest articol. Multumesc :) .

  2. radu.capan spune:

    Există un MODX pentru aşa ceva. Se numeşte Simple RSS şi eu îl folosesc pe două forumuri cu phpBB 3.0.2 şi îl găsesc acceptabil. Desigur, se poate şi programa unul independent.

  3. Viorel Sfetea spune:

    Foarte bun scriptul dumneavoastra. Scurt si la obiect, as putea zice. Am o intrebare totusi: de ce ati simtit nevoia sa introduceti tot codul intr-o functie avand in vedere ca acea functie va fi apelata doar o data si nu ati dat direct echo variabilei $result?

    De asemenea, ca o adaugare personala, daca doriti sa afisati doar un rezumat in feed si nu intreg articolul, cum vad ca este cazul aici, sa luati in vedere ca charset-ul ISO-8859-2 reprezinta caractere multibyte, iar folosirea functiilor default php pentru operatiile cu string-uri va duce la rezultate neasteptate (in principiu aparitia caracterelor invalide). Solutia este sa folositi functiile extensiei mb_string a PHP sau sa transformati textul intr-un charset unibyte prin functia iconv, implicita in PHP.

    Viorel

  4. radu.capan spune:

    Ceea ce am scris eu va fi – pentru cine va folosi codul – o parte dintr-un cod mai mare. De aceea am preferat să fie o funcţie, care la nevoie să fie depozitată într-un fişier de inclus.

    Cât priveşte cu setul de caractere… Povestea e într-adevăr mai lungă şi mai complicată. Sper însă accentul să cadă mai sus pe modul simplu de construire a unui feed. E bine ca acestea să fie construite direct UTF-8, consider eu.

  5. Daniel spune:

    Salut o intrebare cum creez un fisier csv. pentru un feed as dori sa-mi adaug produsele de pe situl nichiduta.ro pe situri gen cauta shopmania etc. Si nu stiu cum se procedeaza.

  6. radu.capan spune:

    Instrument automat nu stiu sa fie. Nu ramane atunci decat programarea.


Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile necesare sunt marcate *