8t88's CMS - Archiv - FAQ

Geschrieben von Marko Kleen am Tuesday May 22, 2018

Philosophie

  • Warum hast Du "8t88's CMS" geschrieben?
  • Was hast Du gegen eine Datenbank?


Funktionen

  • Was ist mit der Checkbox im Gästebuch passiert?
  • Wie funktioniert das Kontaktformular? (FormMailer)
  • Was passiert, wenn der Beitrag gelöscht wird, den ich gerade bearbeite?
  • Anti-SPAM im FormMailer? Wie funktioniert das?


Fehlerbehebung

  • Mein neu geschriebenes Plugin funktioniert nicht!
  • Die farbliche Hervorhebung der Suchfunktion funktioniert nicht!
  • Das "8t88's CMS" beschwert sich über ein fehlendes DBI Modul!
  • Der FormMailer funktioniert nicht!


Plugins

  • Basics: DB-Strukturen im Überblick
  • Basics: Systemvariablen im Überblick
  • Basics: Systemfunktionen im Überblick
  • Das Bildergalerie-Plugin im Überblick


Kosmetisches

  • Wie kann ich das Aussehen der Kategorienelemente manipulieren?
  • Wie kann ich den "/cgi-bin/index.pl" Teil der URL verschwinden lassen?

FAQ: Anti-SPAM im FormMailer? Wie funktioniert das?

Grundsätzlich
Anti-SPAM Funktionen sind nichts Neues in 8t88's CMS v2 - sie sind für das Gästebuch und die Kommentarfunktionen bereits seit 2007 fester Bestandteil. Nur der FormMailer blieb davon bislang ausgenommen, was SPAM-Bots erlaubte SPAM-Mails an die in 8t88's CMS v2 hinterlegte eMail Adresse zu senden. Das wurde jetzt korrigiert.

Wie funktioniert der SPAM-Schutz?
Zunächst einmal bleibt festzuhalten, dass 8t88's CMS v2 nicht unterscheiden kann, ob der zu übermittelnde Formularinhalt von einem Menschen oder einem SPAM-Bot stammt. Dazu muss man wissen, dass solche Bots zwar Formulardaten "submitten" können, jedoch afaik keine Knöpfe klicken. Aus diesem Grund muss sichergestellt werden, dass nur solche Formulare übermittelt werden, die per "Click" auf den "Submit" Button abgeschickt wurden.

8t88's CMS v2 bedient sich hier eines Tricks:

  • Zusätzlich zum Formularinhalt wird ein verdecktes Eingabefeld mit dem Namen "human" übermittelt.
  • Der Wert des "human" Eingabefelds wird mit der aktuellen Serverzeit in Form eines Perl Timestamp belegt.
  • 8t88's CMS v2 akzeptiert das Formular nur unter der Voraussetzung, dass der übermittelte Timestamp
    a) ein positiver Integer Wert ist, und 
    b) nicht in der Zukunft liegt (Serverzeit > Timestamp), und 
    c) nicht älter als 30 Minuten ist (Timestamp > (Serverzeit - 1800))!


Wie bekomme ich die aktuelle Serverzeit in mein Formular?
Hier kommt das brandneue Makro <!--TIMESTAMP--> zum Zug.

Ein Beispiel für ein Kontaktformular mit SPAM-Schutz

<form action="?" method="post">
Name
<input name="name" />
eMail
<input name="email" />
Nachricht
<textarea name="nachricht"></textarea>
<input type="submit" value="absenden" onclick="document.getElementsByName(&quot;human&quot;)[0].value=<!--TIMESTAMP-->;" />
<input type="hidden" name="human" value="0" />
<input type="hidden" name="formmail" value="1" />
<input type="hidden" name="required" value="nachricht" /></form>
  • Für den SPAM-Bot präsentieren wir das verdeckte "human" Feld (mit dem Wert "0" vorbelegt)
  • Erst beim Absenden des Formulars ersetzt der JavaScript Code oben den Feldwert durch die Serverzeit,
    repräsentiert durch <!--TIMESTAMP-->
  • Der SPAM-Bot bekommt hiervon nichts mit und übermittelt Schrottdaten im Feld "human"!
  • Resultat:
    a) Der SPAM-Bot verfehlt sein Ziel, die Formulardaten werden nicht übermittelt!
    b) Der "normale", legitime Besucher bekommt von all dem nichts mit.


Der SPAM-Schutz im Gästebuch und in der Kommentarfunktion funktioniert (schon immer!) genau so!

FAQ: Das Bildergalerie-Plugin im Überblick

Funktionen

  • Das "gallery" Plugin fungiert als FrontEnd zu einem Bilderverzeichnis, das sich irgendwo auf Ihrem Webserver befinden kann.
  • Der Webserver sollte Schreibrechte auf das Bilderverzeichnis besitzen, da anderenfalls die Bildrotations- und Beschriftungsfunktionen nicht genutzt werden können!
  • Jedes Unterverzeichnis im Bilderverzeichnis (eine Ebene) stellt eine Galerie dar.
  • Die Verzeichnisnamen sind die Namen der Galerien. Rekursion in weitere Unterverzeichnisse wird nicht unterstützt!
  • Jede Galerie kann selektiv mit einem Zugangsschutz versehen werden.
  • Jede Galerie kann alternativ ein Galeriebild zur besseren Unterscheidung der Galerien untereinander erhalten.
  • Jedes einzelne Bild innerhalb einer Galerie kann beschriftet werden.
  • Beschriftungen werden unterhalb des jeweiligen Bildes angezeigt.


Technische Details

  • An "8t88's CMS v2" angemeldete Benutzer haben Zugriff auf alle Funktionen und Galerien der Bildergalerie.
  • Nicht angemeldete Benutzer können nur Bilder der nicht-geschützen Galerien ansehen,
  • oder müssen sich mit Benutzername und Passwort an den geschützen Galerien anmelden.
  • Das "gallery" Plugin legt eine neue Tabelle "galleries" in 8t88's Datenbank an. In diese Tabelle werden Informationen wie Zugangsdaten zu den jeweiligen Galerien, Galeriebilder und SessionIDs abgelegt.
  • Das "gallery" Plugin benötigt zur einwandfreien Funktion das exzellente "Image::ExifTool" Perlmodul, welches Sie z.B. unter Debian sehr einfach mittels root@host:~$ apt-get install libimage-exiftool-perl nachinstallieren können.
  • Damit der Zugangsschutz für "Private Galerien" nicht nutzlos wird sollte sich das Bilderverzeichnis nicht im DocumentRoot befinden.
  • Sollte sich das nicht vermeiden lassen legen Sie eine ".htaccess" Datei im Bilderverzeichnis ab, Inhalt: deny from all
    Damit sperren Sie unerwünschte Zaungäste wirksam aus! (Probieren Sie es aus! ;-))
  • In der "Indexansicht" werden kleinere Versionen ("Thumbnails") Ihrer Bilder angezeigt, um das zu übertragene Datenvolumen gering zu halten. Diese Vorschaubilder können etwas grobkörnig wirken.


Hinweise

  • Galeriebild und Zugriffsschutz einer Galerie schließen sich gegenseitig aus. Geschützte Galerien haben kein Galeriebild!
  • Trotz gleichlautender Option kann das "gallery" Plugin Bilder nicht drehen. Statt dessen schreibt es Informationen zur Bildausrichtung ("Exif") in die Bilddatei.
  • Die Vorschaubilder können derzeit nicht "gedreht" werden.
  • Damit die so "bearbeiteten" Bilder in der Einzelansicht richtig dargestellt werden ist ein geeignetes Anzeigeprogramm nötig.
  • Im FireFox- oder InternetExplorer Webbrowser werden diese Bilder evtl. nicht gedreht angezeigt, so dass diese Funktion dort scheinbar keine Auswirkungen haben kann - die "Exif-Info" der Bilder wird dort schlicht nicht ausgewertet!
  • Das "gallery" Plugin verfügt über keinerlei Mechanismen Bilder zu Galerien hinzuzufügen, zu entfernen, umzubenennen, etc.pp.
  • Sie können hierfür ggf. 8t88's Dateimanager verwenden.

FAQ: Mein neu geschriebenes Plugin funktioniert nicht!

"8t88's CMS v2" Plugin System ist so ausgelegt, dass fehlerhafte Plugins das Gesamtsystem nicht beeinträchtigen.
Genauer: Erzeugt ein Plugin einen Fehler, dann wird es stillschweigend ignoriert!

Wenn Plugins generell funktionieren,
aber Ihr neu geschriebenes Plugin nicht, können Sie die Option "Debug-Modus für Plugins" in den CMS Systemeinstellungen aktivieren. Nun bricht das CMS die Ausführung Ihres Plugins mit einer Fehlermeldung ab, die Ihnen die gezielte Fehlersuche und -behebung ermöglicht.
(Sie sollten diese Option nach Abschluss der Arbeiten wieder deaktivieren!)

Wenn Plugins überhaupt nicht funktionieren

  • sollten Sie zunächst überprüfen, ob das Plugin-System in den CMS Systemeinstellungen aktiviert wurde!
  • Rufen Sie anschließend die Plugin-Übersicht auf! Dort sollten jetzt alle installierten Plugins aufgelistet sein!
  • Sind in der Übersicht keine Plugins aufgeführt prüfen Sie den Speicherort für Ihre Plugins. "8t88's CMS v2" erwartet seine Plugins in einem Unterverzeichnis "plugins" im selben Ordner, der auch die "index.pl" (das CMS selbst) enthält!
    (Sie können den Speicherort des Plugin Verzeichnisses im Kopf der "index.pl" ändern!)
  • Tauchen die Plugins noch immer nicht in der Übersicht auf, dann stimmt etwas mit den Plugin-Dateien nicht, oder Ihr Webserver hat keinen Lesezugriff auf das Plugins-Verzeichnis!

Basics: DB-Strukturen im Überblick

Tabelle Felder Beschreibung
config option
value
Name der Option
Wert der Option
flock id
name
user
ID der Dateisperre
ID des gesperrten Beitrags
Name des "Besitzers" der Dateisperre
user id
name
pass
realname
Session-ID der aktuellen Sitzung
Login-Name
Passwort (crypt-verschlüsselt)
Anzeigename
comments id
reference
name
email
comment
ID des Kommentars
ID des zugehörigen Beitrags
Name des Kommentarschreibers
eMail-Adresse des Kommentarschreibers
Der abgegebene Kommentar
story id
name
time
content
category
sticky
ID des Beitrags
Login- bzw Anzeigename des Verfassers
Erstellungszeitpunkt des Beitrags (UNIX Timestamp)
Inhalt des Beitrags
Die gewählte Kategorie
Beitrag ist "sticky" (1/0)
gbook id
name
time
content
comment
email
url
ip
ID des Gästebucheintrags
Name des Gästebuchschreibers
Zeitpunkt des Gästebucheintrags (UNIX Timestamp)
Inhalt des Gästebucheintrags
Antwort des Gästebuchbesitzers
eMail-Adresse des Gästebuchschreibers
Homepage des Gästebuchschreibers
IP-Adresse des Gästebuchschreibers

Basics: Systemfunktionen im Überblick

Name Parameter Beschreibung und Rückgabewerte
embed_ Makroname Generiert aktive Inhalte, z.B. aus Plugins.
Gibt im Fehlerfall "undef" zurück!
use_plugin Plugintyp
Pluginname
String (optional)
Wendet ein anzugebenes Plugin an. Dieses kann entweder ein Makro sein, oder den optional übergebenen Text manipulieren.
Gibt im Fehlerfall "undef" zurück!
latest5 - Gibt eine Liste mit den Überschriften der fünf neuesten, im CMS gespeicherten Beiträge zurück.
gbook reserviert CMS-eigene Gästebuchfunktion
comment reserviert CMS-eigene Kommentarverarbeitung
read_content reserviert CMS-eigene Beitragsdarstellung
find_content reserviert CMS-eigene Suchfunktion
process Beitragstyp
(oder "undef")
String
"8t88's CMS v2" Blog Code System
Verarbeitet den übergebenen String, der entweder ein Artikel (undef) oder ein Gästebucheintrag (gbook) bzw. ein Kommentar (comment) sein kann.
story reserviert CMS-eigene Beitragsbearbeitung
filelock Story ID
Aktion
Verwaltung der Dateisperren von Beiträgen nach ID.
Aktion kann "0" sein (lockcheck), "1" (check) oder größer als Eins (override)!

Liefert "1" zurück, wenn der Beitrag innerhalb der Sperrzeit von einem anderen Benutzer bearbeitet wird. (check)
Liefert "undef" zurück wenn keine Sperre vorliegt oder eine Datei neu gesperrt wird. (override)
Liefert den Linktext zur Beitragsbearbeitung in der Betriebsart (lockcheck) zurück.
sendmail reserviert CMS-eigene Funktion zur Mailerzeugung
filemanager reserviert CMS-eigener Datei- und Linkmanager
admin reserviert CMS-eigene Systemverwaltung
changepw reserviert CMS-eigene Funktion zur Passwortänderung
check_login reserviert CMS-eigene Funktion zur Überprüfung der Gültigkeit einer Anmeldung
is_admin Login-Name Gibt "1" zurück, wenn der angemeldete Benutzer Admin-Rechte hat
realname Login-Name Gibt den Anzeigenamen für "Login-Name" zurück
make_salt - Generiert die Portion "Zufall", die für die crypt-Funktion bei der Passwort-Änderung benötigt wird
del_cookie - Löscht den Cookie auf dem Benutzerrechner. Die Sitzung wird damit terminiert!
set_cookie - Erzeugt einen neuen Cookie auf dem Benutzerrechner mit einer Haltbarkeit von $config{'expires'} Minuten
status Meldung
Farbwert
Gibt eine Meldung in der CMS Statuszeile (oberer Bildrand) mit übergebener Hintergrundfarbe aus. Wird kein Farbwert übergeben ist der Hintergrund minzgrün! (Status "ok")
create_db reserviert CMS-eigene Funktion zur Erstellung einer Datenbank nach der Installation
db_query SQL-Befehl
Bind-Vars (optional)
Liefert eine Liste (Strings) mit Ergebnissen aus der Datenbankoperation zurück.
read_categories reserviert CMS-eigene Funktion, die die Beiträge der einzelnen Kategorien auszählt und nach Vorgabe sortiert.
date2stamp Sekunde
Minute
Stunde
Tag
Monat
Jahr
Liefert den Unix Timestamp zum übergebenen Datum zurück. Ist "undef", wenn das übergebene Datum ungültig ist!
pretty_date Tag
Monat
Jahr
Formatiert das übergebene Datum nach TT.MM.JJJJ
pretty_time Stunde
Minute
Formatiert die Zeit nach HH:MM
stamp2date UNIX Timestamp Umkehrfunktion zu date2stamp, liefert eine Liste mit Sekunde, Minute, Stunde, Tag, Monat, Jahr zurück
default_css reserviert CMS-interne Funktion
default_js reserviert CMS-interne Funktion
default_content reserviert CMS-interne Funktion: Seite, die angezeigt wird, wenn noch keine Beiträge eingestellt wurden!
default_template reserviert CMS-interne Funktion

Basics: Systemvariablen im Überblick

Name Daten Beschreibung
$db String Enthält die SQLite Datenbank-Definition (bestehend aus Datenbank-Treiber und Dateiname)
$_[0] String Enthält den aktuellen Plugin-Typ (macro, override, articles, global, responses)
$_[1] String Enthält den Namen der Funktion bzw. des Makros (macro, override) bzw. den Namen des Plugins (articles, global, responses)
$_[2] String Enthält die mit dem Plugin zu manipulierenden Daten (nur articles, global, responses)
$_[3] String Enthält die ID des gerade aktuellen Beitrags/Artikels/etc. (nur articles, responses)
$path String Enthält den kompletten Pfad im Server-Dateisystem zur "index.pl"
$version String Enthält die Version der "index.pl"
$plugindir String Enthält das aktuell verwendete Plugin-Verzeichnis
$admin Boolean Ist "1" wenn der aktuell angemeldete Benutzer Administratorrechte hat
$user String Enthält den Anmeldenamen des angemeldeten Benutzers
$cat String Enthält den Namen der aktuell angezeigten Kategorie
$out String Enthält die Rohfassung der anzuzeigenden Seite
$session Integer Enthält den Anmeldezeitpunkt (Beginn der CMS Sitzung) des Benutzers als "UNIX Timestamp"
@categories Liste Enthält eine (sortierte) Liste der verwendeten Kategoriennamen
@tables Liste Enthält eine Liste der in der Datenbank vorhandenen Tabellennamen
%categories Hash Enthält eine (unsortierte) Liste mit den Kategoriennamen als Schlüssel und die Anzahl der Beiträge als Wert
=> {Name} Integer Enthält die Anzahl der Beiträge in der Kategorie {Name}
%config Hash Enthält die gesamte Konfiguration des "8t88's CMS v2" als (Schlüssel/Wert) Paare
=> 8t88.css String Enthält das globale Stylesheet für "8t88's CMS v2"
=> 8t88.js String Enthält das globale JavaScript für "8t88's CMS v2"
=> autosort Boolean Steuert, ob die Kategorien in der Übersicht automatisch oder manuell sortiert werden
=> break Integer Steuert die Darstellung des eingebauten Gästebuchs: Bei mehr als n Einträgen "blättern"
=> cat_count Boolean Steuert die Anzeige der Beitragszahl global in der Kategorienübersicht
=> cat_default String Enthält den Namen der als Standard festgelegten Kategorie (Startseite)
=> cat_order String Enthält die vom Benutzer sortierte Kategorienliste (in Form von kommaseparierten Kategoriennamen)
=> charset String Enthält den Ausgabezeichensatz des "8t88's CMS v2" Skripts
=> comments Integer Steuert die Verfügbarkeit des Kommentarsystems für Beiträge
=> expires Integer Steuert die maximale Gültigkeitsdauer einer "8t88's CMS v2" Sitzung (Minuten)
=> filelock Integer Steuert die maximale Gültigkeitsdauer einer Dateisperre (Minuten)
=> formmail String Enthält die Zieladresse für eMail-Benachrichtigungen
=> highlight Boolean Steuert die Highlight-Funktion zur Hervorhebung von Suchbegriffen in Suchergebnissen
=> language String Enthält das Kürzel für die Anzeigesprache (Standard: de)
=> meta String Enthält die META-Zeilen für die Ausgabe im HTML-Kopfbereich
=> notify Boolean Steuert, ob ein Gästebucheintrag oder Kommentar eine eMail-Benachrichtigung auslöst
=> plugins Boolean Steuert, ob das Plugin-System aktiv oder inaktiv ist. Wenn inaktiv, werden Plugins ignoriert.
=> sendmail String Enthält den Pfad zur Sendmail Executable
=> showip Boolean Steuert, ob bei Gästebucheinträgen die IP-Adresse des Absenders angezeigt wird
=> template String Enthält das Grundgerüst (Template) für die Ausgabe der Seite
=> title String Enthält die Überschrift unserer Webseite
%user Hash Enthält die Loginnamen mit den zugeordneten Anzeigenamen als (Schlüssel/Werte) Paare
=> {Name} String Enthält den Anzeigenamen des Benutzers {Name}

FAQ: Was passiert, wenn der Beitrag gelöscht wird, den ich gerade bearbeite?

Vorweg:
Wenn jemand einen Beitrag löschen will, den jemand anderer gerade bearbeitet, erhält er zunächst eine Warnmeldung vom CMS. Wenn diese Warnmeldung ignoriert und der zugehörige Beitrag bedenkenlos gelöscht wird, hat man ein ernstes Problem mit den angelegten Benutzern - diese sollten sich schließlich absprechen und zusammen arbeiten! 
Es ist nicht Aufgabe des CMS Probleme in der Absprache der Benutzer untereinander zu lösen oder diese zu bevormunden. Daher hindert das CMS auch keinen Benutzer daran, einen gegenwärtig durch einen anderen Benutzer in Bearbeitung befindlichen Artikel zu bearbeiten!

Ablauf:
Wenn ein anderer Benutzer den Beitrag löschen will an dem ich gerade selbst schreibe, muss er zunächst die Warnmeldung des CMS bestätigen, wodurch die Dateisperre aufgehoben und durch eine neue ersetzt wird. Der Beitrag "gehört" nun dem zweiten Benutzer.
Jetzt kann der Beitrag gelöscht werden. Dabei wird nicht nur die neu erstellte Dateisperre aus der Datenbank gelöscht, sondern auch der Beitrag selbst und alle (evtl. vorhandenen) verbundenen Kommentare.
Wenn ich nun meinen Beitrag speichere wird der zuvor vom anderen Benutzer gelöschte Beitrag wiederhergestellt - natürlich in meiner Fassung! Sind zum ursprünglichen Artikel Kommentare hinterlassen worden, sind diese unwiederbringlich verloren. Natürlich wäre es möglich - eine regelmäßige Datensicherung vorausgesetzt - zu einer früheren Version der Datenbank zurückzukehren, Datenverluste können aber nie völlig ausgeschlossen werden!

Fazit:
Wenn ein anderer Benutzer des CMS den Beitrag löscht, an dem ich gerade schreibe, merke ich davon selbst beim Speichern nichts. Schließlich wird der Beitrag in meiner Version wieder in die Datenbank geschrieben. Vermutlich würde ich mich aber wundern wohin die Kommentare verschwunden sind, die vielleicht vorher zu diesem Beitrag abgegeben und gespeichert wurden.

Wie kann ich das Aussehen der Kategorienelemente manipulieren?

Kategorienelemente können auf vier unterschiedliche Arten dargestellt werden:

  • Als einfaches Listenelement mit Beitragszahl
  • Als einfaches Listenelement ohne Beitragszahl
  • Als eingerücktes Listenelement mit Beitragszahl
  • Als eingerücktes Listenelement ohne Beitragszahl


Einfaches Listenelement mit Beitragszahl

  1. Schalten Sie die Anzeige der Beitragszahl in den CMS-Systemeinstellungen ein, oder
  2. hängen Sie dem Namen Ihrer Kategorie einen Unterstrich an, z.B. News_


Einfaches Listenelement ohne Beitragszahl

  • Schalten Sie die Anzeige der Beitragszahl in den CMS-Systemeinstellungen aus.


Eingerücktes Listenelement mit Beitragszahl

  • 1. Schalten Sie die Anzeige der Beitragszahl in den CMS-Systemeinstellungen ein, oder
    2.
     hängen Sie dem Namen Ihrer Kategorie einen Unterstrich an, z.B. FAQ_
  • Stellen Sie zusätzlich vor den Namen Ihrer Kategorie einen Unterstrich, z.B. _FAQ_


Eingerücktes Listenelement ohne Beitragszahl

  • Schalten Sie die Anzeige der Beitragszahl in den CMS-Systemeinstellungen aus.
  • Stellen Sie zusätzlich vor den Namen Ihrer Kategorie einen Unterstrich, z.B. _Download


Die zusätzlichen Unterstriche vor und hinter dem Kategorienamen werden vom CMS ausgefiltert.

FAQ: Die farbliche Hervorhebung der Suchfunktion funktioniert nicht!

  • Wenn Sie von einer älteren Version des "8t88's CMS" aktualisiert haben fehlt Ihnen wahrscheinlich ein Abschnitt in Ihrem Stylesheet. Stellen Sie bitte sicher, dass der Abschnitt ".find" vorhanden ist! (-> "CMS verwalten" -> "Stylesheet bearbeiten")
  • Ändern Sie die gewählten Farben ggf. so, dass sie sinnvoll zur Farbgebung Ihrer Webseite passen.

Beispiel:
.find {
     background-color: yellow;
     font-weight: bold;
     color: black;
}

  • Bei Verwendung der <!--NOPROCESS--> Option in Beiträgen wird der gefundene Suchbegriff nicht farblich hervorgehoben!

FAQ: Das "8t88's CMS" beschwert sich über ein fehlendes DBI Modul!

Nicht bei allen Webhostern sind alle für "8t88's CMS v2" benötigten Module vorinstalliert. Ausgehend von einem Standard-Debian-System schafft die Ausführung des nachfolgenden Befehls als "root" Abhilfe.

user@host:~$ apt-get install libapache-dbi-perl libdbd-sqlite3-perl

Bei nicht auf Debian basierenden Distributionen verwenden Sie bitte die distributionsspezifischen Werkzeuge um die fehlenden Pakete nachzuinstallieren.

FAQ: Warum hast Du "8t88's CMS" geschrieben?

Seit je her habe ich eine Vorliebe für handgeschriebenen Code, da dieser nach meinem Empfinden besser durchdacht und kompakter ist als "generierter" Code der gängigen Webseiten-Zusammendängel-Programme wie z.B. fügen Sie Ihren Kandidaten hier ein.

Hier mein Pflichtenheft:

  • Ich möchte, dass meine Webseiten standardkonform sind und auf allen gängigen Browsern vetretbar dargestellt werden.
  • Ich möchte, dass meine Webseiten von (theoretisch) jedem an das Internet angeschlossenen PC bearbeitet werden können.
  • Ich möchte die volle Kontrolle über meinen Code haben, genau wissen, was er tut.
  • Ich möchte ein einfach zu wartendes System haben.
  • Ich bin zu faul selbst jede einzelne HTML-Seite von Hand zu schreiben.
  • Ich möchte mir - abgesehen vom Webserver - nicht noch SQL-Server etc. als potentielle Fehlerquelle oder gar Sicherheitslücke an den Hals holen.


Das sind K.O.-Kriterien für die meisten derzeit am Markt befindlichen (für Endanwender gedachten) Lösungen...

Ich experimentierte mit holaCMS (PHP), ein Projekt das zwischenzeitlich von seinem Autor leider aufgegeben wurde, und schrieb die erste Fassung von "8t88's CMS". Diese kann im Download-Bereich in der letzten Version 0.5b heruntergeladen werden.

Mit "8t88's CMS v0.x" stieß ich schnell an Grenzen, auch störte mich der Umstand, dass die einzelnen Skriptdateien (die das CMS bilden) wie bei jedem anderen CMS an verschiedenen Orten in unterschiedlichen Verzeichnissen herumlagen, so dass ich die Entwicklung einstellte und mich weiter umsah.

Blosxom kam mir gerade recht. Allerdings stieß ich auch hier sehr schnell auf Grenzen - Blosxom ist eben weniger ein Homepage- als ein Blog-System. Das zugrunde liegende System ist ebenso genial wie primitiv: Man bloggt indem man einfache Textdateien in einen definierten Verzeichnisbaum ablegt.

Ein vielversprechender Kandidat war das MoinMoin Wiki System. Doch gleich nach der testweisen Installation kam ich zum Schluss, dass es sich um ein geniales System handelt, welches sich aber für meine Zwecke nur bedingt eignet.

Ich stolperte über SQLite, fand das zugrunde liegende Konzept äußerst vielversprechend, nahm Anleihen aus allen Systemen, die ich bis dahin selbst getestet und geschrieben hatte, und das Resultat war "8t88's CMS v2.x" - genau das Homepage-Weblog-Wiki-Tool, das ich haben wollte.
Ich kann nicht dafür garantieren, dass irgend jemand außer mir damit etwas anfangen kann, stelle es aber liebend gerne der Allgemeinheit im Rahmen der GPL zur Verfügung.

FAQ: Wie kann ich den "/cgi-bin/index.pl" Teil der URL verschwinden lassen?

Wenn Sie den /cgi-bin/index.pl Teil der URL Ihres 8t88's CMS zum Seitenaufruf Ihrer Webseiten nicht mit eingeben wollen haben Sie mit Apache2 mindestens zwei Möglichkeiten:

1. Möglichkeit: URL-Weiterleitung per Redirect
Erweitern Sie die Konfigurationsdatei Ihres Servers um eine RedirectMatch Direktive:

RedirectMatch ^/$ /cgi-bin/index.pl

Vorstehende Direktive bewirkt, dass ein Besucher, der z.B. http://www.8t88.de/ in die Adresszeile seines Browsers eingegeben hat, automatisch auf http://www.8t88.de/cgi-bin/index.pl umgeleitet wird. Übergebene Parameter werden weiter gereicht.
Nachteil: Der /cgi-bin/index.pl Teil der URL bleibt in der Browser-Adresszeile sichtbar!

2. Möglichkeit: URL-Weiterleitung per mod_rewrite
Wenn mod_rewrite noch nicht aktiv sein sollte holen Sie das mit user@host:~$ a2enmod rewrite nach.
Anschließend erweitern Sie die Konfigurationsdatei Ihres Servers um die entsprechenden Rewrite Direktiven:

RewriteEngine On
RewriteBase /
RewriteRule ^$ /cgi-bin/index.pl?$1 [L,NC,QSA]
ScriptAlias /cgi-bin "/pfad/zu/cgi-bin"
AddHandler cgi-script .cgi .pl

Vorstehender Code bewirkt, dass beim Aufruf von z.B. http://www.8t88.de/ für den Besucher unsichtbar auf http://www.8t88.de/cgi-bin/index.pl zugegriffen wird. Auch übergebene Parameter werden weitergereicht. Die Zeilen 4 und 5 sorgen unter Anderem für den Schutz Ihres /cgi-bin Verzeichnisses und dafür, dass die "index.pl" des CMS als CGI Skript erkannt wird.

FAQ: Der FormMailer funktioniert nicht!

Wenn der FormMailer nicht funktioniert kommen mehrere Fehlerquellen in Betracht:

  • Es muss eine gültige, von "name@domain.com" abweichende eMail-Adresse eingestellt sein!
  • Der eingestellte Pfad zu sendmail (Standard: "/usr/lib/sendmail") muss korrekt sein.
    Das setzt natürlich ein funktionierendes, zu sendmail kompatibles, Mailsystem voraus!
  • Der FormMailer setzt "sendmail" voraus. UNIX-artige Betriebssysteme sind i.d.R. sendmail-kompatibel, daher sind hier keine ernsthaften Probleme zu erwarten.
  • Auf Windows-basierten Servern sind möglicherweise Änderungen am CMS nötig, um den eMail-Versand zu ermöglichen. Mangels Windows-Server kann ich das nicht gegenchecken, wahrscheinlich gibt es aber Workarounds für sendmail.


Update: 26.11.2011

  • Die eMail Funktionen basieren jetzt auf MIME::Lite
  • Dank MIME::Lite können eMails nun wahlweise per Sendmail oder SMTP versendet werden
  • Damit eMails versendet werden können müssen die Perl Module MIME::Lite und MIME::QuotedPrint installiert sein!
  • EXPERIMENTELL:
    Falls beim SMTP Versand SMTP-Auth benötigt wird müssen die Perl Module MIME::Base64 und Authen::SASL installiert sein!
  • Nur wenn die SMTP-Auth Perl Module installiert sind stehen in der Systemsteuerung Eingabefelder für Benutzername und Passwort (am SMTP Server!) zur Verfügung!

FAQ: Wie funktioniert das Kontaktformular? (FormMailer)

Der FormMailer weicht in seiner Auslegung von den übrigen Makros ab. Es ist so zu verwenden, dass der HTML-Quelltext für dieses Formular in einen Beitrag eingebettet wird. Damit beim Absenden dieses Formulars auch eine eMail an die in den CMS Systemeinstellungen hinterlegte eMail-Adresse versendet wird, muss noch ein INPUT-Feld mit dem Namen "formmail" und einem beliebigen Wert > 0 eingebaut werden, z.B.:

<input type="hidden" name="formmail" value="1">

Um zu verhindern dass leere Formulare abgeschickt werden können Sie dem FormMailer mitteilen, welche Eingabefelder geprüft werden sollen. Wenn z.B. Ihr Kontaktformular drei Pflichtfelder "name", "email" und "nachricht" haben soll, fügen Sie Ihrem Formular einfach folgenden Code hinzu:

<input type="hidden" name="required" value="name,email,nachricht">

Update 26.11.2011
Anti-SPAM für den FormMailer

FAQ: Was ist mit der Checkbox im Gästebuch passiert?

Die Checkbox "Ich bin ein Mensch!" sollte Gästebuch-Spammern das Leben schwer machen, indem zusätzlich zum Gästebucheintrag noch eine Aufgabe zu erledigen war, nämlich eine Checkbox anzuhaken.
In der Annahme das wäre für die Gästebuch-Spammer eine ernsthafte Hürde wurde ich eines Besseren belehrt, also musste ich mir etwas Neues einfallen lassen:

8t88's CMS v2 arbeitet ab der Version 2.0.2 mit einem Mechanismus, der einen neuen Gästebucheintrag nur speichert, wenn das Gästebuchformular manuell durch Druck auf die Schaltfläche "Eintragen" abgeschickt wurde.
Die Checkbox "Ich bin ein Mensch!" wird daher nicht mehr benötigt!

FAQ: Was hast Du gegen eine Datenbank?

Betrachtet man die meisten CMS-gestützten Homepages/Webseiten/etc., so stellt man fest, dass die Inhalte meist statisch sind, alle Jubeljahre mal eine Aktualisierung stattfindet, und die Datenbank eigentlich gar nicht benötigt wird. Auch bei häufigen Aktualisierungen wird die Datenbank in der Regel nicht benötigt, da der Inhalt an sich trotzdem statisch ist!

Betrachtet man dagegen "große" Webseiten kommerzieller Anbieter erkennt man sofort, dass die Inhalte nicht statisch sind. Hier ist die Anbindung an eine (oder mehrere) Datenbank(en) für das Funktionieren der Webseite essenziell wichtig!

Wir stellen also fest, dass eine externe Datenbank für eine Webseite erst ab einem gewissen Umfang Sinn macht, bis dahin stellt sie nur eine mögliche Fehlerquelle dar! Hast Du Dich nie geärgert daß eine Webseite nicht zu benutzen war weil ein "Datenbankfehler" aufgetreten ist?

"8t88's CMS v2" verbindet die Vorteile einer externen Datenbank mit der Geschwindigkeit von lokal gespeicherten Inhalten. Ermöglicht wird das durch den Einsatz von SQLite.

Verwandter Inhalt