Kommentare für Kirby

Ein Kommentarsystem für Kirby, Teil 2

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.

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.

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!

Facebook Twitter Google+ WhatsApp

von Florian Schmidt

Gründer von Netzleben. Studiert IT System Engineering am Hasso-Plattner-Institut in Potsdam. Kauft viel zu viel Technik online ein. Liebt Kekse.

Hinterlasse einen Kommentar

Kommentare

Katze

$eingeloggt = false;
if ($site->user() != false) {
$eingeloggt = true;

So geht&#39;s auch:

$eingeloggt = $site->user() ? true : false;

Hierauf antworten