Meist gelesen
Warenkorb
Anmeldung
Knowledgebase
Das Modul mod_mainmenu
Wissenwertes zum Modul Mainmenü.
Dieses Joomla-Standard-Modul ist sehr sauber strukturiert, wird aber leider so nicht von VirtueMart unterstützt. Dadurch sähen VM-Module immer etwas anders aus als der Rest der Seiten-Menüs. Damit auch VM die mod_mainmenu Optik einschließlich der dazugehörigen CSS-Dateiein gemeinsam mit Joomla nutzten kann, wurde von mir für das Modul vm_modmainmenu.php entwickelt. Es nutzt die VM-Kategorien um anhand dessen eine Menübaum mit gleichem Verhalten aufzubauen.
Menü Son Of Suckerfish in Joomla implementieren
- Details
- Hauptkategorie: Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)
- Zuletzt aktualisiert am Montag, 19. März 2012 16:47
Einleitung
Was sind die Charakteristika eine Suckerfish-Menüs?
- Die erste Menüebene wird horizontal angelegt, i.d.R. in der gesamten Breite des Contentbereiches.
- Nur die erste Menüebene ist permanent zu sehen.
- Die zweite Menüebenen wird jeweil unter Ihrem Parent-Menüeintrag beim Mouseover über ihrem Parent-Menüeintrag eingeblendet.
- Alles weiteren Menüebenen werden rechts neben ihrem Parent-Menüeintrag eingeblende.
- Gern wird dabei ab der 2. Menüebene ein transparenter Hintergrund verwendet, so dass die aufklappenden Menüeinträge den überlagernden Content nicht vollständig abdecken.
- Ein Klick auf einen Menüeintrag ruft die entspr. verlinkte Seite auf.
- Beim Verlassen der Maus aus den Menüeinträgen werden dieses wieder unsichtbar.
- Schließlich werden noch gern z.B. die MooTools eingesetzt, um das Einblenden und Ausblenden der Menülisten peppiger zu gestalten - entweder durch Fading oder Sliding oder wie auch immer.
Was wird benötigt für das Menü:
- Das schöne an dem Menü ist, dass es eigentlich ganz ohne JavaScript auskommen würde. Allein durch die hover-Funktion, wie Sie von den meisten Browsern unterstützt wird, kann die gewünscht Funktion erreicht werden. Deshalb bräuchten wir eigentlich lediglich eine Stylesheet-Datei, die a) zum einen die Layout-Informationen für die Listen liefert und zum anderen b) die Design-Formatierungen für den Style der Menülisten und Listeneinträge.
- Eigentlich schon ur noptional werden ein paar wenige Grafiken benötigt. Das aber eben nur um alles etwas zu verschönern oder, und das wäre eigentlich wichtiger, um Eigenschaften eines Menüeintrages zu visualisieren, wie z.B. ob ein Element eine Untermenü besitzt (is parent oder auch has childs), welcher Menüeintrage gerade der Aktuelle ist (benannt i.d.R. mit id=current) oder schließlich welche Menüelement gerade active sind (alle die die auf dem Weg zum aktuellen Menüelement, einschließlich des akutellen Menüelementes liegen - also quasi aufgeklappt sind). Im Gegensatz zum vertikalen Menü-Tree sind aber diese eigentlichen sinnvollen Menüelementeeigenschaften beim Suckerfish-Menü nicht so maßgeblich, weil das Menü weniger zur Orientierung geeignet ist, eben weil ja die Submenü-Einträge immer nur bei Mouseover sichtbar sind.
- Schließlich brauchen wir noch ein Script, welches notwendig ist die im IE fehlende Mouse-Over-Funktion (das hover'n) zu erreichen. Leider wurde es von Microsoft auch in der Siebener-Version wieder nicht umgesetzt, weshalb wir wohl noch eine Weile mit solchen IE-Extras leben müssen.
Die CSS-Datei im Detail
| Son-of-Suckerfish-menu.css | |
1 |
/* Son of Suckerfish Dropdowns |
Das Spezial-Script für den IE
| son-of-sucherfish-menu.js | |
1 |
sfHover = function() { |
Aufruf des Menü im Template und die mod_mainmenü-Konfiguration.
| Template: index.php | |
80 |
if($this->countModules( 'nav_main' )) : ?>
|
Einbindung der notwendigen Dateien in das Template
- für die CSS-Datei den Pfad: joomlarootpfad/templates/hm_yaml/css/meinDESIGN/navigation/
- für die Script-Datei den Pfad: joomlarootpfad/templates/hm_yaml/scripts/meinDESIGN/
- für die Grafiken z.B: den Pfad: joomlarootpfad/templates/hm_yaml/images/meinDESIGN/navigation/sos/
Das Script vm_modmainmenu.php
- Details
- Hauptkategorie: Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)
- Zuletzt aktualisiert am Montag, 19. März 2012 16:47
| joomlapfad/modules/mod_virtuemart/vm_modmainmenu.php | |
1 |
if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); |
Das Standard-Modul mod_mainmenu von Joomla
- Details
- Hauptkategorie: Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)
- Zuletzt aktualisiert am Montag, 19. März 2012 16:47
Das Joomla mod_mainmenu
"mainmenu" ist das Standard Menü-Modul von Joomla. Für dieses Menü gibt es eine eigene Style-Sheet-Datei, die für die besondere Optik des Menüs sorgt. Dazu gehört:
- Das Kennzeichnen ob Menüeinträgen (parent) Untermenüpunkte haben oder nicht
- Das Kennzeichnen des gerade aktiven Menüpunktes (current) - Menüpunkt der gerade aktuell sichtbaren Seite
- Das Kennzeichnen aufgeklappter Menüeinträge (acitve)
- Das hirarchische Einrücken untergeordeneter Menüeinträge (level)
- Die evtl. genutzte besondere Kennzeichnung des ersten (first_item) und letzten Menüeintrages innerhalb einer Ebene (last_item)
- Und schließlich noch die Möglichkeit einer ID-abhängigen individuelle Formatierung von Menüeinträgen (itemID)
Die Struktur eines mod_mainmenu
Das Modul MainMenü ist grundsätzlich wir folgt strukturiert:
| Beispiel eine mod_mainmenu-Menüs | |
1 |
<ul class="menu"> |
Wichtig ist hier zu erkennen, wann current, acitive, current_link, active_link sowie last_item und first_item gesetzt werden und wie der richtige Aufbau der Listen erfolgt.
Zu den Regeln im Detail:
- Hat ein Menüeintrag Childs, dann erhält die LI-Klasse immer (nicht nur wenn gerade active) den zusätzlichen Eintrag „parent". Damit kann dann im Item-Style kenntlich gemacht werden, dass es Untereinträge gibt, z.B. durch ein Plus-Zeichen vor dem Parent-Eintrag oder durch „..." oder ein Weiter-Dreieck nach dem Parent-Menüeintrag.
- Das gerade ausgewählte Listenelement/Menüeintrag erhält immer "current" und current_link immer genau das eingeschlosse a-Tag. Das ist also die Seite die gerade aufgerufen wurde.
- Der Erste Menüeintrag einer Tiefenebene erhält jeweils den Classen-Eintrag "first_item", der letzte dieser Ebenen jeweils „last_item". Damit wird eine abweichende Formatierung des ersten und letzten Menüeintrages möglich z.B. durch beginnende oder abschließende Designelemente. Ist ein Untermenüpunkt der einzige auf dieser Ebene, dann ist er weder "first_item" noch "last_item". Beim designen könnte sich das evtl. auch als Nachteil erweisen und es wäre besser einem einzelnen dann sowohl first_item als auch last_item zu vergeben. Darüber habe ich noch nicht abschließend nachgedacht, weil dieser Fall in meinem Design so nicht herausgestellt werden sollte.
- Die Menüeinträge, die als Elterneintrag aufgeklappt sind, also deren Child-Elemente angezeigt werden sind aktive Menüeinträge (active). Diese erhalten
- im jeweiligen LI den Classen-Style „active",
- Gleichzeitig bekommt das A-Tag die Classe "active_link"
- Auch das gerade aktuelle A-Tag bekommt, obwohl nicht zwingend aufgeklappt neben dem "current_link" die Style-Class „active_link".
- Jeder Menüeintrag erhält im LI-Tag einen ID-Eintrag "itemID" - für die ID-Nummer diesen Menüpunkt. Für den Designer bietet das die Möglichkeit Menüeinträge speziell zu gestalten, z.B. jedem Menüeintrag eine eigene Farbe zuzuweisen oder ein individuelles Icon voranzustellen.
Die nav_list.css
- Details
- Hauptkategorie: Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)
- Zuletzt aktualisiert am Montag, 19. März 2012 16:47
| nav_vlist bis Level 4.css | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
@charset "UTF-8"; /** * @copyright Copyright 2001 St. Kraft @media screen, projection { #main .menu { width: 100%; overflow: hidden; margin:0; list-style-type: none; } #main .menu ul { list-style-type: none; margin:0; padding: 0; } #main .menu li { float:left; width: 100%; margin:0; padding: 0 } #main .menu a, #main .menu span.separator { display:block; padding:3px 0 3px 10%; text-decoration: none; color: #444; } #main .menu li#current a.active_link { font-weight: bold; color: #fff; cursor:default; } /* Level 1 ----------------------OK--------------------------- */ #main .menu li a { padding-left: 13px; background: #fff url(../../../images/pvh/navigation/NavList/L1_no.gif) no-repeat; } #main .menu li a:focus, #main .menu li a:hover, #main .menu li a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L1_no-mo.gif) no-repeat; } #main .menu li.parent a { background: #fff url(../../../images/pvh/navigation/NavList/L1_pa.gif) no-repeat; } #main .menu li.parent a:focus, #main .menu li.parent a:hover, #main .menu li.parent a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L1_pa-mo.gif) no-repeat; } #main .menu li#current a.current_link { background: #608BC0 url(../../../images/pvh/navigation/NavList/L1_no-cu.gif) no-repeat; } #main .menu li#current.parent a.current_link { background: #608BC0 url(../../../images/pvh/navigation/NavList/L1_pa-cu.gif) no-repeat; } #main .menu li.parent.active a.active_link { background: #fff url(../../../images/pvh/navigation/NavList/L1_pa-ac.gif) no-repeat; } #main .menu li.active a.active_link:focus, #main .menu li.active a.active_link:hover, #main .menu li.active a.active_link:active { background: #DEF url(../../../images/pvh/navigation/NavList/L1_pa-ac-mo.gif) no-repeat; } /* Level 2 -----------------------OK-------------------------- */ #main .menu li.parent.active ul li a { padding-left: 20px; background: #fff url(../../../images/pvh/navigation/NavList/L2_no.gif) no-repeat; } #main .menu li.parent.active ul li a:focus, #main .menu li.parent.active ul li a:hover, #main .menu li.parent.active ul li a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L2_no-mo.gif) no-repeat; } #main .menu li.parent.active ul li.parent a { background: #fff url(../../../images/pvh/navigation/NavList/L2_pa.gif) no-repeat; } #main .menu li.parent.active ul li.parent a:focus, #main .menu li.parent.active ul li.parent a:hover, #main .menu li.parent.active ul li.parent a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L2_pa-mo.gif) no-repeat; } /*NEU EXPORTIEREN*/ #main .menu li.parent.active ul li#current.active a.current_link { padding-left: 20px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L2_no-cu.gif) no-repeat; } #main .menu li.parent.active ul li#current.parent.active a.current_link { padding-left: 20px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L2_pa-cu.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active a.active_link { background: #fff url(../../../images/pvh/navigation/NavList/L2_pa-ac.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active a.active_link:focus, #main .menu li.parent.active ul li.parent.active a.active_link:hover, #main .menu li.parent.active ul li.parent.active a.active_link:active { background: #DEF url(../../../images/pvh/navigation/NavList/L2_pa-ac-mo.gif) no-repeat; } /* Level 3 -------------------------ok------------------------ */ #main .menu li.parent.active ul li.parent.active ul li a { padding-left: 27px; background: #fff url(../../../images/pvh/navigation/NavList/L3_no.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li a:focus, #main .menu li.parent.active ul li.parent.active ul li a:hover, #main .menu li.parent.active ul li.parent.active ul li a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L3_no-mo.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent a { padding-left: 27px; background: #fff url(../../../images/pvh/navigation/NavList/L3_pa.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent a:focus, #main .menu li.parent.active ul li.parent.active ul li.parent a:hover, #main .menu li.parent.active ul li.parent.active ul li.parent a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L3_pa-mo.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li#current.active a.current_link { padding-left: 27px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L3_no-cu.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li#current.parent.active a.current_link { padding-left: 27px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L3_pa-cu.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active a.active_link { background: #fff url(../../../images/pvh/navigation/NavList/L3_pa-ac.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active a.active_link:focus, #main .menu li.parent.active ul li.parent.active ul li.parent.active a.active_link:hover, #main .menu li.parent.active ul li.parent.active ul li.parent.active a.active_link:active { background: #DEF url(../../../images/pvh/navigation/NavList/L3_pa-ac-mo.gif) no-repeat; } /* Level 4 --------------------------------------------------- */ #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li a { padding-left: 34px; background: #fff url(../../../images/pvh/navigation/NavList/L4_no.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li a:focus, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li a:hover, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L4_no-mo.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent a { padding-left: 34px; background: #fff url(../../../images/pvh/navigation/NavList/L4_pa.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent a:focus, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent a:hover, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent a:active { background: #DEF url(../../../images/pvh/navigation/NavList/L4_pa-mo.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li#current.active a.current_link { padding-left: 34px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L4_no-cu.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li#current.parent.active a.current_link { padding-left: 34px; background: #608BC0 url(../../../images/pvh/navigation/NavList/L4_pa-cu.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent.active a.active_link { background: #fff url(../../../images/pvh/navigation/NavList/L4_pa-ac.gif) no-repeat; } #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent.active a.active_link:focus, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent.active a.active_link:hover, #main .menu li.parent.active ul li.parent.active ul li.parent.active ul li.parent.active a.active_link:active { background: #DEF url(../../../images/pvh/navigation/NavList/L4_pa-ac-mo.gif) no-repeat; } } |
Die Implementierung von vm_modmainmenu
- Details
- Hauptkategorie: Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)
- Zuletzt aktualisiert am Montag, 19. März 2012 16:47
Den neuen Menütyp "vm_modmainmenu" als mod_mainmenu-Clone in VM einbinden
Um das neue Menü einzubinden wurde zunächst untersucht über welche Wege das erfolgen kann. In Betracht gezogen wurden 3 Varianten. Die dritte wurde schließlich praktiziert.
Schaut man sich das Script mod_virtuemart.php ab ca. Zeile 70 in joomlapfad/modules/mod_virtuemart/ mal an, sieht man die unterschiedliche Einbindung von separaten/externen Zusatz-Menu-Typen ...
| joomlapfad/modules/mod_virtuemart/mod_virtuemart.php | |
1 |
... |
... und der VM-eigenen Menü-Classe über die Funktion get_category_tree des Objektes ps_product_category in der Classenbibliothek joomlapfad/administrator/com_virtuemart/classes/ps_product_category.php
| joomlapfad/administrator/com_virtuemart/classes/ps_product_category.php | |
1 |
... |
Variante 1: Category-Display-Type "Link List" modifizieren
Dieser Type ist als Standard-Basis-Menüversion in VM tief verwurzelt - also nicht als externer Category-Display-Type eingebunden - und damit schwer zu modifizieren und immer auch nur durch intensive Eingriffe ist die VM-Scripte. In Hinblick auf die Updatefähigkeit von VM ist das nicht zu empfehlen. "Link List" wird auch anders eingebunden als die anderen Menüvarianten. Davon sollte man die Finger weglassen.
Variante 2: Duplizierung und Modifikation von z.B. "dTree" o.a.
Eine weitere Möglichkeit könnte sein, eines der mitgelieferten Module zu einem eigenen umzumodeln. Leider ist aber das, was all diese anderen Display-Typen ausliefern noch weiter von mod_mainmenu und deren Style-Strukturen entfernt als "Link List" und wurde deshalb als Variante verworfen - auch wenn es eigentlich der zu favorisierende Weg wäre. Der Aufwand der Anpassung schien mir hier aber zu hoch.
Variante 3: Ein ausgelagertes Menü mit ähnlichem Aufruf als Funktion wie bei "Link List"
Gleich vorweg: Diese Variante wurde schließlich praktiziert. Es ist quasi ein Mischweg aus 1 und 2. Einbebunden über require_once wird eine speparate vm_modmainmenu.php. Die dort enthaltene Funktion zur Menüausgabe wir aufgerufen und deren Rückgabewert über echo ausgeben.
Der Aufruf dieses neuen Display-Types erfolgt also durch Einfügung in der mod_virtuemart.php ab ca. Zeile 93 wie folgt...
| joomlapfad/modules/mod_virtuemart/mod_virtuemart.php | |
94 |
elseif( $menutype == "modmainmenu" ) { |
Kurz zur Erläuterung der 4 Scriptzeile: Wird als gewünschter Menutype "modmainmenu" erkannt, dann wird die externe neu zu erstellende Datei vm_modmainmenu.php eingebunden. Es wird eine neues Objekt $modmainmenutree instanziert und dann durch Übergabe der Kategrorie ID und das Haupt-Levels aufgerufen.
Damit VM mit dem Menutype "modmainmenu" etwas anzufangen weiss, muss diese 1. im der mod_virtuemart.xml bekannt geben werden. Das erfolgt durch Einfügen folgender Zeile im Block
| joomlapfad/modules/mod_virtuemart/mod_virtuemart.xml | |
174 |
<param name="menutype" type="list" default="links" |
Wurde diese Zeile dort eingefügt, kann 2. im Joomla Adminbereich unter Erweiterungen > Module > mod_virtuemart unter den Paramatern rechts ganz unten der Category-Display-Type "Joomla Modul MainMenu" ausgewählt werden.
Nun wird noch das Script vm_modmainmenu.php im Verzeichnis joomlapfad/modules/mod_virtuemart/ erstellt und die Style-Sheet-Datei als Navigation eingebunden.


