![]() |
|
URL dieses Artikels:
zu Ausgabe:
02.2003
Mein PHP-Nuke
PHP-Nuke individuell anpassen
von Markus Steinwinter
Moderatorensysteme wie PHP-Nuke werden immer beliebter im Internet. Die Vorteile sind klar, so bieten Moderatorensystem die Möglichkeit, Inhalte einfach, schnell und einheitlich zu präsentieren, ohne dafür immer neue HTML-Seiten schreiben zu müssen. Das Design und die Benutzernavigation eines solchen Portals sind auf jeder Seite einheitlich und meist übersichtlich. Doch wie schafft man es zum Beispiel, dass die Seiten zwar einheitlich sind, aber die Aufmachung des Portals sich doch von anderen unterscheidet, wenn man als Basis doch das selbe Moderatorensystem einsetzt?
PHP-Nuke ist wohl eines der am meisten genutzten Moderatorensysteme, die im Internet auf Homepages zu finden sind. Oft erkennt man dabei auch schon auf den ersten Blick, dass die Homepage von PHP-Nuke generiert wird. Dies liegt daran, dass die Administrationsoberfläche von PHP-Nuke nur sehr wenig Möglichkeiten bietet, das Design und die Funktionen von PHP-Nuke zu verändern. Es stehen zwar viele Themes und Funktions-Addons zum Download zur Verfügung, aber was dann immer noch fehlt, ist meist die persönliche Note des Portals. Um sein Portal von anderen abzuheben, ist es eigentlich unumgänglich, sich ein wenig damit zu beschäftigen, wie PHP-Nuke die HTML-Seiten generiert. Um dabei ohne lange zu suchen möglichst schnell ans Ziel zu kommen, ist es hilfreich, wenn man etwas über die Aufgaben der einzelnen Dateien weiß. Ich möchte nun in diesem Artikel versuchen, Ihnen die Struktur von PHP-Nuke näher zu bringen, damit es kein Problem mehr sein sollte, ein neues Theme zu integrieren, es an Ihre Bedürfnisse anzupassen, neue Module einzubinden oder aber vielleicht auch selbst zu entwerfen. Aus welchen Teilen besteht PHP-Nuke eigentlich? Die Installation von PHP-Nuke sollte in den wenigsten Fällen wirklich Probleme bereiten und ist eigentlich auch noch recht gut dokumentiert. Wie PHP-Nuke über den Browser benutzt und administriert wird, ist auch noch mehr oder weniger gut in der Dokumentation beschrieben, jedoch um Informationen über die eigentliche Funktion und Aufgabe der einzelnen Dateien zu erhalten, wird man ein wenig Suchen müssen. Um die Funktion der Dateien zu verstehen, ist es zunächst einmal hilfreich zu wissen, dass die Dateien wie index.php oder modules.php, die am offensichtlichsten sind und direkt aufgerufen werden, eigentlich am wenigsten tun. Diese Dateien überprüfen meist nur ein paar sicherheitsrelevante Dinge, sammeln die Eingaben und übergeben diese an andere Dateien. Das erste, das diese Dateien aber in der Regel tun, ist, dass sie die Funktionen in der mainfile.php in den Programmcode integrieren und dadurch die Funktionen anderen Dateien zur Verfügung stellen. Nachdem die mainfile.php die Konfiguration des Portals aus der Datei config.php geladen hat, lädt sie noch die Datei includes/sql_layer.php, in der Funktionen zur Nutzung der Datenbank hinterlegt sind. In der Datei mainfile.php selbst sind nun grundlegende Funktionen definiert, die die Benutzerauthentisierung steuern, den Aufbau der HTML-Tabellen handhaben und für die Ausgabe der einzelnen Blöcke auf der Seite zuständig sind. Das Aussehen oder die Funktion des Portals wird aber noch nicht von diesen Funktionen gesteuert. In diesen Funktionen gibt es eine bestimmte Anzahl an globalen Variablen, die von anderen Dateien belegt werden, durch die sich am Ende ein Gesamtbild ergibt. Nach der mainfile.php wird in der Regel die in der URL angegebene Moduldatei geladen. Dabei entsprechen die Namen der Unterverzeichnisse im Verzeichnis modules/ den Namen der einzelnen Module und wenn keine andere Datei in der URL definiert wurde, wird versucht, aus dem Modulverzeichnis die Datei index.php in den Code zu integrieren. Auf die Funktionen der Moduldateien möchte ich an dieser Stelle nicht näher eingehen, weil diese je nach Modul sehr verschieden sein können. Was aber Moduldateien gemeinsam haben, ist, dass sie zuerst einmal die Datei header.php laden werden. Wie der Dateiname schon aussagt, ist die Datei header.php für den Kopf der HTML-Ausgabe verantwortlich. Dafür werden von dieser Datei zunächst einmal die üblichen HTML-Kopfzeilen wie beispielsweise Metaangaben ausgegeben. Davor fügt sie die Funktionen der Datei themes/?theme?/theme.php dem Code hinzu, um auch die für das Theme benötigten Style-Sheet-Angaben, die normalerweise in der Datei themes/?theme?/style/style.css definiert wurden, mit ausgeben zu können. Je nach Aufbau und Umfang eines Themes kann es jetzt hier noch weitere Dateien geben, die von der Datei theme.php geladen werden, aber diese erklären sich meist von selbst und lassen sich leicht auffinden, in dem man einfach den include() Anweisungen in der Datei theme.php folgt. Was muss ich tun? Nachdem man jetzt eine gewisse Landkarte der Dateistruktur von PHP-Nuke im Kopf hat, dürfte es auch kein großes Problem mehr sein, die Dateien zu finden, um das Aussehen des Portals nach seinen eigenen Wünschen zu gestalten. Das Logo, die Fußzeilen und ein paar Einstellungen sind recht schnell über den Punkt Einstellungen der Administrationsseite des Portals geändert. Will man aber jetzt die farbliche Gestaltung ändern, kommt man um das Bearbeiten der Datei theme.php nicht herum. Im oberen Teil der Datei theme.php findet man nun die Definitionen der Variablen $bgcolor1 bis $bgcolor4 und $textcolor1 bis $textcolor2. Durch diese Variablen werden die Farben der Hintergründe der Seite und der Tabellen, die Tabellenlinien und die des Textes festgelegt. Eine generelle Regel, welche Variablen-Nummer für welche Farbe benutzt wird, lässt sich hier allerdings nur schwer aufstellen, da die Designer die Variablen teilweise recht unterschiedlich einsetzen. Das beste ist hier, wenn man einfach einmal die Farben der Reihe nach verändert und kontrolliert, welche Farbe auf der Seite sich geändert hat. Sollten die Farben sich nach dem Ändern der Werte für die Variablen auf der Seite nicht verändern, sind wahrscheinlich in den Style Sheet-Angaben der Datei style.css die Farben noch einmal definiert worden. In diesem Fall muss man natürlich diese Datei auch noch abändern und wenn man diese schon bearbeitet, kann man auch gleich noch überprüfen, ob die Angaben über die Schriftart und Schriftgröße auch die sind, die man später einsetzen will. Die Angaben der Style Sheets in der Datei style.css sind in verschiedene Klassen wie .content oder .storytitle unterteilt, damit man die Farben und Schriften der einzelnen Teile der Seite separat definieren kann. Hier kann ich auch wieder nur empfehlen, mit diesen Angaben etwas zu experimentieren, bis man das gewünschte Ergebnis erzielt hat. Neben den Definitionen für die Farben des Portals enthält die Datei theme.php auch noch Funktionen, die für das Aussehen und den Aufbau der Seiten eine entscheidende Rolle spielen. Möchte man nun zum Beispiel die Grafiken und die Navigationspunkte im Kopf der Anzeige ändern, dann sollte man sich die Funktion themeheader() etwas genauer ansehen. Diese Funktion gibt den HTML-Code aus, der zur Darstellung des Seitenkopfes benötigt wird. Hier kann man sich nun entscheiden, wenn man beispielsweise im Kopf andere Grafiken haben will, ob man die Dateinamen aus den <img src=...>-Tags herausliest und die Grafikdateien austauscht oder ob man in die Tags die Dateinamen von anderen Grafiken einträgt. Auch die obere Navigationsleiste sollte hier durch Ändern der HTML-Ausgaben problemlos zu bewerkstelligen sein. An dieser Stelle fallen einem dann auch spätestens die verschiedenen Stellen im Code auf, an denen statt des auszugebenden Textes nur ein Wort in Großbuchstaben mit führendem Unterstrich wie zum Beispiel _WELCOMETO steht. Diese Wörter resultieren aus der Unterstützung verschiedener Sprachen von PHP-Nuke. Sollte man sich absolut sicher sein, dass man die Seite nur in einer Sprache anbieten möchte, könnte man diese Wörter einfach mit dem entsprechenden Text überschreiben. Eher zu empfehlen ist es aber, die entsprechende Sprachdatei zu editieren, in der dieses Synonym definiert wurde. Die jeweilige Sprachdatei befindet sich in der Regel in einem Unterordner language im Ordner des jeweiligen Moduls. Beispiel: --- language/lang-german.php ---Analog zu der Funktion themeheader() existiert natürlich auch eine Funktion themefooter(), die das Aussehen des Seitenfußes festlegt. An dieser Funktion sollte es aber nur in seltenen Fällen etwas zu ändern geben, da die Fußzeilen ganz einfach über die Einstellung festgelegt werden können. Interessanter können hier schon Funktionen wie themeindex(), welche das Design der Artikel auf der Startseite festlegt, oder themearticle(), welche die Präsentation eines Artikels selbst steuert, sein. Das Prinzip, nach dem man das Design des Portals anpassen kann, bleibt eigentlich immer das Gleiche, aber dennoch ist es kaum möglich, konkrete Beispiele zu nennen, denn dafür waren die Designer der verschiedenen Themes zu fantasievoll. Das einzige, was sich mit Bestimmtheit sagen lässt, ist, dass es bestimmte Funktionen wie themeindex() geben muss und das in diesen Funktionen der HTML-Code für die spätere Anzeige versteckt ist. Ob nun aber diese Funktionen alle in der theme.php, wie bei einem recht einfachen Theme, zu finden sind oder ob diese Funktionen auf verschiedene Dateien, die über include()-Anweisungen in die theme.php eingebunden werden, verteilt sind, hängt von dem jeweiligen Theme ab, das man als Ausgangspunkt gewählt hat. Blöcke und Module, eine Frage der Zusammenstellung Ein ähnliches Prinzip kommt auch bei den Modulen und Blöcken zum Tragen. Ausgangspunkt ist hier die Datei modules.php. Von dieser Datei werden zunächst einmal die Grundfunktionen aus der Datei mainfile.php und deren includes in den Code eingebettet und danach bestimmt dieses PHP-Skript anhand der übergebenen $name Variable, welcher Modul-Code geladen werden soll. Der Wert, der durch die $name Variable übergeben wird, entspricht dabei dem Namen des Unterverzeichnisses des Moduls im Verzeichnis modules/. Aus diesem Unterverzeichnis wird dann versucht die Datei index.php zu öffnen, es sei denn es wurde zusätzlich noch die $file Variable belegt, dann versucht modules.php die in $file angegebene Datei in dem durch $name definierten Unterverzeichnis zu öffnen. Das Schema eines Modul-Aufrufs sieht wie folgt aus: http://www.webseite.xx/modules.php?name=ModulVerzeichnis&file=ModulDateiAn dieser Stelle möchte ich gleich noch auf einen Sicherheitsaspekt hinweisen. In PHP-Nuke-Versionen vor 5.5 wurde leider vergessen, den Inhalt der $file Variable vor dem Ausführen zu überprüfen. Somit konnte durch einfaches Belegen dieser Variable jede beliebige Datei auf dem Webserver geöffnet werden oder aber auch eine weitere Sicherheitslücke älterer PHP-Versionen ausgenutzt werden, durch die es dann möglich war, fremden Code von anderen Homepages zu laden und auf dem Webserver ausführen zu lassen. Dies bietet einem Angreifer unter anderem die Möglichkeit, mit nur einer einzigen PHP-Zeile sich das Datenbankkennwort anzeigen zu lassen. Wenn man sich nun das Schema mit den $name und $file Variablen anschaut, dann liegt praktisch auch schon auf der Hand wie einfach es ist, ein neues Modul zu installieren. Alles was zu tun ist, ist das Modul herunter zu laden, zu entpacken und das Verzeichnis in den Ordner modules/ zu kopieren. Danach kann man dann auf die Administrationsseite des Portals gehen und das neue Modul muss dann nur noch unter dem Punkt Module aktiviert und platziert werden. Änderungen an Modulen sind auch denkbar einfach. Anhand des Parameters file= in der URL weiß man zumindest, in welcher Datei man anfangen sollte zu suchen, und da Modul-Dateien eher selten irgendwelche includes aufweisen, wird man meist auch in dieser Datei fündig werden. Möchte man selbst Hand anlegen und eigene Module entwickeln, dürfte der Einstieg dazu jetzt auch nicht mehr all zu schwer fallen. Die PHP-Nuke-Module verhalten sich im großen und ganzen nicht anders als andere PHP-Skripte auch. Man kann bei Modulskripten allerdings komplett auf HTML-Kopfzeilen und derartige Dinge verzichten und kann nach dem Einbinden der Dateien mainfile.php und header.php sofort mit dem Skriptkörper beginnen. Was man beim Programmieren hier allerdings noch beachten sollte, ist, dass man die $name und gegebenenfalls die $file Variable bei jedem Formular oder jedem Link wieder mit angeben muss, damit auch zum Beispiel nach dem Absenden von eingegebenen Daten auch wieder das richtige Modul geladen wird. Geschlossen wird das Modul dann nur noch durch das Einbinden der Datei footer.php. Wenn man noch die Daten eines angemeldeten Benutzers in das Modul mit einbinden möchte, dann ist dies mit Hilfe der Funktionen wie getuserinfo() aus der Datei mainfile.php ebenfalls problemlos möglich: <?Sehr ähnlich wie die Module werden auch die Navigationsblöcke in das Portal integriert. In diesem Fall wird auch aus dem Inhalt eines Verzeichnisses, hier wird das Verzeichnis blocks/ verwendet, die Liste der vorhandenen Blöcke generiert. Im Gegensatz zu den Modulen werden bei den Blöcken nicht die Unterverzeichnisse gelistet, sondern alle Dateien, die mit block- beginnen und mit .php enden. Der voreingestellte Blockname ergibt sich dann aus dem Text zwischen diesen beiden Textelementen. Um einen neuen Block zu installieren, muss man also lediglich die entsprechende Datei in das Verzeichnis Blocks kopieren und auch bei den Blöcken muss der neue Block dann in der Liste auf der Administrationsseite unter dem Punkt Blöcke als aktiv markiert werden. Die Anzeige der Blöcke übernimmt zum Schluss dann die Funktion blocks(), die in der Datei mainfile.php definiert wurde. Die Aufrufe der blocks() Funktion befinden sich wiederum in den Funktionen themeheader() und themefooter() aus der Datei theme.php. Da die Theme-Funktionen wie bereits oben beschrieben ja schon über einen include() in den Code aufgenommen wurden, können diese beiden Funktionen nun beim Aufbau einer Portalseite von den Dateien header.php und footer.php benutzt werden. Die Blockdateien selbst sind zum Großteil sehr einfach aufgebaut und es sind auch keine besonderen PHP-Kenntnisse notwendig, um selbst eigene Blöcke zu erstellen. Unterm Strich ist nämlich das Wichtigste, das ein Block zu bewerkstelligen hat, dass die Variable $content mit dem HTML-Code, der später angezeigt werden soll, gefüllt wird: <?Das persönliche Portal Dieses Thema könnte man jetzt noch sehr weit vertiefen und man könnte wohl so manches Buch drüber schreiben, aber ich denke, dieser Artikel sollte schon soweit ausreichen, dass man sich einen Überblick über den Aufbau von PHP-Nuke verschaffen kann. Dem Einstieg zum Aufbau eines persönlichen Portals sollte also nun nichts mehr im Wege stehen und ich möchte Ihnen abschließend noch viel Erfolg bei der Umsetzung Ihrer kreativen Ideen wünschen. |
||
|