[HowTo] mm_forum um RSS-Feed erweitert

Autor Nachricht
Verfasst am: 01.12.2007 [18:51]
philipps


[Themenersteller]
dabei seit: 31.05.2003
Beiträge: 193

Hallo zusammen!
Für einen kleinen AJAX-Ticker mit den letzten Forenbeiträgen hab ich eine RSS-Ausgabe des mm_forum benötigt. Die RSS-Ausgabe ist weitgehendst analog zur "Neueste Beiträge" Ansicht, beinhaltet jedoch auch auszugsweise den Beitragstext in Plain und HTML.

Nachfolgend eine kurze Schilderung welche Änderungen notwendig sind.

Vielleicht lässt sich das ja auch langfristig ins Forum integrieren ... ;-)


In der class.tx_mmforum_pi1.php nach der Funktion list_latest, die Funktion list_latest_rss() einbauen:
Php:Zeilennummerierung:  An / Aus

  1. function list_latest_rss() {
  2.           $conf = $this->conf;
  3.         $template = $this->cObj->fileResource($this->conf['template.']['latest_rss']);
  4.         $template = $this->cObj->getSubpart($template, '###LATEST_RSS###');
  5.         $templateRow = $this->cObj->getSubpart($template, '###LATEST_POST###');
  6.         $limit = $this->latest_limitTopic;
  7.        
  8.         $res = $GLOBALS['TYPO3_DB']->exec_SELECTquery(
  9.             't.topic_last_post_id as post_id, t.uid as topic_id, t.*, f.uid as forum_id, f.forum_name as forum_name, c.forum_name as category_name, p.post_time as lastpost_time, l.post_text as lastpost_text, l.cache_text as lastpost_cache, l.post_id, u.username',
  10.             'tx_mmforum_posts p, tx_mmforum_forums f, tx_mmforum_forums c, tx_mmforum_topics t, tx_mmforum_posts_text l, fe_users u',
  11.             'p.uid = t.topic_last_post_id AND
  12.              f.uid = p.forum_id AND
  13.              c.uid = f.parentID AND
  14.              p.uid = l.post_id AND
  15.              p.deleted = 0 AND
  16.              t.deleted = 0 AND
  17.              f.deleted = 0 AND
  18.              c.deleted = 0 AND
  19.              l.deleted = 0 AND
  20.              u.deleted = 0 AND
  21.              p.hidden = 0 AND
  22.              t.hidden = 0 AND
  23.              f.hidden = 0 AND
  24.              c.hidden = 0 AND
  25.                  l.hidden = 0'.
  26.              $this->getMayRead_forum_query('f').
  27.              $this->getMayRead_forum_query('c').
  28.              $this->getCategoryLimit_query('c'),
  29.             'p.topic_id',
  30.             't.topic_last_post_id DESC',
  31.             $limit
  32.         );
  33.         while($arr = $GLOBALS['TYPO3_DB']->sql_fetch_assoc($res)) {
  34.            
  35.                 $linkParams[$this->prefixId] = array(
  36.                 'action'        => 'list_post',
  37.                 'tid'           => $arr['topic_id']
  38.             );
  39.             if($this->getIsRealURL()) $linkParams[$this->prefixId]['fid'] = $arr['forum_id'];
  40.                
  41.                 $posttime = date('r',$arr['lastpost_time']);
  42.             $topiclink = $this->getAbsUrl($this->get_pid_link ($arr['post_id'],'',$conf));
  43.                 $topictext = $this->cObj->crop($arr['lastpost_text'],'500| ...|1');
  44.             $topichtml = $this->cObj->crop($arr['lastpost_cache'],'2000| ...|1');
  45.             $catname = $arr['category_name'].' / '.$arr['forum_name'];
  46.                
  47.                 $rMarker = array(
  48.                 '###TOPICNAME###'              => htmlspecialchars($arr['topic_title']),
  49.                 '###TOPICLINK###'              => $topiclink,
  50.                     '###CATNAME###'          => htmlspecialchars($catname),
  51.                 '###TOPICAUTHOR###'          => htmlspecialchars($arr['username']),
  52.                 '###TOPICDATE###'              => $posttime,
  53.                 '###TOPICHTML###'              => $topichtml, // liegt in CDATA
  54.                 '###TOPICTEXT###'              => htmlspecialchars($topictext),
  55.             );
  56.             $rowContent .= $this->cObj->substituteMarkerArray($templateRow, $rMarker);
  57.         }
  58.         $template = $this->cObj->substituteSubpart($template, '###LATEST_POST###', $rowContent);
  59.        
  60.         $marker = array(
  61.             '###FORUMNAME###'       => htmlspecialchars($this->conf['boardName']),
  62.             '###FORUMURL###'        => $this->getAbsUrl($this->pi_getPageLink($this->conf['pid_forum'])),
  63.             '###LASTBUILT###'      => date('r') // So lange die pi1 eh nicht im cache liegt sinnlos ...
  64.         );
  65.         $template = $this->cObj->substituteMarkerArrayCached($template, $marker);
  66.         return $template;
  67.     }

Diese Funkion muss natürlich noch ausgeführt werden. Daher die Switch-Konstruktion in Zeile 232 wie folgt erweitern:
Php:Zeilennummerierung:  An / Aus

  1. case "LATEST_RSS":
  2.         return $this->list_latest_rss();

Nun noch eine kleine Korrektur an der Funktion evalConfigValues(). Dort die Zeile
Php:Zeilennummerierung:  An / Aus

  1. if($code == 'LATEST') {

durch
Php:Zeilennummerierung:  An / Aus

  1. if($code == 'LATEST' OR 'LATEST_RSS') {
ersetzen.


Weiter gehts mit der flexform_ds_pi1.xml. Dort das Feld code um folgende Auswahlmöglichkeit erweitern:
Html4strict:Zeilennummerierung:  An / Aus

  1. <numindex index="8" type="array">
  2.         <numindex index="0">RSS</numindex>
  3.         <numindex index="1">LATEST_RSS</numindex>
  4. </numindex>

Desweiteren den Elementen exclCategories_latest und exclCategories eine weitere displayCond hinzufügen:
Html4strict:Zeilennummerierung:  An / Aus

  1. <displaycond>FIELD:code:=:LATEST</displaycond>
  2. <displaycond>FIELD:code:=:LATEST_RSS</displaycond>


Das war ja auch schon das schlimmste.

Die Templatedatei latest_rss.html mit folgendem Inhalt anlegen:
Html4strict:Zeilennummerierung:  An / Aus

  1. <!-- ###LATEST_RSS### begin --><?xml version="1.0" encoding="ISO-8859-1"?>
  2. <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  3.         <channel>
  4.                 <title>###FORUMNAME###</title>
  5.                 <link />###FORUMURL###</link>
  6.                 <description>Aktuellste Beiträge des ###FORUMNAME###.</description>
  7.                 <language>de</language>
  8.  
  9.                 <lastbuilddate>###LASTBUILT###</lastbuilddate>
  10.                 <generator>TYPO3 4.1 CMS</generator>
  11.                 <ttl>60</ttl>
  12.  
  13.                 <!-- ###LATEST_POST### -->
  14.                 <item>
  15.                         <title>###TOPICNAME###</title>
  16.                         <link />###TOPICLINK###</link>
  17.                         <pubdate>###TOPICDATE###</pubdate>
  18.                         <description>###TOPICTEXT###</description>
  19.                         <content:encoded><![CDATA[
  20.                         ###TOPICHTML###
  21.                         ]]></content:encoded>
  22.                         <category>###CATNAME###</category>
  23.                         <dc:creator>###TOPICAUTHOR###</dc:creator>
  24.                 </item>
  25.                 <!-- ###LATEST_POST### -->
  26.         </channel>
  27. </rss>
  28. <!-- ###LATEST_RSS### end -->

Die Templatedatei würde ich gerne per TypoScript konfigurieren. Daher eine neue Zeile TS im Setup:
Html4strict:Zeilennummerierung:  An / Aus

  1. latest_rss              = {$plugin.tx_mmforum.style_path}/forum/latest_rss.html



Jetzt einfach eine neue Seite mit dem Seiteninhalt "mm_forum" -> Ansicht "RSS" erstellen und die Kategorien/Anzahl der Beiträge definieren. Damit die Seite richtig als XML ausgegeben wird, empfehle ich ein Ext.-Template mit folgendem Setup:
Typoscript:Zeilennummerierung:  An / Aus

  1. page = PAGE
  2. page.10 < styles.content.get
  3. page.config {
  4.     disableAllHeaderCode = 1
  5.     additionalHeaders = Content-type:application/xml
  6.     xhtml_cleaning = 0
  7.     admPanel = 0
  8.   }
  9. }
  10. #Content Elemente aufräumen und Kommentare entfernen
  11. tt_content.stdWrap.dataWrap >
  12. tt_content.stdWrap.prefixComment >
  13. tt_content.default.prefixComment >
  14. tt_content.list.20.stdWrap.prefixComment >



Ich übernehme natürlich keine Verantwortung und bin mir bestens bewusst, dass das quick & dirty ist.


Beste Grüße!
Philipps

[Dieser Beitrag wurde 1 mal bearbeitet. Zuletzt am 02.12.2007 um 17:03]
Verfasst am: 20.02.2008 [10:20]
Pom


dabei seit: 13.02.2007
Beiträge: 25

Wow,

nicht schlecht! Ich werde es demnächst mal ausprobieren, Bericht folgt.

Gruß
Verfasst am: 13.05.2008 [10:45]
beemwe

dabei seit: 13.05.2008
Beiträge: 1

Danach habe ich lange gesucht. icon_cool.gif

Leider habe ich auch ein Problem damit. Der Feed wird korrekt erzeugt, sofern im XML-Template bei den öffnenden Linktags das "/" entfernt wird.

Html4strict:Zeilennummerierung:  An / Aus

  1. <link>###FORUMURL###</link>
statt
Html4strict:Zeilennummerierung:  An / Aus

  1. <link />###FORUMURL###</link>


Was ich aber nicht hinbekomme, ist die reine XML Ausgabe über das Typoscript. Sobald ich dem page.10 Objekt styles.content.get zuweise ist page.10 leer.

Hat jemand einen Tipp für mich?




 
TYPO3 Version 4.2.0 testen

TYPO3 Ver. 4.2.0 testen

Testen Sie die neue TYPO3 Version 4.2.0 kostenlos für einen Monat

TYPO3 Bücher

TYPO3 Workshops


TYPO3 Einführungsschulung
in Berlin:
Montag, 07.07.
in Espelkamp:
Montag, 04.08.

TYPO3 Intensivschulung
in Espelkamp:
Mi., 06.08. - Fr., 08.08.
in Würzburg:
Mo., 18.08. - Mi., 20.08.
in Köln:
Mo., 01.09. - Mi., 03.09.
in Berlin:
Mi., 24.09. - Fr., 26.09.

TYPO3 Extensionschulung
in Berlin:
Mo., 14.07. - Mi., 16.07.
in Espelkamp:
Mo., 11.08. - Mi., 13.08.