Contenido verwendet zur Darstellung des Backend mehrere verschachtelte Framesets. Diese werden auf verschiedenen Wegen mit Inhalten gefüllt, wobei man generell unterscheiden kann zwischen dem oberen Hauptmenübereich und den darunter liegenden Frames für die eigentlichen Inhalte. Um nun beim Einbinden eines Plugins dessen Inhalte und seinen Menüeintrag korrekt platzieren zu können, sollte man wissen wie die Framesets aufgebaut sind, und wo Informationen zu den Inhalten hinterlegt werden müssen.
Grundsätzlicher Frameaufbau
Aktuell (V. 4.8.11) werden die Frames folgendermaßen über Templates konstruiert (contenido/templates/standard/)
- frameset.html, das Starttemplate, welches unterscheidet zwischen header und content.
- header: hier wird header.php geladen, die das Hauptmenü erzeugt.
- content: hier wird frameset.php geladen, die entweder
- ein frameset mit 4 frames erzeugt (frameset_content.html)
- links oben
- links unten
- rechts oben
- rechts unten
- oder ein frameset mit 2 frames (frameset_menuless_content.html
- rechts oben
- rechts unten
- ein frameset mit 4 frames erzeugt (frameset_content.html)
Bei den Contentframes ist die Aufteilung dann
- links oben: hier ist meist nur ein Button zum Ausblenden der linken Spalte
- links unten: Listen und Hauptmenüs für den angebotenen Bereich
- rechts oben: leer oder ein einzeiliges Untermenü
- rechts unten: die eigentlichen Inhalte des jeweiligen Bereiches (Listen, Formulare, Anwendungen, usw.)
Soweit zur Aufteilung, kommen wir jetzt zum Befüllen des Ganzen.
Das Headermenü
Dieses wird in der Datei header.php und dort im Speziellen über das Navigationsobjekt und dessen Funktion buildHeader(Sprache) erstellt. Die Informationen dazu stehen in den DB-Tabellen con_nav_main und con_nav_sub, wobei dort eigentlich nur ein Verweis auf eine xml-Struktur eingetragen wird (Spalte location). Zusätzlich steht in der con_nav_sub noch ein Querverweis zur con_nav_main (Spalte idnavm), unter welchem Hauptmenü der Eintrag erscheinen soll, und einer zur con_area (Spalte idarea), welcher Bereich (Area) damit aufgerufen wird. Mit dem Eintrag in der Spalte online (0/1) kann man die Anzeige des Menüeintrages an- bzw. abschalten.
Es gibt aber noch 2 Besonderheiten
- con_nav_sub wird auch für das Submenü in Frame 3 benutzt. Dieses wird über den Eintrag in der Spalte level gesteuert. Steht hier eine 0 so ist das Headersubmenü gemeint, bei einer 1 das Submenü in Frame 3. In diesem Fall muss unter idnavm eine 0 eingetragen werden.
- Unter location kann man noch zusätzlich den Speicherort der xml-Datei angeben, bezogen auf das Pluginverzeichnis von Contenido. Dieser wird zuerst, und mit einem Semikolon getrennt, vor der Strukturangabe angegeben. Hier muss man nur den Pfad, nicht die Datei angeben (Bsp.: meinplugin/xml/;navigation/extra/meinplugin).
Nun fehlt nur noch das xml-File unter richtigem Namen am richtigen Ort. Die Contenido Core xml-Files findet man unter contenido/xml/. Wird bei location kein anderer Pfad angegeben, wird in dem xml-File der entsprechenden Sprache (standard: en_US) nach der in der DB hinterlegten Struktur gesucht und der Name extrahiert. Es gibt dabei kein Fallback zur Standardsprache, das heißt die Dateien müssen bei Änderungen auch immer alle angepasst werden.
Ist ein Pfad hinterlegt schaut Contenido in diesem Verzeichnis nach der Sprachdatei mit der aktuellen Sprache, fehlt diese, wird die lang_en_US.xml genommen. Diese muss daher mindestens vorhanden sein.
Auszug aus der lang_de_DE.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <! – Contenido XML language file – > <language> <navigation> ....... <extra> <main>Extras</main> <newsletter>Newsletter</newsletter> <mailing>Mailing</mailing> <recipients>Empfänger</recipients> <recipientgroups>Empfänger-Gruppen</recipientgroups> </extra> <info>Info</info> <login>Login</login> </navigation> </language>
Um nun aus obiger Datei den Eintrag Newsletter im Menü anzuzeigen muss im Feld location der Strukturpfad stehen, also navigation/extras/newsletter.
Weiter Beispiele findet man in meiner Artikelserie zu Plugins [Verweis].
Weiter geht es mit dem Befüllen der Contentframes auf der nächsten Seite >>>