Kategorien oder Menü hierarchisch anordnen
Wenn Web Seiten oder Kategorien in der Datenbank hinterlegt werden, dann ist eine saubere Struktur – am besten eine Hierarchie notwendig, um die Seiten in die richtige Reihenfolge zu bringen und somit dem Nutzer auf der Internetseite ein Menü oder eine Art Navigation zu bieten. In einer zum Beispiel hierarchisch aufgebauten Übersicht, in der Regel auch als Sitemap bekannt, findet sich der Nutzer besser zurecht und gelangt schneller zur richtigen Unterseite.
Um beispielsweise Kategorien auf einer Übersichtsseite zu sortieren, brauchen wir in der MySQL Datenbank zu jedem Kategorie-Datensatz zusätzlich ein Feld (Attribut), dass die Elternkategorie speichert. Wir nehmen an, dass jede Kategorie mehrere Kategorien, d.h. mehrere Unterseiten haben kann. Unsere Darstellung soll in der fertigen Navigation in etwa so aussehen:
Hauptkategorie
— Kategorie I
—- Untermenü
—- Unterseite
— Oberkategorie II
—- Sitemap
—- Unterkategorie
In der MySQL Datenbank haben wir dann für das obere Navigationsmenü folgende Einträge gespeichert, die wir dynamisch auslesen können und als ein assoziertes Array im (PHP) Script vorliegen haben:
ID | NAME | PARENT
——————————–
1 | Hauptkategorie | 0
——————————–
2 | Kategorie I | 1
——————————–
3 | Untermenü | 2
——————————–
4 | Unterseite | 2
——————————–
5 | Oberkategorie II | 1
——————————–
6 | Sitemap | 5
——————————–
7 | Unterkategorie | 5
Die ID sollte möglichst ein Feld vom Typ AUTO_INCREMENT sein. Das Feld PARENT gibt an, welche Seite die Elternseite ist. Mit der folgenden kleinen rekursiven Funktion können wir in PHP eine solche Sortierung erreichen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
function list_categories($list, $parent) { foreach ($list as $value) { $hasChildren = false; if($value['PARENT'] == $parent) { if($hasChildren == false) { $hasChildren = true; echo '<ul>'; } echo '<li>'; echo '<a href="/show_site.php?id='.$value['ID'].'">'.$value['NAME'].'</a>'; list_catagories($list, $value['ID']); echo '</li>'; } if($hasChildren == true) echo ''; } } |
Die Funktion wird mit zwei Parametern aufgerufen. Der erste Parameter ist die Liste der Kategorien als Array. Der zweite Parameter gibt die PARENT ID an, ab welcher man Seiten anzeigen will. Theoretisch könnte man hier auch nur einen Teil der oberen Liste darstellen. In diesem Tutorial starten wir mit dem Eintrag „Hauptkategorie“.
1 |
list_categories($array, 0); |
Nach dem ersten Aufruf wird die Funktion alle Einträge im Array durchgehen und den Eintrag mit der PARENT ID = 0 finden. Es wird ein HTML ul Tag und der gefundene Eintrag ausgegeben. Rekursiv ruft sich die Funktion selbst auf, es wird als zweiter Parameter die eindeutige ID des dargestellten Eintrags übergeben.
Daraufhin werden alle Einträge des Arrays ausgegeben, die die beim 1. rekursiven Aufruf die übergebene PARENT ID = 1 haben. In unserem Beispiel also „Kategorie I“ und „Oberkategorie II“. Für beide erfolgt jeweils nochmal ein rekursiver Aufruf der Funktion. Insgesamt sollte die Rekursion dwei Mal ausgeführt werden. Für die tiefsten Menüeinträge wird keine Rekursion durchgeführt, weil in die foreach-Schleife keine Einträge mit einer Eltern-ID 3, 4, 6 oder 7 finden wird. Ich denke das sollte als kleine Hilfe ausreichen. Für das richtige Einrücken auf der HTML Webseite müsste man in CSS noch für das „ul“ Tag einen inneren oder äußeren Abstand definieren. Standardmäßig sollte er aber schon vorhanden sein, falls kein CSS Reset erfolgt. 😉
Super Seite, gefaellt mir.
Hallo,
Wir möchten auf unserer Website computer-administrator.at im Vertikalen Menü unterhalb der Kategorien auch die Einzelnen Artikel anzeigen. Unsere Frage gibt es die Möglichkeit hier eine Einstellung zu machen dass nicht nur die Kategorien angezeigt werden sondern auch die zugehörigen Artikel?
Die manuelle Erstellung von Menüs ist für uns zu aufwändig vielleicht hat hier jemand eine Idee wie man das automatisieren kann.
Lg Lukas
Hallo Lukas, wie ich sehe wird auf der Webseite WordPress verwendet. Hier gibt es selbstverständlich die Möglichkeit auch Links zu den einzelnen Beiträgen anzuzeigen. Dazu müsste man im entsprechenden Template die Beiträge zur jeweiligen Kategorie abfragen und anzeigen. Wenn ich das richtig verstanden habe, dann soll das Ganze so ähnlich wie „Letzte Beiträge“ im rechten Menü aussehen. Eine solche spezielle Einstellung dafür wird es nur sehr selten in einem Theme geben, kann aber relativ einfach selbst eingebaut werden.