PHP SkinController – Code & Blog
Der SkinController soll eine Klasse sein, welche die Skins des unseres CMS verwaltet. Diese Klasse wird dann in der index Datei aufgerufen, damit wir uns sonst nicht um das Design der Seite kümmern müssen. Die Funktionen der Klasse sollen statisch sein, so dass man kein Objekt erstellen muss, um auf diese zurückzugreifen. Der SkinController wird in der Datei skincontroller.php gespeichert, welche im Verzeichnis system/classes liegen soll.
Der Controller soll erst einmal 3 Funktionen beinhaltet:
- getCurrentSkinId: gibt die aktuell ausgewählte ID des Skins wieder
- getCurrentSkinName: liefert den Namen des Skins
- getCurrentSkinPath: gibt die Speicheradresse des Skins wieder.
Nun mal vorab der Quellcode:
<?PHP class SkinController{ function getCurrentSkinId(){ return getSetting("selectedskin"); } function getCurrentSkinName(){ global $dbpraefix; $res = mysql_query("SELECT name FROM ".$dbpraefix."skins WHERE id = '".SkinController::getCurrentSkinId()."'"); if($row = mysql_fetch_row($res)){ return $row[0]; } else{ return "default"; } } function getCurrentSkinPath(){ return "system/skins/".SkinController::getCurrentSkinName(); } } ?>
In der Funktion getCurrentSkinID wird einfach nur über die Funktion getSetting aus der Datei settings.php die aktuelle ID aus der DB geholt und mit return zurückgegeben.
Die Funktion getCurrentSkinName muss auf die Variable $dbpraefix aus der dbsettings.php zugreifen. Diese muss deswegen erst einmal als global deklariert werden. Danach wird eine MySQL-Abfrage gesendet, um den Namen herauszubekommen. Hierbei wird auf die Funktion getCurrentSkinID zugegriffen. Da wir ja alle Funktionen statisch aufrufen möchten, müssen wir hier den Klassennamen gefolgt von 2 Doppelpunkten und den Funktionnamen aufrufen. Sollte die Abfrage scheitern, wird hier der Wert „default“ für den Standardskin zurückgegeben.
getCurrentSkinPath verknüpft einfach den Skinnamen mit dem Speicherplatz, wo die Skins gespeichert sind.
Diese funktionen brauchen jetzt die folgenden Dateien:
- dbconnect.php (beinhaltet auch die dbsettigns.php und verbindet zur DB)
- settings.php (für das Auslesen der Einstellungen)
Nun muss das ganze natürlich auch noch getestet werden. Hierfür nehmen wir unsere index.php im Hauptverzeichnis. Dort fügen wir den include-Befehl für die 2 Dateien hinzu und importieren zum Test einmal eine Datei (dazu später mehr):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml/" xml:lang="de"> <head> <title>Kommt in einen spä;teren Beitrag</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> </head> <body> <?PHP include("system/dbconnect.php"); include("system/settings.php"); include("system/classes/skincontroller.php"); include("system/filterfilename.php"); include(filterfilename("content/articles/".$_GET['include'])); include(SkinController::getCurrentSkinPath()."/test.php"); ?> </body> </html>
Jetzt müssen wir die Datei test.php natürlich auch noch erstellen. Hierfür muss der Ordner skins im Verzeichnis system erstellt werden. Darin kommt nochmal ein Ordner mit den Namen default (weil ja so unser Design gerade heißt). Hier muss dann die Datei test.php zu finden sein. Der Inhalt ist eigentlich egal, da sie nur zum testen ist. Meine sieht so aus:
<h2>Test erfolgreich!</h2>
Wenn jetzt alles geklappt hat, solltet ihr nun Test erfolgreich auf all euren CMS-Seiten sehen.
Dies ist ein Beitrag aus der Aktion Code & Blog, in der hier ein eigenes CMS erstellt wird.
Du arbeitest in einer Agentur oder als Freelancer?
Dann wirf doch mal einen Blick auf unsere Software FeatValue.
Kommentare
Pablo schrieb am 02.12.2010:
ist er normal das bei /cms/index.php?include=testseite den die testseite vom content/articles/testseite.php angezeigt wird und auch der text vom defaultskin und bei /cms/testseite.htm nur der text vom defaultskin aber nicht mehr der vom content/articles/testseite.php das verwirrt mich ziemlich! grüsse
Stefan Wienströer schrieb am 03.12.2010:
kannst du mal nen Screenshot posten?
David schrieb am 09.12.2010:
Bei mir Funktionierts, aber unter den Texten steht immer: Fatal error: Cannot redeclare filterfilename() (previously declared in C:xampphtdocscms nach tutorialsystemfilterfilename.php:2) in C:xampphtdocscms nach tutorialsystemfilterfilename.php on line 13
David schrieb am 09.12.2010:
problem gelöst, hab en ppar schritte weiter gemacht, und jetz gehts :-D
BartM schrieb am 28.01.2011:
Bei mir kommt diese wenn ich die index.php aufrufe : Warning: include(content/articles/errors/404.php) [function.include]: failed to open stream: No such file or directory in C:Programmexampphtdocscmsindex.php on line 14 Warning: include() [function.include]: Failed opening 'content/articles/errors/404.php' for inclusion (include_path='.;C:Programmexamppphppear') in C:Programmexampphtdocscmsindex.php on line 14 Test erfolgreich!
Stefan Wienströer schrieb am 29.01.2011:
ist die Datei die du aufrufst im articles-Ordner vorhanden?
BartM schrieb am 29.01.2011:
Ich rufe nur die index.php auf, da kommt dann diese meldung. eine 404.php habe ich nicht, da sie ja bis jetzt noch nicht erstellt wurde.
Fynikoto schrieb am 31.05.2011:
Huhu, bei SQL verwendet man bei numerischen werten (und ich gehe davon aus, dass "id" bei dir ein numerisches Feld ist) keine '-zeichen. Ist Unnötig. Ist mir vorhin schonmal aufgefallen. Da haste nem Incrementfeld '' übergeben. Korrekt wäre NULL zu übergeben. Mit freundlichen Grüßen Fynikoto
Rogo schrieb am 11.06.2011:
Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in .../www/system/settings.php on line 6 Warning: mysql_fetch_row() expects parameter 1 to be resource, boolean given in .../www/system/classes/skincontroller.php on line 12 Steht bei mir immer? o.O
Rogo schrieb am 11.06.2011:
Hat sich erledigt!
Cengiz schrieb am 22.06.2011:
Hi, die includes (oder besser "require_once") solltest du nicht im HTMl-Code, sondern ganz oben machen, bevor HTML beginnt. Cengiz
Cengiz schrieb am 22.06.2011:
unter "systemsettings.php" muss noch eine Warnung abgefangen werden: $res = mysql_query("SELECT...."); mysql_fetch_row($res) <--- Hier kommt NULL zurück! Vorschlag: if($res != null){ $row = mysql_fetch_row($res); return $row[0]; } else { return null; }
Jan schrieb am 25.08.2011:
Bevor es jetzt jemand so abtippert, oder copy&paste macht, bei else sollte "default" stehen...
Marcel schrieb am 23.09.2011:
Hallo, bei mir steht: Notice: Undefined index: include in C:xampphtdocsCMSindex.php on line 14 Warning: include(content/articles/errors/404.php) [function.include]: failed to open stream: No such file or directory in C:xampphtdocsCMSindex.php on line 14 Warning: include() [function.include]: Failed opening 'content/articles/errors/404.php' for inclusion (include_path='.;C:xamppphpPEAR') in C:xampphtdocsCMSindex.php on line 14 Strict Standards: Non-static method SkinController::getCurrentSkinPath() should not be called statically in C:xampphtdocsCMSindex.php on line 15 Strict Standards: Non-static method SkinController::getCurrentSkinName() should not be called statically in C:xampphtdocsCMSsystemclassesskincontroller.php on line 21 Strict Standards: Non-static method SkinController::getCurrentSkinId() should not be called statically in C:xampphtdocsCMSsystemclassesskincontroller.php on line 11 Test erfolgreich! warum?????
Stefan Wienströer schrieb am 23.09.2011:
Hi, der damalige Stand, funktioniert nicht mit eingeschalteten Warnungen.
Marcel schrieb am 26.09.2011:
Aso also ist das normal
Stefan Wienströer schrieb am 26.09.2011:
Jain, ist nicht gut aber es ist leider so.
Asterix schrieb am 17.11.2011:
Ist das normal ? Was ist den hier falsch? Screen: http://snpr.cm/LPYu4F.png
Stefan Wienströer schrieb am 18.11.2011:
Falsch? Da steht doch das der Test erfolgreich war^^ Ne versuch doch mal index.php statt index zu öffnen ;-)
Daniel schrieb am 14.01.2012:
HILFE :D bei mir ging bis jetzt alles ohne probleme aber jetzt kommt der fehler was soll ich tuen ? Fatal error: Cannot redeclare getSetting() (previously declared in F:xampphtdocscmssystemsettings.php:2) in F:xampphtdocscmssystemsettings.php on line 8
Stefan Wienströer schrieb am 14.01.2012:
Hört sich an, als hättest du die Funktion 2 mal erstellt ;-)
Über uns
Wir entwickeln Webanwendungen mit viel Leidenschaft. Unser Wissen geben wir dabei gerne weiter. Mehr über a coding project