Den neuen Menütyp "vm_modmainmenu" als mod_mainmenu-Clone in VM einbinden

Joomla bietet einen modernen und eleganten Menütyp mod_mainmenu an, der zudem als Modul sehr leistungsfähig und flexibel konfigurierbar ist. Über stylesheets lassen sich diese Menüs sehr einfach gestalten und bieten gute Möglichkeiten dies auch ergonomisch zu tun. VM nutzt jedoch seine eigenen Menü. Diese Categorie-Display-Typen sind als Modulbestandteile von mod_virtuemart zu finden unter joomlapfad/modules/mod_virtuemart/... Hier gibt es z.B. die Menütypen: dTree, JSCook, TigraTree, ThemeNavy, ThemeXP und vm_trensmenu. Keines dieser Menüs liefert aber eine Style-Class-Strukturen in gleicher Weise wie von mod_mainmenu erwartet. Leider. Will man als Designer aber die gesamt Seite einheitlich gestalten und so auch die VM-Menüs im gleichen Look-n-Feel anzeigen, dann müsste man diese mitgebrachten Menüs umgestalten und hätte schlimmstenfalls redundante Menüs - gleich aussehend aber mit jeweils ihren eigenen Scripten und CSS-Dateien. Hinzu kommt, dass die Struktur und z.B. Funktionslogik dieser Menüs anderen Prinzipien folgt und somit eine gleiche Funktion nur aufwendig zu erreichen ist. Diese Mühe habe ich mir gemacht und für VM ein mod_mainmenü als Categorie-Display-Type für das Module mod_virtuemart erstellt.
Dieses mod_mainmenu wird aber von VM nicht in gleicher Weise genutzt. Statt dessen nutzt VM eigene Menüs und liefert davon auch gleich ein paar verschiedene Varianten mit. Diese Categorie-Display-Typen sind als Modulbestandteile von mod_virtuemart zu finden unter joomlapfad/modules/mod_virtuemart/... Hier gibt es z.B. die Menütypen: dTree, JSCook, TigraTree, ThemeNavy, ThemeXP und vm_trensmenu. Keines dieser Menüs liefert aber eine Style-Class-Strukturen in gleicher Weise wie von mainmenu erwartet. Leider. Also muss für VM ein neuer mod_virtuemart-Categorie-Display-Typ her.

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
2
3
4
5
...
elseif( $menutype == "transmenu" ) {
include_once( $mod_dir . '/vm_mod_mainmenu.php' );
}
..

... 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
2
3
4
5
6
...
if ( $menutype == 'links' ) {
/* MENUTPYE LINK LIST */
echo $ps_product_category->get_category_tree( $category_id, $class_mainlevel );
}
...

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
95
96
97
98
elseif( $menutype == "modmainmenu" ) {
require_once( 'vm_modmainmenu.php' );
$modmainmenutree =& new modmainmenutree();
echo $modmainmenutree->get_category_mainmenu( $category_id, $class_mainlevel );
}

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
175
176
177
178
179
180
181
182
183
<param name="menutype" type="list" default="links"
label="Category display type"
description="You can set the display ... displayed in a dTree structure.">
<option value="links">Link List</option>
<option value="tigratree">TigraTree</option>
<option value="jscook">JSCook</option>
<option value="transmenu">TransMenu</option>
<option value="dtree">dTree</option>
<option value="modmainmenu">Joomla Modul MainMenu</option>
</param>

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.