Kategorien in Kategorien [Link-System]

cIrCa

Mitglied
Ich bin zurzeit daran, ein aufwändiges Linkverwaltungssystem zu entwickeln.
Mein Ziel wäre es, dass man die Links in Kategorien aufteilen kann.

Man sollte aber schlussendlich eine Unterkategorie in der Kategorie erstellen können, und dies soll sich bis ins unendliche wiederholen können.

Habt ihr dazu eine Lösung? Wie mache ich das am besten?

Vielen Dank für eure Hilfe
 
Für die Kategorieeinteilung würde ich eine Tabelle machen. Du speicherst für jede Kategorie die Id und die ID der Kategorie, die übergeordnet ist. So kannst du beliebig viele Kategorien untereinander verschachteln.
Für alle höchsten Kategorien, also für die, die keine übergeordnete Kategorie haben vergibst du einfach die ID 0.

Mit diesem Prinzip ist es auch recht einfach mal einen ganzen Kategoriebaum zu verschieben. Du brauchst dazu einfach nur die ID ändern.
 
Hm, ich weiss nicht, mir ist das irgendwie zu hoch.. hat jemand ein Beispiel?
Vielleicht hat ja von euch schon jemand sowas gecodet.
 
Ich hab sowas noch nicht geschrieben, aber dies geht sicherlich nur mit der Übergabe von vielen Kategorien: datei.php?hauptkategorie=1&unterkategorie=2&unterunterkategorie=4 usw. du müsstest die IDs per JOIN so verknüpfen das die jeweiligen IDs immer "ineinander greifen". Das ist wirklich ein sehr komplexes System, überlege dir des weiteren ob es Sinn macht unendlich viele Unterkategorien zu erstellen, denn dies fördert nicht unbedingt die Übersichtlichkeit.
 
Also ich hab sowas das man 3 Ebenen machen kann, die Kategorie --> Die Menüpunkte und die Beiträge, zu mehr kam ich bisher nicht ;)

Aber die habe ich dann in den einzelnen Tabellen verlinkt.

Würde mich aber auch mal interessieren wie das geht mit den Unterkategorien weil ich mir das nicht vorstellen kann.
 
So hab mir mal was überlegt, es müsste nach diesem System gehen:

cat_name | ID | parent_id
------------------------------------
Tester | 1 | 0
Test2 | 2 | 1

So nach dem Motto dürfte es gehen.

Mal sehen ob ich mein CMS nach diesem System umbau, danke für den Denkansatz :)

EDIT: Shit ich hätte es per EDIT auch editieren können ...
 
PHP:
function menu($id) {
  $query1 = mysql_query("SELECT * FROM menu WHERE id = $id");
  while ($query = mysql_fetch_row($query1)) {
    $query3 = mysql_query("SELECT * FROM menu WHERE id = $query['id']");
   if (mysql_num_rows($query) > 0) {
     menu($query['id']);
   }
   else{
      echo $query['name'];
   }
  }
}

Keine Ahnung ob das funktioniert... Ist übrigens eine rekursive Funktion (hab das mit PHP noch nie gemacht, weiss nicht mal ob es mit PHP geht... ;-) Sollte aber eigentlich schon...
 
Original geschrieben von aquasonic
PHP:
function menu($id) {
  $query1 = mysql_query("SELECT * FROM menu WHERE id = $id");
  while ($query = mysql_fetch_row($query1)) {
    $query3 = mysql_query("SELECT * FROM menu WHERE id = $query['id']");
   if (mysql_num_rows($query) > 0) {
     menu($query['id']);
   }
   else{
      echo $query['name'];
   }
  }
}


Keine Ahnung ob das funktioniert... Ist übrigens eine rekursive Funktion (hab das mit PHP noch nie gemacht, weiss nicht mal ob es mit PHP geht... ;-) Sollte aber eigentlich schon...

schaut nich schlecht aus.
Damit dürfte auch das Problem wie man die Kategorien ausliest gelöst sein.
D.h die Funktion müsste eigentlich alle Kategorien auslesen, also auch die 99 Ebene, können wenn ich mir nicht Irre oder?



Muss mich auch mal mit Rekursiven Funtkionen vertraut machen.

EDIT:

Besser wäre es wohl gewesen, anstatt $query['id'], noch eine Variable $query2['id'] an dieser Position zu machen:
PHP:
    $query3 = mysql_query("SELECT * FROM menu WHERE parent_id = $query['id']"); // Damit er auch den "Tochterquery" rausliest

while($query4 = mysql_fetch_assoc($query3))
{
   if (mysql_num_rows($query4) > 0) {
     menu($query4['id']);
   }
   else{
      echo $query['name'];
   }
}
Dann geht er denk ich mal alle Kategorien durch und bleibt nicht an den ersten beiden Ebenen hängen :)
 
Zuletzt bearbeitet von einem Moderator:
Die Funktion hat aber einen Haken: da sie rekursiv abläuft werden immer wieder neue Queries erzeugt. Je mehr Queries man absetzt, desto langsamer ist das ganze System.

Naja, ich würde dafür ja mal im Forum nach dem Stichwort NestedSet schauen ;-)

Damit kann man auch bis ins unendliche Kategorien anlegen und es ist obendrein auch noch effizient. Mit der Klasse CB_NestedSet und der darin enthaltenen Methode getBranch() bekommt man alle nachfolgenden Rubriken einer bestimmten Rubrik mit nur einem Query.

Ciao, Jörg
 
Zurück