mm_forum um RSS-Feed erweitert

  • philipps philipps
    Sternenflotten-Admiral
    0 x
    193 Beiträge
    0 Hilfreiche Beiträge
    01. 12. 2007, 18:51

    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:

    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:
    1. case "LATEST_RSS":
    2. return $this->list_latest_rss();

    Nun noch eine kleine Korrektur an der Funktion evalConfigValues(). Dort die Zeile
    1. if($code == 'LATEST') {

    durch
    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:
    [HTML]<numindex index="8" type="array">
    <numindex index="0">RSS</numindex>
    <numindex index="1">LATEST_RSS</numindex>
    </numindex>
    [/HTML]
    Desweiteren den Elementen exclCategories_latest und exclCategories eine weitere displayCond hinzufügen:
    [HTML]<displaycond>FIELD:code:=:LATEST</displaycond>
    <displaycond>FIELD:code:=:LATEST_RSS</displaycond>
    [/HTML]

    Das war ja auch schon das schlimmste.

    Die Templatedatei latest_rss.html mit folgendem Inhalt anlegen:
    [HTML]<!-- ###LATEST_RSS### begin --><?xml version="1.0" encoding="ISO-8859-1"?>
    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
    <title>###FORUMNAME###</title>
    <link />###FORUMURL###</link>
    <description>Aktuellste Beiträge des ###FORUMNAME###.</description>
    <language>de</language>

    <lastbuilddate>###LASTBUILT###</lastbuilddate>
    <generator>TYPO3 4.1 CMS</generator>
    <ttl>60</ttl>

    <!-- ###LATEST_POST### -->
    <item>
    <title>###TOPICNAME###</title>
    <link />###TOPICLINK###</link>
    <pubdate>###TOPICDATE###</pubdate>
    <description>###TOPICTEXT###</description>
    <content:encoded><![CDATA[
    ###TOPICHTML###
    ]]></content:encoded>
    <category>###CATNAME###</category>
    <dc:creator>###TOPICAUTHOR###</dc:creator>
    </item>
    <!-- ###LATEST_POST### -->
    </channel>
    </rss>
    <!-- ###LATEST_RSS### end -->
    [/HTML]
    Die Templatedatei würde ich gerne per TypoScript konfigurieren. Daher eine neue Zeile TS im Setup:
    [HTML]latest_rss = {$plugin.tx_mmforum.style_path}/forum/latest_rss.html[/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:
    [TS]page = PAGE
    page.10 < styles.content.get
    page.config {
    disableAllHeaderCode = 1
    additionalHeaders = Content-type:application/xml
    xhtml_cleaning = 0
    admPanel = 0
    }
    }
    #Content Elemente aufräumen und Kommentare entfernen
    tt_content.stdWrap.dataWrap >
    tt_content.stdWrap.prefixComment >
    tt_content.default.prefixComment >
    tt_content.list.20.stdWrap.prefixComment >
    [/TS]

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

    Beste Grüße!
    Philipps


  • 1
  • Pom Pom
    Padawan
    0 x
    34 Beiträge
    0 Hilfreiche Beiträge
    20. 02. 2008, 10:20

    Wow,

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

    Gruß

  • beemwe beemwe
    Jar Jar Binks
    0 x
    1 Beiträge
    0 Hilfreiche Beiträge
    13. 05. 2008, 10:45

    Danach habe ich lange gesucht. 8-)

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

    [HTML]<link>###FORUMURL###</link>[/HTML] statt [HTML]<link />###FORUMURL###</link>[/HTML]

    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?

  • b.detert b.detert
    Jedi-Ritter
    0 x
    132 Beiträge
    0 Hilfreiche Beiträge
    16. 07. 2008, 15:43

    Hallo philipps,

    Vielen Dank für das Bereitstellen Deines SourceCodes.
    Die Funktionalätät des RSS Exports werden wir in einer der nächsten mm_forum Versionen mit aufnehmen.

  • DAAfH DAAfH
    R2-D2
    0 x
    73 Beiträge
    0 Hilfreiche Beiträge
    24. 09. 2008, 16:05

    also erst einmal wollte ich dir für diese sehr ausführliche beschreibung danken!!

    habe es auch gleich ausprobiert, doch leider bekomme ich keine xml datei ausgespuckt sondern werde immer auf die startseite verlintk...

    hast du eine idee warum das so sein könnte ? danke schon einmal im vorraus :)

    @b.detert wäre schön wenn ich das machen könntet ;)

  • Diabolos Diabolos
    T3PO
    0 x
    11 Beiträge
    0 Hilfreiche Beiträge
    17. 11. 2008, 11:36

    Hallo zusammen.
    Ich habe alles wie beschrieben eingefügt doch leider bekomme ich in meinem Feed nur "dynamisches Lesezeichen konnte nicht geladen werden" ausgespuckt. Weiß jemand woran es liegen könnte?

    Und noch eine Frage. In der Datei "flexform_ds_pi1.xml" ist index="8" schon vorhanden. Muss ich

    [HTML]<numindex index="0">RSS</numindex>
    <numindex index="1">LATEST_RSS</numindex>
    [/HTML]

    dazu fügen, oder

    [HTML]<numindex index="9" type="array">
    <numindex index="0">RSS</numindex>
    <numindex index="1">LATEST_RSS</numindex>
    </numindex>[/HTML]

    dahinter einfügen?

    Würde mich sehr über eine Antwort freuen.

    Gruß Philip

  • 1