[PHP] RSS-Feed eines Newsscript umschreiben: RSS1.0 -> RSS2.0

Maxefix

Grand Admiral Special
Mitglied seit
20.01.2003
Beiträge
6.223
Renomée
176
  • SIMAP Race
  • QMC Race
Hallo,

ich hab vor kurzem das Newsscript PHPNews installiert. Das erstellt auch automatisch einen RSS-Feed. Leider ist der, im Gegensatz zum Rest des Skriptes, nicht ganz perfekt. Unter anderem fehlen so wichtige Dinge wie <pubDate>. Deshalb wollte ich das Skript umschreiben und wenn ich schon dabei bin auch gleich den neuen Standard berücksichtigen. Ich hab schonmal angefangen, aber leider funktionierts nicht. Aber das kann gut daran liegen das ich mich mit PHP alles andere als gut auskenne :-[

Lange Rede kurzer Sinn: Kann mir bitte da jemand helfen? :)

Hier mal der Teil des Skriptes der für die RSS-Datei zuständig ist:
Code:
/********************
* RSS Feed Creation *
********************/

function createRSSFeed() {
  //is_admin();
  global $Settings, $language, $dbQueries, $db_prefix;

  $filename = strtolower(str_replace(' ', '', $Settings['sitename'])) . '.rss';

  if (file_exists($filename)) {
    @unlink($filename);
  }

  $handler = fopen($filename, 'w+');

  // Creates the header for the RSS file
  $rssfile = "<?xml version=\"1.0\" encoding=\"".$language['CHARSET']."\"?>
<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"
  xmlns=\"http://purl.org/rss/1.0/\">
   <channel rdf:about=\"".$Settings['siteurl']."\">
      <title>".$Settings['sitename']."</title>
      <link>".$Settings['phpnewsurl'] . $filename ."</link>
      <description>
         This RSS feed was generated out of the newsdatabase of
         ".$Settings['sitename']." website.
      </description>
      <items>
         <rdf:Seq>\n";

  /* Get information about the News Post */
  $SQL_query = mysql_query('SELECT n.id,n.posterid,n.postername,n.time,n.subject,n.titletext,n.maintext,p.username,p.email,p.avatar'
                           . ' FROM ' . $db_prefix . 'news AS n'
                           . ' LEFT JOIN ' . $db_prefix . 'posters AS p ON(n.posterid=p.id)'
                           . ' AND n.trusted = 1'
                           . ' ORDER by n.id DESC');
  $dbQueries++;

  while($news = mysql_fetch_assoc($SQL_query))
  {
    /* Set Variables */
    $time = strftime($Settings['timeformat'], $news['time']);
    $subject = $news['subject'];
    $titletext = $news['titletext'];
    $username = $news['username'];

    if (!$username)
    {
      $username = $news['postername'];
    }
    /* Display link to show comments & news if enabled */
    if ($news['maintext'] != '' && $Settings['showcominnews'] == 1 && $Settings['enablecomments'] == 1)
    {
      $maintext = $Settings['siteurl'] . '?action=fullnews&amp;showcomments=1&amp;id=' . $news['id'] . '';
    }
    else if ($news['maintext'] != '')
    {
      $maintext = $Settings['siteurl'] . '?action=fullnews&amp;id=' . $news['id'] . '';
    }
    else
    {
      $maintext = $Settings['siteurl'];
    }

    // Strip tags and BBcode
    $titletext = strip_tags($titletext);
    $titletext = preg_replace('/\[(.+?)\](.+?)\[\/(.+?)\]/is', '\\2', $titletext);

    // Creates table of contents
    $rssfile .= "            <rdf:li resource=\"".$maintext."\" />\n";

        // Creates the <item> construct for every news item
        $items .= "   <item rdf:about=\"".$maintext."\">
      <title>".str_replace('&quot;', '"', $subject) ."</title>
      <link>".$maintext."</link>
      <description>
         ".$titletext."
      </description>
   </item>\n";
  }

  // Closes table of contents
  $rssfile .= "         </rdf:Seq>
      </items>
   </channel>\n";

  // Adds the news items to the string
  $rssfile .= $items;

  // Creates the footer of the RSS file
  $rssfile .= "</rdf:RDF>\n";

  // Puts the string $rssfile in RSS file
  if(!fputs($handler, $rssfile))
  {
    fatal_error($language['CONTENT_ERRORWRITETORSSFEED']);
  }

  fclose($handler);

  // Only present this link, if parameter is createRSSFeed
  if ($_GET['action'] == 'createRSSFeed') {
?>
            <p>
               <?php echo $language['CONTENT_RSSFEEDCREATED'],"\n";?><br />
               <a href="index.php?action=advanced"><?php echo $language['CONTENT_BACK'];?></a>
            </p>
<?php
  }
  checkForIE();
}
Und so hab ich ihn umgeschrieben:
Code:
/********************
* RSS Feed Creation *
********************/

function createRSSFeed() {
  //is_admin();
  global $Settings, $language, $dbQueries, $db_prefix;

  $filename = strtolower(str_replace(' ', '', $Settings['sitename'])) . '.rss';

  if (file_exists($filename)) {
    @unlink($filename);
  }

  $handler = fopen($filename, 'w+');

  // Creates the header for the RSS file
  $rssfile = "<?xml version=\"1.0\" encoding=\"".$language['CHARSET']."\"?>
<rss version=\"2.0\">
<channel>
	<title>".$Settings['sitename']."</title>
	<link>".$Settings['phpnewsurl'] . $filename ."</link>
	<description>News über die Planet 3DNow!-Fotowettbewerbe</description>
	<language>de-de</language>
	<docs>http://blogs.law.harvard.edu/tech/rss</docs>
	<copyright>Maximilian Walter (aka Maxefix)</copyright>
	<webMaster>info@karlheinz-w.de (Maxefix)</webMaster>
	<pubDate>Wed, 01 Mar 2006 14:00:00 +0100</pubDate>
	<items>";
	
  /* Get information about the News Post */
  $SQL_query = mysql_query('SELECT n.id,n.posterid,n.postername,n.time,n.subject,n.titletext,n.maintext,p.username,p.email,p.avatar'
                           . ' FROM ' . $db_prefix . 'news AS n'
                           . ' LEFT JOIN ' . $db_prefix . 'posters AS p ON(n.posterid=p.id)'
                           . ' AND n.trusted = 1'
                           . ' ORDER by n.id DESC');
  $dbQueries++;

  while($news = mysql_fetch_assoc($SQL_query))
  {
    /* Set Variables */
    $time = strftime($Settings['timeformat'], $news['time']);
    $subject = $news['subject'];
    $titletext = $news['titletext'];
    $username = $news['username'];

    if (!$username)
    {
      $username = $news['postername'];
    }
    /* Display link to show comments & news if enabled */
    if ($news['maintext'] != '' && $Settings['showcominnews'] == 1 && $Settings['enablecomments'] == 1)
    {
      $maintext = $Settings['siteurl'] . '?action=fullnews&amp;showcomments=1&amp;id=' . $news['id'] . '';
    }
    else if ($news['maintext'] != '')
    {
      $maintext = $Settings['siteurl'] . '?action=fullnews&amp;id=' . $news['id'] . '';
    }
    else
    {
      $maintext = $Settings['siteurl'];
    }

    // Strip tags and BBcode
    $titletext = strip_tags($titletext);
    $titletext = preg_replace('/\[(.+?)\](.+?)\[\/(.+?)\]/is', '\\2', $titletext);
	
        // Creates the <item> construct for every news item
        $items .= "	<item>
		<title>".str_replace('&quot;', '"', $subject) ."</title>
		<description><![CDATA[".$titletext."]]></description>
		<link>".$maintext."</link>
		<author>info@karlheinz-w.de (Maxefix)</author>
		<pubDate>Thu, 13 Jul 2006 16:47:00 +0100</pubDate>
	</item>\n";
	}
				
  // Adds the news items to the string
  $rssfile .= $items;

  // Closes table of contents
  $rssfile .= "		</channel>\n";

  // Creates the footer of the RSS file
  $rssfile .= "</rss>\n";

  // Puts the string $rssfile in RSS file
  if(!fputs($handler, $rssfile))
  {
    fatal_error($language['CONTENT_ERRORWRITETORSSFEED']);
  }

  fclose($handler);

  // Only present this link, if parameter is createRSSFeed
  if ($_GET['action'] == 'createRSSFeed') {
?>
            <p>
               <?php echo $language['CONTENT_RSSFEEDCREATED'],"\n";?><br />
               <a href="index.php?action=advanced"><?php echo $language['CONTENT_BACK'];?></a>
            </p>
<?php
  }
  checkForIE();
}
Das komplette Skript könnt ihr hier runterladen.

Schonmal Danke für eure Hilfe und Tipps :)

MFG Max

EDIT: Problem behoben, ein String war nicht geschloßen. Jetzt kommt das nächste Problem: Das Datum samt Uhrzeit richtig formatiert da reinbekommen *buck*
 
Zuletzt bearbeitet:
Nabend,

sorry, ich glaub ich muss da erstmal wiedersprechen, bevor ich mir das Script im genauen ansehe. In diesem Fall musst du ein paar Dinge beachten:
RSS 1.0 ist eigentlich kein Nachfolger von RSS < 1.0. RSS 1.0 basiert auf RDF und hat damit leider nicht viel mit dem "normalen" RSS zu tun. Der wirkliche Nachfolger vonn RSS 0.92 ist RSS 2. RSS 1.0 ist wie gesagt eine ganz andere Geschichte auf RDF Basis. Mit RDF kannst du alle möglichen XML Datenarten (Namespaces) in deinen Feed einbauen. Wenn du z.B. das pubdate Element vermisst, nehme einfach die Elemente des Dublin Cores Namespaces mit rein und verwende dann <dc:date>.
Allerdings ist es wohl besser, wenn du auf wirkliches RSS migrierst, wenn du mit Feeds noch nicht soviel Erfahrung hast, dass RSS deutlich einfacher zu verstehen ist, als RDF.

Wenn ich heute Abend etwas Zeit habe kann ich mir zu Hause das Script mal ansehen.

Ciao
Phil
 
Also mit RSS 2.0 habe ich ja schon Erfahrungen, deshalb würde ich halt gern den Standard (wieder) einsetzen. Vorallem dürfte der Unterschied ja nicht allzu groß sein, die Datei ist halt bissl anders aufgebaut.

Aber schonmal Danke das du dir das heut Abend mal anschaust :)

MFG Max
 
Nabend,

EDIT: Problem behoben, ein String war nicht geschloßen. Jetzt kommt das nächste Problem: Das Datum samt Uhrzeit richtig formatiert da reinbekommen *buck*
Okay, wenn du nur noch die Uhrzeit reinkriegen willst, ist ja schonmal gut. Du vergisst die Uhrzeit auszugeben. Ändere also mal die Ausgabe in folgende Zeile:
PHP:
// Creates the <item> construct for every news item
        $items .= "	<item>
		<title>".str_replace('&quot;', '"', $subject) ."</title>
		<description><![CDATA[".$titletext."]]></description>
		<link>".$maintext."</link>
		<author>info@karlheinz-w.de (Maxefix)</author>
		<pubDate>".$time."</pubDate>
	</item>\n";
Allerdings wird $time vorher so erzeugt:
PHP:
$time = strftime($Settings['timeformat'], $news['time']);
Was ist $Settings['timeformat'] steht, weiß ich nicht. Ich verwende dazu die date Funktion, die ist einfacher, finde ich, weil es den passenden Paramater schon gibt:
PHP:
$time=date("r",$news["time"]);
Nachteil daran: Die Einstellung $Settings['timeformat'] verläuft ins Leere. Wenn du das brauchst, müsste man die Format Codes mal rausschreiben, damit ein valides Datum nach RFC-2822 rauskommt. Da müsste (wenn ich jetzt keinen Fehler gemacht habe) man der Variable $Settings['timeformat'] folgenden Wert geben:
PHP:
$Settings['timeformat']="%a, %d %b %Y %H:%I:%S %z";

Ciao
Phil
 
Erstmal Danke für deine Hilfe *great* :)

Bei dem Skript kann man in den Einstellungen das Format fürs Datum einstellen, also ob man nur das Datum oder auch die Uhrzeit haben will. Ich denke das wird in dieser Variablen ($Settings['timeformat']) gespeichert. Aber da ich ja für den RSS-Feed nicht nur das Datum sondern eben auch Uhrzeit etc. brauch muss ich das eh ändern, also so wie du das auch gemacht hast.

Ich komm aber erst übermorgen...wobei, u.U. sogar erst am Donnerstag dazu das auszuprobieren weil ich in der nächsten Zeit nicht mehr an mein Rechner komm. Ich berichte dann obs geklappt hat :)

MFG Max
 
Wie, ist heute schon Donnerstag? ;)

Freut mich geholfen zu haben. Als Gegenleistung wären ein paar Besuche auf meinem Blog passend. ;) Nein, nur Spaß.

Ciao
Phil
 
Zurück
Oben Unten