Blog 4 Umbraco 2.0.5 - Kommentare
Samstag, 5. Dezember 2009 von Immo WacheKategorien: 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 “<xsl:value-of select="$currentPage/@nodeName"/>”</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.
Montag, 16. Mai 2011 um 07:58 UhrWow, thats a really cvleer way of thinking about it!
Samstag, 21. Mai 2011 um 13:56 Uhronvnwh , [url=http://mxxtigspnwgd.com/]mxxtigspnwgd[/url], [link=http://hjcqwjkfedev.com/]hjcqwjkfedev[/link], http://wmryrfazpwvb.com/
Montag, 30. Mai 2011 um 10:09 UhrB3uUDs , [url=http://xkoqmjbppicr.com/]xkoqmjbppicr[/url], [link=http://pgwpogytalav.com/]pgwpogytalav[/link], http://npbtfhxusxui.com/