So, ein neues Update. Erst mal zum ListFormatter:
Code: Alles auswählen
protected static $defaults = array(
// ***** template *****
'template_dir' => null,
'template_type' => 'bootstrap',
'template_variant' => 'navbar',
// ***** css classes *****
'ul' => array(
'first' => null,
'last' => null,
'child' => 'dropdown',
'current' => 'active',
'trail' => 'active',
),
'li' => array(
'first' => null,
'last' => null,
'child' => 'dropdown',
'current' => 'active',
'trail' => 'active',
),
);
Das ist noch nicht der letzte Wurf, und die Defaults beziehen sich im Moment auf eine Bootstrap NavBar.
Ich hab mich jetzt doch entschieden, einen "Menu Manager" als Admin-Tool zu bauen. Ich hatte vor Jahren schon mal ein Modul für Websitebaker gebaut, die Entwicklung aber wieder eingestellt. (Damals waren die SM2 Verfechter sehr stark vertreten.) Das Praktische ist: Man muß sich keine Parameter merken, nur noch das Markup
{menu(<Nummer>)} in Template und der Rest geht per GUI.
- 2018-08-15 11_08_05-BlackCat CMS Backend _ Admin Werkzeuge.png (19.66 KiB) 4509 mal betrachtet
Die Optionen sind naturgemäß sehr stark an den neuen ListBuilder angelehnt, sollen aber so flexibel wie möglich sein. Daher möchte ich mal Euren Blick auf folgende Einstellungen richten:
1:nav nav-pills ddmenu
2:dropdown-menu
>=3:dropdown-menu sub-menu
Daß Menüs in der Regel verschachtelte Listen (<ul> oder <ol>) sind, dürfte allgemein bekannt sein. Bootstrap unterstützt out-of-the-box aber nur Menüs mit maximal zwei Ebenen. Es gibt diverse Snippets, um das zu lösen, und in meinem konkreten Beispiel ist es folgendermaßen:
- Der ganz äußere <ul> hat die Klassen "nav nav-pills ddmenu", wobei die ersten beiden Bootstrap-Klassen sind und die dritte zur Lösung gehört.
- <ul> auf der ersten untergeordneten Ebene haben die Klasse "dropdown-menu".
- Jede weitere Ebene darunter hat die Klassen "dropdown-menu sub-menu".
Damit man nun nicht für X Ebenen immer und immer wieder die Klassen angeben muß (man weiß ja auch nicht unbedingt von Anfang an, wie viele Ebenen man haben wird), habe ich mir die Angaben ">", "<", ">=" und "<=" überlegt. Äußerst kreativ, ich weiß.
Somit "weiß" jetzt der ListBuilder für jede Ebene, welche Klassen er zu verwenden hat.
Das gleiche natürlich analog auch für die <li> und <a> im Menü.
Kommen wir zurück zum ListFormatter von ganz oben. Mit Hilfe der Funktionen setLevelClasses() und setClasses() kann man nun zum einen diese Level-basierten CSS-Klassen übergeben, als auch die Standardklassen für "Einträge mit Untereinträgen" ("child"), "aktuelle Seite" (current), usw. Das wiederum erledigt unsere Menu Helper Klasse, die dazu die Menünummer aus dem
{menu()} Markup nimmt und die dazugehörigen Einstellungen aus der Datenbank zieht. Dazu gehört dann z.B. auch der Menütyp, also z.B. "Fullmenu" oder "Breadcrumb".
Kurzum, von all den Details hier muß der normale Administrator gar nichts wissen, er braucht nur die Menünummer und "fertig ist die Laube".
Vielleicht kriege ich sogar noch einen "Menu Analyzer" hin, dem man ein Markup vorwirft (z.B. einen Ausschnitt aus einem Bootstrap Snippet) und der daraufhin die Optionen - im wesentlichen die CSS-Klassen - ermittelt. Das wird nicht so weit gehen (können), daß der auch noch das HTML-Markup im Detail analysiert, aber was die CSS-Klassen angeht, bin ich da eigentlich recht zuversichtlich.