php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 14.02.2007, 17:11  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard menü, nested set oder ähnliches?

ich habe mich bisher eigentlich nie mit mehrdimensionalen menüs befasst. jetzt möchte ich dies tun und habe mir die nested sets angesehen. das erscheint mir aber sehr sehr kompliziert.

in einer früheren oscommerce lösung war das ganze anders geregelt. es wurden hier zwar auch parent und filia vergeben, jedoch waren das einfach die id´s der anderen kategorien. hier habe ich jedoch absolut nicht durchgeblickt wie das abgefragt wird.

gibt es hier ein deutschsprachiges tutorial bezüglich so eines mehrdimensionalen menüs und dessen handhabung in der datenbank bzw. ausgabe? leider habe ich bei google nichts gefunden. nur etwas von ulf wendel, das ist jedoch nicht das was ich meine. irgendwie mit rekursion. nur leider habe ich nicht viel ahnung davon deshalb wäre ein tutorial praktisch.

beispiel:
0 - hardware
# 0_1 - mainboards
# 0_2 - irgendwas
## 2_50 - nochwas
1 - software
# 80 - spiele
__________________
mfg Alexander Haim
Promaetheus ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 14.02.2007, 18:25  
Erfahrener Benutzer
 
Registriert seit: 09.03.2005
Beiträge: 219
webbi
Standard

Nested Sets ist eigentlich nicht sehr kompliziert, wenn man sich einmal eingearbeitet hat. Ich würde es dir für dein Vorhaben empfehlen, wenn deine Menüstruktur komplexer werden sollte.

Ein deutsches Tutorial, was eigentlich alle wichtigen Punkte erklärt: http://www.klempert.de/nested_sets/artikel/

Auch die Datenbankausgabe von Mysql.

Übrigens der 1. Link bei Google für den Suchbegriff "nested sets"
webbi ist offline  
Alt 14.02.2007, 19:04  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

br.... eben die nested sets kenne ich und habe ich reichlich gefunden. davon wollte ich eben wegkommen. ich denke es geht doch auch einfacher oder? ich hab da jetzt das hier gefunden (wird auch so bei oscommerce benutzt, allerdings komischerweise mit einer nummer pro offener kategorie HIER:
PHP-Code:
<?php
function get_tree($who,$ebene) {
 
$res=mysql_query ("select * from stammbaum where nachfahre_von=$who;");
  while (
$verwandter=mysql_fetch_array($res)) {
    echo 
$ebene.$verwandter[name]."
"
;
    
get_tree($verwandter[id],$ebene."");
  }
}
?>
das einzige problem ist, dass mir noch nicht klar ist, wie ich beispielsweise NUR den zweig der grad aktiv ist aufblenden lassen kann, und die anderen nicht:
aktiv "strategie", also die kategorie id 8 (parent = 6)
0_1 - hardware
# 1_2 mainboards
# 1_3 grafikkarten
0_4 - software
# 4_5 - programme
## 5_9 - windows
## 5_10- linux
# 4_6 - spiele
## 6_7 - action
## 6_8 - strategie

dann sollte das menü so aussehen:
- hardware
- software
-- programme
-- spiele
---- action
---- strategie
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 14.02.2007, 19:07  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hast du den das Prinzip von Nested Sets verstanden?
http://de.wikipedia.org/wiki/Nested_Set
Zitat:
Das Nested Set ist ein Modell zur Abbildung eines Baumes mit Hilfe von Mengen, die ineinander verschachtelt sind. Dabei wird die ‚ist Unterbaum von‘-Beziehung auf eine ‚ist Teilmenge von‘-Beziehung abgebildet.
Den Satz finde ich eigentlich recht aussagekräftig.

Ein Nested Set Element speichert einen linken und einen rechten Wert. Die Werte dazwischen sind seine Unterelemente. Somit kannst du, wenn du ein Element auswählst mit nur einem SELECT seine kompletten Unterelemente erfassen (eben alle, deren IDs zwischen dem links- und rechts-Wert des Hauptmenüs liegen).

Natürlich muss nach jedem Einfügen eines neuen Menüpunktes die Datenbank reorganisiert werden. Das kannst du aber automatisieren.

Werd dir einfach nur über die Funktionsweise klar und leg dir dann einfach ein Skript zu, dass die ganze Arbeit für dich übernimmt.


Edit: Na gut, aber performant ist das ganze dann nicht und außerdem, wie findest du mit einem SQL-Query alle Unterelemente von XY. Du musst jeden Zweig einzeln durchlaufen (und genau das macht deine gepostete Funktion ja auch). Keine schöne Lösung.

Dir kann es doch letztlich eigentlich egal sein, wie dein Menü organisiert ist, solange der Algorithmus gut gekapselt (also nach außen nicht sichtbar) ist.
Schreib dir eine Funktion addMenu(), removeMenu(), getChildElements(), getParentElement() und die Funktionalität versteckst du dahinter.
Zergling-new ist offline  
Alt 15.02.2007, 12:42  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

Zitat:
Zitat von Zergling
Dir kann es doch letztlich eigentlich egal sein, wie dein Menü organisiert ist, solange der Algorithmus gut gekapselt (also nach außen nicht sichtbar) ist.
Schreib dir eine Funktion addMenu(), removeMenu(), getChildElements(), getParentElement() und die Funktionalität versteckst du dahinter.
in bezug auf nested sets meinst du das bezüglich "es kann mir egal sein"? oder überhaupt? ich habe das jetzt nicht ganz verstanden. die nested sets habe ich mir durchgelesen und auch recht gut verstanden, mir kommt das aber doch sehr kompliziert vor. vor allem die umsetzung. was hast du mit deinen funktionen gemeint? addMenu() removeMenu(). soll ich das in bezug auf nested sets machen oder wie?

hier in den shops ist das irgendwie anders gelöst: http://www.gamespot.at/catalog/defau...?cPath=1_31_81 nur weiss ich eben nicht wie.

es wird doch mehrere leute geben die auch so ein problem hatten oder? sprich wenn man ein cms mit einem menü und unbegrenzten submenüs machen möchte.

wäre super wenn ihr mir da einen lösungsvorschlag liefern könntet, mit dem ich, als php mittelmässiger zurecht komme.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 15.02.2007, 12:52  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Also so ganz verstehe ich dich nicht. Wenn dir Nested Sets zu komplziert zum programmieren ist, dann bleiben dir doch nur 2 Möglichkeiten:

a) Ein Skript downloaden. zB das hier: http://www.phpclasses.org/browse/package/2547.html
b) Eben nicht Nested Sets zu verwenden, mit all den Vor- und Nachteilen
Zergling-new ist offline  
Alt 15.02.2007, 13:06  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

was fertiges wollte ich eben nicht downloaden. ich möchte das ganze ja gern selber probieren um zu lernen. nur habe ich eben noch keinen ansatz wie ich das anfangen soll. bezüglich nested sets habe ich zwar infos gefunden wie das ganze gehandhabt wird, jedoch nicht wirklich ein tutorial oder ähnliches wie ich es in php umsetzen soll/kann.
von den anderen möglichkeiten (parent, ...) gibt es auch keine tutorials.

wollte mich in die materie einlesen und das ganze dann umsetzen. aber wie gesagt finde ich leider nichts dazu in bezug auf php umsetzung.
__________________
mfg Alexander Haim
Promaetheus ist offline  
Alt 15.02.2007, 13:31  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

webbi hat dir doch schon einen Link gepostet, der Artikel ist sehr gut
Zergling-new ist offline  
Alt 15.02.2007, 14:00  
Erfahrener Benutzer
 
Registriert seit: 17.07.2006
Beiträge: 140
louis
Standard

Tag zusammen,

aus meiner Sicht sind Nested Sets, nur um ein kleines baumstrukturiertes Menü darzustellen, etwas überdimensioniert. Allerdings ist der Ansatz, den Promaetheus aus OS Commerce hat, auch nicht so der Bringer. Rekursiv Queries abschicken ist definitiv kein guter Stil.

Mein Vorschlag, und so habe ich das auch schonmal in einem größeren Projekt gemacht:
- die Menüstruktur in der DB mit Parent-Beziehungen abspeichern
- die ganze Menüstruktur mit allen Infos mit einem Query in ein Array auslesen
- aus diesem Array rekursiv einen Baum erstellen (am besten über ein entsprechendes Baum-Objekt)
- den erzeugten Baum ausgeben

In den einzelnen Schritten stecken natürlich einige Punkte, die ein bisschen Gehirnschmalz erfordern...aber der OP will ja was lernen...
__________________
mfg louis
louis ist offline  
Alt 15.02.2007, 16:10  
Erfahrener Benutzer
 
Registriert seit: 07.11.2003
Beiträge: 526
Promaetheus
Standard

ich denke ich bin einfach zu doof für das.
wie kann ich denn das realisieren. zerbreche mir seit stunden den kopf. in der db mit parent_id speichern. root = 0.

bsp:
id, parent_id, name
1, 0, haupt1
2, 0, haupt2
3, 1, unterkat1_von_haupt1
4, 3, unterunterkat_von_unterkat1

auf der webseite dann stehe ich an und bekomme einen knopf ins hirn:
abfrage und anzeigen der hauptkategorien (link mit urlübergabe der id derselben) ist ja kein problem (select ... where parent_id = 0).

die nächste generation der gerade aktiven hauptkategorie auszulesen ist auch kein problem (select ... where parent_id = url_id).

mein problem ist das ganze dann zu kombinieren?
bsp:
Code:
<?php

/* db: menue
  id, parent_id, name
  1,  0,         hauptkat1
  2,  0,         hauptkat2
  3,  1,         unterkat von hauptkat1
  4,  3,         unterkat von unterkat der hauptkat1
*/  

// ausgabe der hauptkategorien
$sql = "SELECT id, parent_id, name FROM menue WHERE parent_id = 0";
$query = mysql_query($sql);
$output = ''
while($data = mysql_fetch_assoc($query) {
  $output.= ''.$data['name'].'';
}

// anzahl der töchter ausgeben
$sql = "SELECT id, parent_id, name FROM menue WHERE parent_id = $id";
$query = mysql_query($sql);
// nur wie kann ich das dann mit dem oberen kombinieren?

// navigation ausgeben:
echo $output;
?>
__________________
mfg Alexander Haim
Promaetheus ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Nested Sets und viele Fragen... BartTheDevil89 Datenbanken 7 13.08.2008 10:18
nested set dbmodell subtrees verschieben raffnix Datenbanken 12 08.06.2008 13:27
Nested Sets oder Rekursion? litterauspirna PHP Tipps 2008 8 06.06.2008 16:57
Nested Sets in ein Mehrdimensionales Array Simon9990 PHP-Fortgeschrittene 2 29.10.2007 17:38
Nested Sets Query GSJLink Datenbanken 12 08.09.2007 10:55
nested oder getrennt? was meint ihr? Promaetheus PHP Tipps 2006 4 01.07.2006 18:18
Nested Sets und Silbings nightfreak Datenbanken 10 06.01.2006 13:58
Nested Sets History Sirke PHP-Fortgeschrittene 1 21.10.2005 08:50
erklärung gesucht: nested set query! Sirke Datenbanken 0 19.09.2005 17:24
Alternative zu Nested Sets fantast Datenbanken 1 16.08.2005 01:14
hilfe nested sets zapate Datenbanken 6 02.08.2005 02:58
Nested Sets mit Berechtigungen? daniel987 Datenbanken 3 07.06.2005 22:18
[Erledigt] Frage zu nested sets... PHP-Fortgeschrittene 2 04.03.2005 09:57
Nested Set Trees und Pfade Datenbanken 0 16.12.2004 16:51
NESTED SETS dieses Thema sollte abgehakt werden PHP Tipps 2004 0 12.10.2004 18:18

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
http://www.php.de/php-tipps-2007/43446-menue-nested-set-oder-aehnliches.html, oscommerce hauptkategorie oben, nestedset menu, nested set menu, navigation nested sets, mehrdimensionales array aus nested set, nested set navigation, funktionsweise nested set, nested set navigation php, php menu nested set or parent, php menü mit nested set, navigation ausgeben nested sets, nested sets als navigation, navigation mit nested sets, navigation mit nested sets tutorial, php funktion für menu aus nested tree erstellen, nested set für navigation, php nested oscommerce, nested oscommerce, oscommerce parent_id hauptkategorie

Alle Zeitangaben in WEZ +1. Es ist jetzt 12:55 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.