Mein einfaches Blogsystem in CFML

Inspiriert von Kirby habe ich diesmal mein Blogsystem ohne Datenbank programmiert. Sowohl das Listing der Artikel als auch die Artikel selbst basieren auf einer File/Folder Struktur, welche via FTP o.Ä. auf den Server geladen werden. Herrlich wie einfach das ist.

Hier die einfachste Lösung, die ich mir vorstellen kann:

Das Grundsystem basiert auf nur einer Datei für das Listing der Einträge (blog.cfm), einem Ordner für die einzelnen Einträge (/artikel) und in diesem Ordner pro Eintrag eine weitere Datei (z.B. /artikel/2016-01-01-hallo-blog.cfm).

Ich checke dann mit StructKeyExists() ob der Wert read vorhanden ist, oder eben nicht. Das Ergebnis entscheidet dann, ob ich alle Dateien im Verzeichnis anzeige oder nur eine.

Die blog.cfm durchsucht ohne den Wert read den Ordner /artikel nach Dateien und listet diese mit Hilfe eines <cfinclude> auf. Existiert read jedoch wird nur die Datei eingebunden, welche dem Wert entspricht.

Das sieht dann folgendermaßen aus:

<cfif StructKeyExists(url,"read") is "false">
<cfdirectory action="list" name="artikel" directory="[ServerPfad]\artikel" sort="name desc">
<cfloop query="artikel">
<cfinclude template="artikel/#name#">
</cfloop>
<cfelse>
<cfinclude template="artikel/#read#.cfm">
</cfif>
<cfif StructKeyExists(url,"read") is "false">
<cfdirectory action="list" name="artikel" directory="[ServerPfad]\artikel" sort="name desc">
<cfloop query="artikel">
<cfinclude template="artikel/#name#">
</cfloop>
<cfelse>
<cfinclude template="artikel/#read#.cfm">
</cfif>

Durch die Namensgebung der Dateien haben wir direkt auch die Sortierung geklärt. Verlinkt werden die einzelnen Artikel ebenfalls über Ihren Namen (Ohne die Endung .cfm) in den einzelnen Beiträgen.

<a href="blog.cfm?read=2016-01-01-hallo-blog">Hallo Blog</a>

Die Basisversion des Systems ist damit fertig. Der Vorteil hier ist nun, dass jeder Artikel, da er in HTML geschrieben wird, einen komplett anderen Aufbau haben kann und ich in der Sprache schreiben kann, die ich am häufigsten nutze.

Aber..

.. man kann noch ein kleines Stück weiter gehen. Bis hier her müsste ich die Verlinkung per Hand vornehmen und habe auch noch kein Datum für die Einträge definiert. Klar, die einzelnen Dateien haben Erstellungsdatum und das Datum der letzten Änderungen auf Dateiebene, aber das reicht mir nicht, bzw. es ist zu willkürlich. Folgende Anweisungen kommen auf die Artikelseiten.

<cfset aPfad = GetCurrentTemplatePath()>
<cfset aFile = lcase(GetFileFromPath(aPfad))>
<cfset aLink = replace(aFile, ".cfm","","ALL")>
<cfset aLink = replace(aLink, "_","","ALL")>
<cfset aDatum = left(aLink, 10)>
<cfset aDatum = lsdateformat(aDatum, "dd.mm.yyyy")>

Durch diese Angaben erreichen wir folgendes:

  • aPfad gibt den Serverpfad inkl. Dateiname wieder
  • aFile den reinen Dateinamen des Artikels
  • aLink schmeisst die Endung weg und definiert dadurch die URL für den Artikel
  • aDatum generiert aus dem Dateinamen das gewünschte Datum für den Artikel

Ich kann nun den Link folgendermaßen angeben:

<a href="blog.cfm?read=<cfoutput>#aLink#</cfoutput>">Hallo Blog</a>

Eine Kleinigkeit fehlt noch. Ich möchte die Möglichkeit haben Artikel zu schreiben und sie als Draft zu speichern. Gelöst habe ich das ebenfalls durch den Dateinamen. Immer wenn eine Datei mit _ beginnt, wird diese durch ein einfaches cfif aus dem Listing ausgeschlossen. Das sieht dann so aus:

<cfif StructKeyExists(url,"read") is "false">
<cfdirectory action="list" name="artikel" directory="[ServerPfad]\artikel" sort="name desc">
<cfloop query="artikel">
<cfif left(name,1) neq "_">
<cfinclude template="artikel/#name#">
</cfif>
</cfloop>
<cfelse>
<cfinclude template="artikel/#read#.cfm">
</cfif>

Damit steht nun eine solide Grundlage für mein Blog.