Blog 4 Umbraco 2.0.5 - Kommentare

Samstag, 5. Dezember 2009 von Immo Wache
Kategorien: Umbraco  Blog  deutsch  C#  Weihnachtskalender 

Original von Tim Geyssens

Heute werden wir eine Verbesserung am Blog 4 Umbraco Package vornehmen, die keinen Einfluss auf das Frontend des Blogs nehmen wird. Dafür aber wird sie es uns viel einfacher machen die Kommentare zu verwalten und Spam-Kommentare zu behandeln. Wir werden dazu die Kommentare nicht mehr als Dokumente ablegen, sondern sie statt dessen in einer zusätzlichen Datenbanktabelle speichern. Diese Tabelle werden wir dann mit einigen XSLT-Erweiterungen abfragen. Noch niemals was von XSLT-Erweiterungen gehört? Dann ist die Umbraco-TV Folge über XSLT-Erweiterungen (Introduction to XSLT Extenstions) genau das Richtige

Zum Ersten

Der erste Schritt besteht darin, die neue Tabelle zu erstellen. Dazu müssen wir Werte für die Post-ID und den eigentlichen Kommentar (Name, E-Mail, Website, Kommentartext) sowie auch ein zusätzliches Feld zur Markierung von Spam anlegen:

CREATE TABLE [Comment](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [blogid] [int] NOT NULL,
    [postid] [int] NOT NULL,
    [name] [nvarchar](250) NULL,
    [email] [nvarchar](250) NULL,
    [website] [nvarchar](250) NULL,
    [comment] [text] NULL,
    [spam] [bit] NULL,
    [created] [datetime] NULL,
CONSTRAINT [PK_Comment] PRIMARY KEY CLUSTERED
(
    [id] ASC
)

Dies ist das Erstellungs-Skript für den SQL-Server, wir werden auch Skripte zur Erstellung mit VistaDB und MySQL im Installer einfügen.

Kommentare speichern

Anstatt ein Kommentar-Dokument über das Umbraco API anlegen zu lassen, werden wir die Methode zum Einfügen eines Datensatzes in die neue Tabelle überarbeiten. Wir verwenden dazu den Umbraco Datalayer, um sicherzustellen, dass es sowohl mit SQL-Server aus auch mit VistaDB und MySQL funktioniert.

ISqlHelper SqlHelper = DataLayerHelper.CreateSqlHelper(umbraco.GlobalSettings.DbDSN);
SqlHelper.ExecuteNonQuery(
    @"insert into Comment(blogid,postid,name,email,website,comment,spam,created)
    values(@blogid,@postid,@name,@email,@website,@comment,@spam,@created)",
    SqlHelper.CreateParameter("@blogid", blogid),
    SqlHelper.CreateParameter("@postid", blogpost.Id),
    SqlHelper.CreateParameter("@name", name),
    SqlHelper.CreateParameter("@email", email),
    SqlHelper.CreateParameter("@website", website),
    SqlHelper.CreateParameter("@comment", comment),
    SqlHelper.CreateParameter("@spam", false),
    SqlHelper.CreateParameter("@created", DateTime.Now));

Kommentare anzeigen

Zum Anzeigen der Kommentare werden wir einige neue Methoden zu den XSLT-Erweiterungen unseres Blogs hinzufügen. Prinzipiell wollen wir entweder alle oder nur die zu einem einzelnen Beitrag gehörenden Kommentare auswählen. Daher benötigen wir eine GetComments() und eine GetCommentsForBlog(int id) Methode. Beide werden eine XML-Struktur zurück liefern (mittels XPathNodeIterator), die wie folgt aussieht:

<comments>
  <comment id="2" postid="1206" created="7/12/2009 16:22:28">
    <name>Tim Geyssens</name>
    <email>myemail@domain.com</email>
    <website>http://www.umbraco.org</website>
    <message>This should be stored in the database</message>
  </comment>
</comments>

Wir verwenden auch hier den Umbraco Datalayer, um diese Abfragen auszuführen. Zusätzlich fügen wir eine Methode hinzu, um den Kommentar-XML von einem RecordsReader zu erzeugen.

public static XPathNodeIterator GetCommentsForPost(int id)
{
    ISqlHelper SqlHelper = DataLayerHelper.CreateSqlHelper(umbraco.GlobalSettings.DbDSN);
    IRecordsReader rr = SqlHelper.ExecuteReader(
        "select * from comment where postid = @postid and spam != 1",
        SqlHelper.CreateParameter("@postid", id));

    return CommentsToXml(rr);
}

private static XPathNodeIterator CommentsToXml(IRecordsReader rr)
{
    XmlDocument xd = new XmlDocument();
    XmlNode x = umbraco.xmlHelper.addTextNode(xd, "comments", "");

    while (rr.Read())
    {
        XmlNode c = xd.CreateElement("comment");

        c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "id", rr.GetInt("id").ToString()));
        c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "postid", rr.GetInt("postid").ToString()));
        c.Attributes.Append(umbraco.xmlHelper.addAttribute(xd, "created", rr.GetDateTime("created").ToString()));

        c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "name", rr.GetString("name")));
        c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "email", rr.GetString("email")));
        c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "website", rr.GetString("website")));
        c.AppendChild(umbraco.xmlHelper.addCDataNode(xd, "message", rr.GetString("comment")));

        x.AppendChild(c);
    }

    xd.AppendChild(x);

    return xd.CreateNavigator().Select(".");
}

Mit der neuen XSLT-Erweiterung an Ort und Stelle müssen wir nur noch unser XSLT aktualisieren, um mit deren Hilfe die Kommentare auszulesen.

<h3 id="comments">
<xsl:value-of select="count(BlogLibrary:GetCommentsForPost($currentPage/@id)//comment)"/> comment(s)  for  &#8220;<xsl:value-of select="$currentPage/@nodeName"/>&#8221;</h3>

<ol class="commentlist">
<xsl:for-each select="BlogLibrary:GetCommentsForPost($currentPage/@id)//comment">

<li class="alt" id="comment-{@id}">
<div class="commentcontent">
    <div class="commentgravatar" style="float:right;margin-right: 5px;">
        <img width="40px" height="40px" src="{BlogLibrary:getGravatar(./email, 40, '')}" alt="Gravatar of {./name}"/>
    </div>
    <cite>  <xsl:value-of select="./name"/> </cite> Says: <br />
    <small class="commentmetadata"><xsl:value-of select="umbraco.library:LongDate(@created)"/> </small>
    <xsl:value-of select="umbraco.library:ReplaceLineBreaks(./message)" disable-output-escaping="yes"/>
</div>

</li>
</xsl:for-each>
</ol>

Das war's! Anstatt Dokumente zu verwenden werden die Blog Kommentare jetzt über eine zusätzliche Tabelle gespeichert und ausgelesen.

3 Kommentar(e) zu “Blog 4 Umbraco 2.0.5 - Kommentare”

  1. Matee schrieb:
    Wow, that’s a really cvleer way of thinking about it!
  2. enrhgngqfc schrieb:
    onvnwh , [url=http://mxxtigspnwgd.com/]mxxtigspnwgd[/url], [link=http://hjcqwjkfedev.com/]hjcqwjkfedev[/link], http://wmryrfazpwvb.com/
  3. zjydylkoafv schrieb:
    B3uUDs , [url=http://xkoqmjbppicr.com/]xkoqmjbppicr[/url], [link=http://pgwpogytalav.com/]pgwpogytalav[/link], http://npbtfhxusxui.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.