Ein Kommentarsystem für Kirby, Teil 2

Profilbild von Florian Schmidt
Vom 17. Oktober 2016

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:

mail.php
$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.

kommentare.php
<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.

controller.php
<?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

Du suchst die Kommentare?

Keine Sorge, die sind nicht verloren! Es dauert aber noch eine Weile, bis sie wieder zu sehen sind und du neue Kommentare hinterlassen kannst.

Netzleben ist frisch von einer alten Kirby-Website auf eine neue, Statamic-basierte Website umgezogen. Leider ist das Plugin für Kommentare mit Statamic 3 noch nicht kompatibel.