Grafiken in das Admin-Menü einfügen? Einzelne Menüpunkte hervorheben? Andere Menüpunkte ausblenden, wenn eine bestimmte Konfigurationsoption nicht gesetzt ist? Im Standard von Magento geht all das nicht. Wir zeigen, wie es dennoch gemacht werden kann.
Neue Menüpunkte im Admin-Bereich von Magento werden üblicherweise über die Datei etc/adminhtml.xml hinzugefügt. Das sieht in einem einfachen Beispiel wie folgt aus:
1 2 3 4 5 6 7 8 9 10 |
<?xml version="1.0" encoding="UTF-8"?> <config> <menu> <adminmenu translate="title" module="adminmenu"> <title>AdminMenu Test</title> <sort_order>11</sort_order> <action>adminhtml/adminmenu/test</action> </adminmenu> </menu> </config> |
Leider sind die Möglichkeiten etwas eingeschränkt. Daher stellen wir im Folgenden zwei Möglichkeiten der Erweiterung vor:
- Hinzufügen von CSS-Klassen zu Menüpunkten, um eine individuelle Gestaltung einzelner Menüpunkte zu erzielen
- Entfernen von Menüpunkten abhängig von der Konfiguration
Für beide Fälle muss die Block-Klasse Mage_Adminhtml_Block_Page_Menu erweitert werden. Entweder ersetzt man die Original-Klasse durch einen Rewrite, oder man tauscht den Layout-Block aus durch einen mit der eigenen Klasse. Das funktioniert über eine Layout-XML-Datei unter app/design/adminhtml/default/default/layout mit dem folgenden Inhalt:
1 2 3 4 5 6 7 8 9 |
<?xml version="1.0"?> <layout> <default> <reference name="root"> <action method="unsetChild"><name>menu</name></action> <block type="adminmenu/page_menu" name="menu" as="menu" /> </reference> </default> </layout> |
Hier wird also zunächst der alte Block entfernt und anschließend ein neuer mit dem gleichen Namen, aber anderem Blocktyp, hinzugefügt.
Die neue Klasse überschreibt zwei Methoden aus der bestehenden Klasse und fügt jeweils ein paar Zeilen hinzu (hervorgehoben):
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 |
<?php class IntegerNet_AdminMenu_Block_Page_Menu extends Mage_Adminhtml_Block_Page_Menu { /** * Recursive Build Menu array * Added handling of "ifconfig" and "class" nodes * * @param Varien_Simplexml_Element $parent * @param string $path * @param int $level * @return array */ protected function _buildMenuArray(Varien_Simplexml_Element $parent=null, $path='', $level=0) { if (is_null($parent)) { $parent = Mage::getSingleton('admin/config')->getAdminhtmlConfig()->getNode('menu'); } $parentArr = array(); $sortOrder = 0; foreach ($parent->children() as $childName => $child) { if (1 == $child->disabled) { continue; } $aclResource = 'admin/' . ($child->resource ? (string)$child->resource : $path . $childName); if (!$this->_checkAcl($aclResource)) { continue; } if ($child->depends && !$this->_checkDepends($child->depends)) { continue; } if ($child->ifconfig && !Mage::getStoreConfigFlag((string)$child->ifconfig)) { continue; } $menuArr = array(); $menuArr['label'] = $this->_getHelperValue($child); $menuArr['sort_order'] = $child->sort_order ? (int)$child->sort_order : $sortOrder; $menuArr['class'] = $child->class ? (string)$child->class : ''; if ($child->action) { $menuArr['url'] = $this->_url->getUrl((string)$child->action, array('_cache_secret_key' => true)); } else { $menuArr['url'] = '#'; $menuArr['click'] = 'return false'; } $menuArr['active'] = ($this->getActive()==$path.$childName) || (strpos($this->getActive(), $path.$childName.'/')===0); $menuArr['level'] = $level; if ($child->children) { $menuArr['children'] = $this->_buildMenuArray($child->children, $path.$childName.'/', $level+1); } $parentArr[$childName] = $menuArr; $sortOrder++; } uasort($parentArr, array($this, '_sortMenu')); while (list($key, $value) = each($parentArr)) { $last = $key; } if (isset($last)) { $parentArr[$last]['last'] = true; } return $parentArr; } /** * Get menu level HTML code * Added display of "class" attribute * * @param array $menu * @param int $level * @return string */ public function getMenuLevel($menu, $level = 0) { $html = '<ul ' . (!$level ? 'id="nav"' : '') . '>' . PHP_EOL; foreach ($menu as $item) { $html .= '<li ' . (!empty($item['children']) ? 'onmouseover="Element.addClassName(this,\'over\')" ' . 'onmouseout="Element.removeClassName(this,\'over\')"' : '') . ' class="' . (!$level && !empty($item['active']) ? ' active' : '') . ' ' . (!empty($item['class']) ? ' ' . $item['class'] : '') . ' ' . (!empty($item['children']) ? ' parent' : '') . (!empty($level) && !empty($item['last']) ? ' last' : '') . ' level' . $level . '"> <a href="' . $item['url'] . '" ' . (!empty($item['title']) ? 'title="' . $item['title'] . '"' : '') . ' ' . (!empty($item['click']) ? 'onclick="' . $item['click'] . '"' : '') . ' class="' . ($level === 0 && !empty($item['active']) ? 'active' : '') . '"><span>' . $this->escapeHtml($item['label']) . '</span></a>' . PHP_EOL; if (!empty($item['children'])) { $html .= $this->getMenuLevel($item['children'], $level + 1); } $html .= '</li>' . PHP_EOL; } $html .= '</ul>' . PHP_EOL; return $html; } } |
- Zeile 35-37 sorgt dafür, dass Menüpunkte ausgeblendet werden, für die der passende Konfigurationsbereich „false“ zurück gibt (neuer Knoten „ifconfig“)
- Zeile 45 und 94 sorgen dafür, dass eine konfigurierte CSS-Klasse im Menüpunkt angezeigt wird.
Beispiel:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="UTF-8"?> <config> <menu> <adminmenu translate="title" module="adminmenu"> <title>AdminMenu Test</title> <sort_order>11</sort_order> <action>adminhtml/adminmenu/test</action> <class>adminmenu</class> <ifconfig>admin/adminmenu/display_menu</ifconfig> </adminmenu> </menu> </config> |
In Zeile 8 ist eine CSS-Klasse angegeben, die im Menü dann auch so ausgegeben wird.
In Zeile 9 ist wieder definiert, dass der Menüpunkt nur dann angezeigt werden soll, wenn die entsprechende Konfigurationsoption aktiviert ist.
Sie können das Beispielmodul hier herunterladen.

Autor: Andreas von Studnitz
Andreas von Studnitz ist Diplom-Informatiker, Magento-Entwickler und Geschäftsführer von integer_net. Seine Schwerpunkte sind Entwicklung, Beratung und die Durchführung von Schulungen. Er ist Magento 2 Certified Professional Developer Plus und hat darüber hinaus weitere Magento Zertifizierungen für Magento 1 und Magento 2. Sowohl im Jahr 2019 als auch 2020 wurde Andreas als Magento Master in der Kategorie „Mentor“ ausgezeichnet.
Hi Andreas,
klasse Beitrag, vielen Dank!
Die „ifconfig“-Variante würde (mittlerweile) auch über
admin/adminmenu/display_menu
funktionieren.
Viele Grüße,
Christoph