Générer un flux rss (2e partie)

Nous avons vu, dans un autre article, comment générer un flux rss de nouvelles pour notre site.
Mais les flux rss ne se limitent pas aux nouvelles du site et il est tout aussi intéressant de proposer un flux par thème du forum ou par type d’événement.

Plutot que de répéter à chaque fois le script de génération du fichier rss, je vous propose d’utiliser une classe plus générique qui va formater nos données de flux en un XML prévu à cet effet.

La classe Rss et la classe RssElement

 class Rss{ 	var $gs_title; 	var $gs_url; 	var $gs_description; 	var $gs_titreImage; 	var $gs_urlImage; 	var $gs_urlElement; 	var $gb_isImage; 	var $ga_elements;  	function Rss($as_titre, $as_url, $as_description) 	{ 		$this->gs_title = $as_titre; 		$this->gs_url = $as_url; 		$this->gs_description = $as_description; 		$this->gb_isImage = false;	 	} 	function setImage($as_titre, $as_urlImage, $as_urlElement)	{ 		$this->gs_titreImage = $as_titre; 		$this->gs_urlImage = $as_urlImage; 		$this->gs_urlElement = $as_urlElement; 		$this->gb_isImage = true;	 	}		 	function addElement($as_title,$as_email,$as_link,$as_description,$ats_date) 	{ 		$lo_element = new RssElement($as_title,$as_email,$as_link,$as_description,$ats_date); 		$this->ga_elements[] = $lo_element; 		return $lo_element->getXML(); 	} 	function getXML()	 	{ 		$ls_return = ""; 		$ls_return.= "\n"; 		$ls_return.= "\n"; 		$ls_return.= "\n".$this->gs_title.""; 		$ls_return.= "\n".$this->gs_url.""; 		$ls_return.= "".$this->gs_description.""; 		$ls_return.= "\nfr"; 		$ls_return.= "\n".date('r').""; 		$ls_return.= "\n".date('r').""; 		if($this->gb_isImage) 		{ 			$ls_return.= "\n"; 			$ls_return.= "\n".$this->gs_titreImage."";  			$ls_return.= "\n".$this->gs_urlImage.""; 			$ls_return.= "\n".$this->gs_urlElement."";    			$ls_return.= "\n"; 		} 		foreach($this->ga_elements as $lo_element) 		{ 			$ls_return .= $lo_element->getXML(); 		} 		$ls_return.= "\n"; 		$ls_return.= "\n"; 		 		return $ls_return; 	} 	 	function saveXML($as_file) 	{ 		$lo_rss = fopen($as_file, 'w'); 		fwrite($lo_rss, $this->getXML()); 		fclose($lo_rss); 	} }  class RssElement { 	var $gs_title; 	var $gs_email; 	var $gs_link; 	var $gs_description; 	var $gts_date; 	 	function RssElement($as_title,$as_email,$as_link,$as_description,$ats_date) 	{ 		$this->gs_title = $as_title; 		$this->gs_email = $as_email; 		$this->gs_link = $as_link; 		$this->gs_description = $as_description; 		$this->gts_date = $ats_date; 	} 	function getXML() 	{ 		$ls_return.= "\n"; 		$ls_return.= "\n".htmlspecialchars($this->gs_title).""; 		$ls_return.= "\n".$this->gs_email.""; 		$ls_return.= "\n".$this->gs_link.""; 		$ls_return.= "\n".htmlspecialchars($this->gs_description).""; 		$ls_return.= "\n".date('r', $this->gts_date).""; 		$ls_return.= "\n";				   		return $ls_return;	 	} } 

La classe Rss() permet de générer un objet qui va regrouper toutes les propriétés du flux rss à générer. Elle contient, entre autres, un array de RssElement() qui est une classe décrivant un élément du flux (une nouvelle au sein d’un flux de nouvelles par exemple).

Elle dispose de deux propriétés intéressantes : getXML et saveXML qui vont permettre respectivement de retourner le XML du flux (si le flux a une finalité dynamique) ou de le sauver dans un fichier (si le flux a une finalité statique).

Utilisr l’objet

Tout d’abord construisez votre objet avec ses propriétés de base

 $lo_rss = new Rss("Mes Forums - Derniers sujets"  , "http://forum.monsite.com"  , "Monsite : Derniers Sujets du Forum"); 

Ensuite parcourez un recordset d’éléments (ici des sujets de forums) pour peupler l’array d’éléments.

 while($la_rs=mysql_fetch_array($lo_rs)) {   $lo_rss->addElement($la_rs["Subject"],$la_rs["Username"]    , "http://urlDuSujet?ID=".$la_rs["ID"], $la_rs["Message"]   , strtotime($la_rs["Date"])); } 

Enfin, soit vous enregistrez le flux obtenu dans un fichier :

 	$lo_rss->saveXML("lastTopics.xml"); 

soit vous le retournez directement au client :

  echo $lo_rss->getXML(); 

{mos_fb_discuss:2}

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *