cms4ds
a CMS for Synology Disk Stations
# Besucher
Donate a cup of coffee for Itari

cms4ds als RSS-Feed

2008-11-04

Manchmal möchte man, dass die Beiträge des CMS auch als Feed abgerufen werden können. Hierzu gibt es verschiedene Formate, die allesamt auf der Basis einer XML-Strecke abrufbar sein müssen. In der header.html-Datei wird durch die Direktive

<link rel="alternate" type="application/rss+xml" title="cms4ds-News-Feed" href="cms4ds_rss.php"/>

eine Browser-Verknüpfung zu dem URL-Pfad cms4ds_rss.php hergestellt. Wir sehen dadurch bei fast allen Browsern in der Menü-Leiste die Möglichkeit einer Feed-Registration. Beim Aktivieren der Browser-Feed-Anzeige wird dann die Datei cms4ds.php aktiviert. Diese Datei erzeugt eine einfache XML-Strecke gemäß der RSS-Version 0.91:

<?php
function iso8859_mydecode($html){         // simple translation of german letters
  $a = array('ä'=>"xC3xA4",'ö'=>"xC3xB6",'ü'=>"xC3xBC",
             'Ä'=>"xC3x84",'Ö'=>"xC3x96",'Ü'=>"xC3x9C",'ß'=>"xC3x9F");
  return strtr($html,$a);
}   
header('Content-Type: application/xml');
print '<?xml version="1.0" encoding="UTF-8"?>'; ?>
<?php
print '<rss version="0.91"><channel><title>cms4ds-News-Feed</title>'
      .'<link>http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'</link>'
      .'<description></description><language>de</language>';
require "cms4ds.php.inc";
$recs = mysql_query("select Titel,Rubrik,Titel_Datum from cms4ds_content 
                                order by Titel_Datum desc limit 2");
while ($rec = mysql_fetch_assoc($recs))    
      print '<item><title>'.iso8859_mydecode($rec['Titel']).'</title><link>'
            .'http://'.$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']).'/'
            .$rec['Rubrik'].'.html?id='
            .rawurlencode(iso8859_mydecode($rec['Titel'])).'</link></item>';
print '</channel></rss>';
?>

Den Titel und die Anzahl der anzuzeigenden Einträge kann man natürlich seinen Bedarfen anpassen (rote Markierung). Die XML-Strecke sieht dann wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<rss  version "0.91">
 <channel>
  <title>cms4ds-News-Feed</title>
  <link>http://syno/cms4ds/cms4ds_rss.php</link>
  <description></description>
  <language>de</language>
  <item>
   <title>cms4ds als RSS-Feed</title>
   <link>http://syno/cms4ds/rss.html?id=cms4ds%20als%20RSS-Feed</link>
  </item>
  ...
 </channel>
</rss>

Damit der Feed-Link (http://syno/cms4ds/rss.html?id=cms4ds%20als%20RSS-Feed) auch funktioniert, müssen alle Seiten in der Lage sein, den Abfrageteil der URL (search-String) für die Auswahl der Beitragsanzeige auszuwerten. Siehe auch javascript.

RSS-Feeds in cms4ds integrieren

2008-11-05

Die AJAX-Aufrufe, um einen RSS-Feed zu laden stehen in den jeweiligen HTML-Dateien. Die Funktionen LoadRSS und LoadRSS2 sind in der Datei cms4ds.js implementiert.

function LoadRSS(request){
  d1=new Date().getTime()
  myXMLHTTPRequest.open("GET", "getrss.php?url="+request, false);
  myXMLHTTPRequest.send(null);
  var xmlDoc=myXMLHTTPRequest.responseXML;   
  myXMLHTTPRequest.open("GET", 'rss.xsl', false); myXMLHTTPRequest.send(null);
  var xslStylesheet=myXMLHTTPRequest.responseXML;  
  if (typeof XSLTProcessor != 'undefined') {               // firefox
    var xsltProcessor = new XSLTProcessor();
    xsltProcessor.importStylesheet(xslStylesheet);
    $('feed').appendChild(xsltProcessor.transformToFragment(xmlDoc, document));     
    }
  else if (typeof xmlDoc.transformNode != 'undefined') {   // IE
    $('feed').innerHTML=xmlDoc.transformNode(xslStylesheet);
    }
  d2=new Date().getTime();             
}

Da man nicht aus seiner Domain heraus direkt eine andere URL laden kann, muss es hier über den Umweg eines PHP-Aufrufs gemacht werden (getrss.php). Die Feed-URL wird mitgegeben. Die getrss.php erledigt den Job, eine XML-File zu laden und ein wenig anzupassen (Code-Umwandlung), damit die nachfolgende Verarbeitung auch geht:

<?php
function utf8_mydecode($html){  // reverse simple translation of german letters
  $a = array("xC3xA4"=>'ä',"xC3xB6"=>'ö',"xC3xBC"=>'ü',
             "xC3x84"=>'Ä',"xC3x96"=>'Ö',"xC3x9C"=>'Ü',"xC3x9F"=>'ß');
  return strtr($html,$a);
}
$filearray = file($_GET['url']); 
$filearray[0]='<?xml version="1.0" encoding="iso-8859-1"?>';
$filearray[1]='<rdf>';
$filearray[count($filearray)-1]='';
header('Content-Type: application/xml');
foreach ($filearray as $item) print utf8_mydecode($item);
?>

Nach Erhalt der XML-Strecke wird diese mittels eines zugebundenen XSL-Stylesheets aufbereitet (rss.xsl). Da diese Aufbereitung im Browser stattfindet und es zwischen Firefox und Internet Explorer doch wieder marginale Unterschiede bestehen, findes das in einer Browserweiche statt. Die Verarbeitungsanweisungen sind in XSL geschrieben:

<?xml version="1.0" encoding="ISO-8859-1" ?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
<xsl:for-each select="//channel">
<h4 class="feed_title"><xsl:value-of select="title" /></h4>
</xsl:for-each>
<xsl:for-each select="//item[position() &lt; 9]">
   <a class="feed">
     <xsl:attribute name="href"><xsl:value-of select="link"/></xsl:attribute>
     <xsl:attribute name="title"><xsl:value-of select="title"/></xsl:attribute>
   <xsl:value-of select="substring(./title,0,36)" /> ...</a><br/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>

Wie man schnell sieht, wird hier die Ausgabe des Feeds vorbereitet. Die Anzahl der anzuzeigenden Items ist auf kleiner 9 eingestellt; die angezeigte Länge der Item ist 36 Zeichen.

Warum gibt es 2 RSS-Funktionen? Weil es von Feed zu Feed kleine Unterschiede gibt, die ich der Einfachheit mit 2 Fassungen verarbeite.

PHP: 0.011264 sek. | #