Blog 4 Umbraco 2.0.4 - RSS Feeds

Freitag, 4. Dezember 2009 von Immo Wache
Kategorien: Umbraco  Blog  deutsch  C#  Weihnachtskalender 

Original von Tim Geyssens

Heute werden wir uns mit der Verbesserung der der RSS-Feeds zu unserem Blog befassen. Die Zauberwörter dafür sind XSLT, alternative Templates und URL-Rewriting. Bisher bietet der Blog 4 Umbraco nur ein einzelnes RSS-Feed, welcher einfach die letzten verfügbaren Blog-Beiträge auflistet. Wir werden nun Verbesserungen einbauen, sodass wir am Ende folgende RSS-Feeds verfügbar haben:

  • Feed der letzen Beiträge
  • Feed der letzten Beiträge zu einem bestimmten Tag
  • Feed der letzten Kommentare
  • Feed der Kommentare zu einem einzelnen Beitrag

Grundsätzlich wird ein RSS-Feed mittels einer alternative Dokumentvorlage realisiert, die auf die Startseite des Blogs angewendet wird (durch Anfügen des Template-Alias "rss" an die URL). Diese Dokumentvorlage ihrerseits enthält ein einzelnes XSLT-Makro, dass den RSS-Feed im korrekten Format ausgibt. Nebenbei sind die RSS-Feeds damit ein guter Anfangspunkt, um die ersten Erfahrungen mit XSLT zu sammeln.

image_1

Eine kleine Veränderung, die wir zunächst anpacken, ist die Erzeugung der Site-URL. Dazu wandeln wir diese von einem statischen Wert in eine dynamisch erzeugte URL. Dazu ermitteln wir im XSLT-Skript einfach die aktuellen Host-Adresse mittels Abfrage der Server-Variable HTTP_HOST:

<xsl:variable name="SiteURL" select="concat(' http://',string(umbraco.library:RequestServerVariables('HTTP_HOST')))"/>

Das RSS-Feed zu einem bestimmten Tag

Um ein RSS-Feed für ein einzelnes Tag zu erzeugen, müssen wir nur das XSLT-Makro zur Auflistung der Blog-Beiträge dahingehend erweitern, dass wir auschließlich die Beiträge listen, die mit dem übergebene Tag markiert sind. Fall dieses Tag nicht verfügbar ist werden weiterhin alle Blog-Beiträge angezeigt. Wir verwenden dazu den Request-Parameter "tag" wie z.B. in /rss.aspx?tag=weihnachtskalender. Somit prüfen wir zunächst, ob der Request-Parameter verfügbar ist. Falls nicht, so selektieren wir alle Beiträge (und behalten dadurch auch die bisherige Funktionalität bei). Wenn der Tag-Parameter aber übergeben wurde, so filtern wir die Blog-Beiträge, um nur diejenigen Einträge auszuwählen, die dieses Tag enthalten:

    <xsl:choose>
        <xsl:when test="string-length(umbraco.library:Request('tag')) &gt; 0">
            <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPost' and contains(Exslt.ExsltStrings:lowercase(./data [@alias='tags']), Exslt.ExsltStrings:lowercase(umbraco.library:Request('tag')))]">
                      <xsl:sort select="@createDate" order="descending" />
                    </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
            <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPost']">
                      <xsl:sort select="@createDate" order="descending" />
                    </xsl:apply-templates>
        </xsl:otherwise>
    </xsl:choose>

Um ein gut strukturiertes URL Schema bereitzustellen, schreiben wir eine URL-Rewriting Regel in die Konfigurationsdatei /config/UrlRewriting.config. Diese wird uns URLs vom Format /rss?tag=weihnachtskalender in das Suchmaschinen-freundlichere Schema /rss/tags/weihnachtskalender umwandeln:

<add name="rsstagrewrite"
    virtualUrl="^~/blog/rss/tags/(.*).aspx"
    rewriteUrlParameter="ExcludeFromClientQueryString"
    destinationUrl="~/blog/rss.aspx?tag=$1"
    ignoreCase="true" />

Ein RSS-Feed für Kommentare

Auch für das Feed der Kommentare sind wir in der Lage, den Großteil des XSLT-Skripts weiter zu verwenden. Wir müssen dazu nur wissen, ob wir einen Kommentar-Feed oder einen Blog-Beitrags-Feed erzeugen sollen (wir müssen ja dazu zwei unterschiedliche Dokumente abfragen, und diese besitzen eine unterschiedliche Datenstruktur). Zu diesem Zweck werden wir einen Parameter zum Blog-RSS Makro hinzufügen, welchen wir mit dem Alias "iscommentfeed" benennen:

image_2

Zusätzlich erzeugen wir eine neue Dokumentvorlage mit dem Alias "CommentRss". Diese verwenden wir auf die gleiche Art und Weise wie die RSS-Vorlage (nämlich als eine alternative Dokumentvorlage). Der einzige Unterschied zwischen den beiden Vorlagen besteht darin, dass wir den Wert des Parameters "iscommentfeed" entsprechend zuweisen.

Somit müssen wir unser XSLT-Skript für das Blog RSS Makro zunächst um die Variable iscommentfeed erweitern:

<xsl:variable name="iscommentfeed" select="//macro/iscommentfeed" />

Danach werden wir als erstes diese Variable abfragen, um auszuwählen, welcher Dokumenttyp verarbeitet werden soll. Im Fall, dass die Variable den Wert 1 (für True) besitzt, so müssen wir statt der Beiträge die Kommentare selektieren :

<xsl:when test="$iscommentfeed = '1'">
    <xsl:apply-templates select="$currentPage//node [@nodeTypeAlias = 'BlogPostComment']">
        <xsl:sort select="@createDate" order="descending" />
    </xsl:apply-templates>
</xsl:when>

Weiterhin müssen wir noch den Teil des XSLT-Skripts anpassen, der die einzelnen RSS-Elemente ausgibt. Beiträge und Kommentare besitzen ja eine andere URL und auch eine unterschiedliche Dokumentstruktur (der Inhalt eines Beitrags wird in der Eigenschaft bodyText gespeichert, der Inhalt eines Kommentars hingegen in der Eigenschaft comment). Die Anpassung nehmen wir wie folgt vor:

    <xsl:variable name="link">
        <xsl:choose>
            <xsl:when test="@nodeTypeAlias = 'BlogPostComment'">
                <xsl:value-of select="concat(umbraco.library:NiceUrl(./../@id),'#comment-',@id)"/>
            </xsl:when>
            <xsl:otherwise>
                 <xsl:value-of select="umbraco.library:NiceUrl(@id)"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>
    <xsl:variable name="content">
        <xsl:choose>
            <xsl:when test="@nodeTypeAlias = 'BlogPostComment'">
                 <xsl:value-of select="umbraco.library:ReplaceLineBreaks(data [@alias = 'comment'])"/>
            </xsl:when>
            <xsl:otherwise>
                <xsl:value-of select="./data [@alias='bodyText']"/>
            </xsl:otherwise>
        </xsl:choose>
    </xsl:variable>

Das Kommentar-Feed für einen Beitrag

Eine gute Nachricht vorweg: Für die Bereitstellung eines Kommentar-Feeds für jeden Beitrag müssen wir überhaupt nichts an dem XSLT-Skript ändern. Das liegt daran, dass wir ja alle Kommentare, die unterhalb des aktuellen Dokuments angeordnet sind, mit dem XPath-Selektor ($currentPage // node [@ nodeTypeAlias = 'BlogPostComment']) auswählen.

Wenn also die Dokumentvorlage "commentsrss" auf der Startseite des Blogs angewendet wird (/Blog/commentrss.aspx), so werden alle darunter angeordneten Kommentare aufgelistet. Aber wenn die Dokumentvorlage zu einem bestimmten Blog-Beitrag benutzt wird (z.B. blog/2009/12/3/kalendertuer/commentrss.aspx), dann erscheinen eben nur die Kommentare zu diesem Beitrag.

Die letzten Anpassungen

Zum Schluss müssen wir noch das XSLT-Skript anpassen, welches verantwortlich für die Ausgabe der Links auf die RSS-Feeds ist.

Für den Fall, dass wir gerade die Beiträge zu einem bestimmten Tag anzeigen, so müssen wir auch einen Link auf den RSS-Feed für genau dieses Tag hinzufügen (also z.B. /rss/tags/weihnachtskalender.aspx).

<xsl:if test="string-length(umbraco.library:Request('filterby')) &gt; 0">
    <link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/ancestor-or-self::node [@nodeTypeAlias = 'Blog']/@id),'.aspx',concat('/rss/tags/',umbraco.library:Request('filterby'),'.aspx'))}" rel="alternate" type="application/rss+xml" title="RSS Feed for tag {umbraco.library:Request('filterby')}" />
</xsl:if>

Weiterhin müssen wir noch einen Link anzeigen, der auf das Kommentar-Feed verweist (und welches auf eine alternative Dokumentvorlage mit der Bezeichnung "commentrss" für die Startseite verweist):

<link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/ancestor-or-self::node [@nodeTypeAlias = 'Blog']/@id),'.aspx','/commentrss.aspx')}" rel="alternate" type="application/rss+xml" title="Comments RSS Feed" />

Und wenn wir gerade einen Blog-Beitrag anzeigen (wir können dies überprüfen, indem wir den Alias des Dokumenttyps abfragen), so fügen wir auch noch einen Link auf den Kommentar-Feed für diesen spezifischen Blog-Beitrag hinzu.

<xsl:if test="$currentPage/@nodeTypeAlias = 'BlogPost'">
    <link href="{umbraco.library:Replace(umbraco.library:NiceUrl($currentPage/@id),'.aspx','/commentrss.aspx')}" rel="alternate" type="application/rss+xml" title="Comments RSS Feed for {$currentPage/@nodeName}" />
</xsl:if>

Das Resultat

Damit haben wir nun auf der Startseite des Blogs das Haupt RSS Feed und das RSS Feed der Kommentare:

image_3

Auf einer Beitragsseite haben wir zusätzlich den Kommentar-Feed für Kommentare exklusiv zu diesem:

image_4

Und wenn wir die Beiträge zu einem bestimmten Tag anzeigen haben wir auch einen Feed für dieses Tag:

image_5

5 Kommentar(e) zu “Blog 4 Umbraco 2.0.4 - RSS Feeds”

  1. Maverick schrieb:
    Stands back from the keyboard in aamzeemnt! Thanks!
  2. Bobcat schrieb:
    With the bases loaded you srutck us out with that answer!
  3. Marsue schrieb:
    What a joy to find someone else who tnhiks this way.
  4. pjhjwwjgl schrieb:
    RiYErP , [url=http://pgjevpkmchdu.com/]pgjevpkmchdu[/url], [link=http://xmjzokzoewrh.com/]xmjzokzoewrh[/link], http://yyvgtiohouta.com/
  5. eliish schrieb:
    xTdMrw , [url=http://xwjkvshelwrs.com/]xwjkvshelwrs[/url], [link=http://qgtfdmlolavp.com/]qgtfdmlolavp[/link], http://zdgiogbpoqyz.com/

Beitrag kommentieren:


wird nicht angezeigt


optional - bitte mit http://



Bitte geben Sie den im darüberliegenden Bild erkennbaren Sicherheitscode ein, um einen SPAM-Missbrauch des Formulars zu verhindern.