Ich habe dir ja schon vor kurzem erklärt, wie du für Kirby ein eigenes Kommentarsystem einbauen kannst. Hier gibt es aber noch einige kleine Probleme, die in diesem Beitrag gelöst werden. Neben Mailbenachrichtigungen bauen wir auch eine Übersichtsseite, mit der du für alle Artikel direkt die Kommentare freischalten kannst.
Dieser Artikel wurde zuletzt vor über einem Jahr aktualisiert. Die Inhalte könnten inzwischen nicht mehr aktuell sein.
Hinweis per Mail verschicken
Das aktuelle Problem am Code ist, dass die Kommentare zwar abgesendet werden können, du allerdings keinerlei Benachrichtigung bekommst, wenn ein neuer Kommentar eingeht. Blöd vor allem, wenn du jeden Kommentar händisch freischaltest.
So schwierig ist das aber nicht einzubauen, da der Mailversand einfach nur in den bestehenden Controller eingebunden werden muss. Du musst vor der Zeile, in der zum eigentlichen Artikel weitergeleitet wird (go($page->uid()...
) folgenden Code einfügen:
$mailheader = "[Kommentar]";
$mailheader .= '[Moderieren]';
$mailheader .= " " . $page->title();
$mailcontent = "Hey.\nEs gibt einen neuen Kommentar!\n\nName: ".$data["name"]."\nKommentar: ".$data["message"]."\n\n";
$mailcontent .= $site->url()."/kommentare/\nEs gruesst,\ndein Blog";
$mailcontent = sonderzeichen($mailcontent);
$email = new Email(array(
'to' => 'kommentar@deinedomain.de',
'from' => 'blog@deinedomain.de',
'subject' => $mailheader,
'body' => $mailcontent,
));
$email->send();
Nun wird jeden Mal, wenn jemand einen Kommentar hinterlässt, automatisch eine Mail an die oben konfigurierte Adresse versandt.
Zentrale Kommentarseite
Für jeden einzelnen Kommentar auf die Seite des jeweiligen Artikels im Panel zu gehen ist ziemlich umständlich. Aber auch das ist ziemlich einfach zu lösen, indem du einfach eine neue Seite anlegst, auf der du alle Kommentare sehen und freischalten kannst.
Bei mir liegt diese unter /kommentare
und ist öffentlich sichtbar. Kommentare freischalten (oder löschen) ist jedoch nur möglich, wenn man angemeldet ist.
Den folgenden Code kannst du einfach als Template (zum Beispiel kommentare.php
) unter site/templates
speichern. Vergiss auch nicht, deine weiteren Snippets (wie Header und Sidebar) einzubinden, damit die Seite dem sonstigen Design der Website folgt.
<div class="col-md-8">
<?php
function cmp($a, $b)
{
return strcmp($a->datum, $b->datum);
}
class kommentar
{
public $titel;
public $url;
public $uid;
public $name;
public $message;
public $datum;
public $sichtbar;
public $id;
};
$kommentarliste = array();
foreach ($site->find('blog')->children()->visible() as $artikel) {
foreach ($artikel->comments()->yaml() as $kommentar) {
$dieserkommentar = new kommentar();
$dieserkommentar->titel = $artikel->title();
$dieserkommentar->url = $artikel->url();
$dieserkommentar->uid = $artikel->uid();
$dieserkommentar->message = $kommentar["message"];
$dieserkommentar->name = $kommentar["name"];
$dieserkommentar->datum = strtotime($kommentar["datum"] . " " . $kommentar["zeit"]);
$dieserkommentar->sichtbar = $kommentar["approved"];
$dieserkommentar->id = $kommentar["nummer"];
$kommentarliste[] = $dieserkommentar;
}
}
usort($kommentarliste, "cmp");
$kommentarliste = array_reverse($kommentarliste);
?>
<div class="media-blog">
<div class="row">
<div class="col-sm-12">
<h3 class="title-md hr-left mb-40">Alle Kommentare</h3>
<?php
$eingeloggt = false;
if ($site->user() != false) {
$eingeloggt = true;
}
foreach ($kommentarliste as $comment):
if (!$eingeloggt && $comment->sichtbar == 0) continue;
?>
<div class="media">
<div class="media-body">
<h4 class="media-heading"><?php echo htmlspecialchars($comment->name) ?></h4>
<h5>in <em><?= $comment->titel; ?></em></h5>
<ul class="list-unstyled list-inline post-date-author">
<li>
<a href="<?php echo $comment->url . "/#kommentar" . $comment->id; ?>"><?php echo strftime("%e. %B %G, %H:%M", $comment->datum); ?></a>
</li>
</ul>
<?php echo markdown(htmlspecialchars($comment->message)); ?>
<?php if ($eingeloggt && $comment->sichtbar == 0): ?>
<form>
<input type="hidden" id="uid" name="uid" value="<?= $comment->uid ?>">
<input type="hidden" id="id" name="id" value="<?= $comment->id ?>">
<input type="hidden" id="aktion" name="aktion" value="bestätigen">
<input class="btn btn-success" type="submit" name="submit"
value="Bestätigen">
</form>
<form>
<input type="hidden" id="uid" name="uid" value="<?= $comment->uid ?>">
<input type="hidden" id="id" name="id" value="<?= $comment->id ?>">
<input type="hidden" id="aktion" name="aktion" value="löschen">
<input class="btn btn-danger" type="submit" name="submit"
value="Löschen">
</form>
<?php endif; ?>
</div>
</div>
<hr>
<?php endforeach; ?>
</div>
</div>
</div>
</div>
Aber auch hier brauchen wir wieder einen Controller, der sich darum kümmert beim Klick auf den Button den Kommentar auch wirklich freizuschalten bzw. zu löschen. Wie immer unter site/controllers/kommentare.php
speichern.
<?php
return function ($site, $pages, $page) {
if (get('submit') ) {
$kommentarliste = $site->find('blog')->find(get("uid"))->comments()->yaml();
$neuekommentarliste = array();
foreach ($kommentarliste as $key => $kommentar) {
if ($kommentar["nummer"] != get("id")) {
$neuekommentarliste[] = $kommentar;
continue;
}
if (get("aktion") == "bestätigen") $kommentar["approved"] = 1;
if (get("aktion") == "löschen") continue;
$neuekommentarliste[] = $kommentar;
}
$site->find('blog')->find(get("uid"))->update(array(
'comments' => yaml::encode($neuekommentarliste),
));
go($page->uid());
}
} ?>
Fazit
Du solltest nun ein vollständiges Kommentarsystem für Kirby haben. Kommentare können hinterlassen und auch angezeigt werden, außerdem gibt es eine Moderationsfunktion, sodass du damit keinen Spam oder unerwünschte Kommentare auf dem Blog hast. Falls du sonst noch Anregungen hast, darfst du sie gerne in den Kommentaren hinterlassen!
- # Webentwicklung
- # Kirby
- # Kommentare