Seite 1 von 2

AdminBereich für Navigation

Verfasst: 20.12.2004 09:09
von Nana23
Hi ich habe eine navigaton geschrieben.
wo man zwischen verschiedenen eben hin und her schalten kann, quasi ein Baum-Menü, nur wird nur die aktuelle Ebene angezeigt und nicht der ganze Baum.
Die DB ist wie folgt auf gebaut:

Code: Alles auswählen

Id
Name
parent_id
link_artikel
artikel_id
target  

in parent_id gebe ich die ID des übergeordneten Links an. bei artikel_id der zum link passende artikel bzw. bei link_artikel die art des links(zwei Frame/link/artikel).

Nun will ich für dieses Menü einen Administrationsbreich schreiben nur schaffe ich es nicht allein.
Frage1:
Wie kann ich mir die Links alle anzeigen lassen strukturiert?
Also Bsp:

Code: Alles auswählen

Link1
  Link2
  Link3
     Link4
Link5
  Link6
usw.
also die passenden Links/Unterlink zu einander angeordnet?

Verfasst: 20.12.2004 10:51
von Cojote
Du brauchst erstmal nen Anhaltspunkt wo du beginnst den Baum aufzubauen aufgrund der Struktur die du ja bereits hast wäre es am besten alle Knoten der ersten Ebene auszulesen und den Baum dann rekursiv aufbauen zu lassen.

Wenn ich deine Struktur richtig verstanden habe ist das gar nicht ohne weiteres möglich, da die Knoten erster Ebene nicht bestimmt werden können.
Damit du die Struktur nicht mehr ändern musst wäre es vielleicht sinnvoll einen Masterknoten einzusetzen der parent aller Links der ersten Ebene ist. So könntest du mit dem Master beginnen und dann per rekursiv und der jeweiligen parent_id immer tiefer springen.

Hoffe ich hab das Problem verstanden und mein Beitrag hilft etwas weiter.

Verfasst: 20.12.2004 10:59
von Nana23
ja du hast es erfasst.
ich hab zwar den punkt level noch in der db drinnen nur habe ich leider keine ahnung wie ich rekursiv programmiere
genau da liegt mein knapp punkt!
hab jetzt zwar das feld 'level' drinnen nur bringt es mich nicht weiter!

hast du ne idee wie ich programmier technisch am besten es umsetzten kann?
link oder sowas?

Verfasst: 20.12.2004 11:23
von Cojote
wenn du den Punkt level drin hast ist das doch schonmal Prima. Dann hast du nämlich den gesuchten Anhaltspunkt.
Wenn ich jetzt ein verfechter der reinen Lehre wäre würde ich dir natürlich statt dem level zu einem Masterknoten raten der praktisch die Spitze der Navigation bildet, da du so einen wirklich zusammenhängenden Baum bekommst den du dann beliebig durchlaufen kannst.

Machst du es jetzt so über den (das?) level dann erhälst du nur einzelne Zweige nämlich für jeden Hauptnavigationspunkt einen. Aber das funktioniert und von daher ist es auch ok so, wenn du nicht weitere Akrobatiken mit deiner Navigation machen möchtest.

Zum Vorgehen:
Zuerst würde ich mir die Navigationspunkte des Levels auslesen die Hauptpunkte sind (ist das bei der level 0?).
Diese würde ich nach und nach einer rekursiven Funktion übergeben die dann den jeweiligen Baum des Navigationspunkts durchläuft.

Code: Alles auswählen

<?php
$rs = mysql_query("SELECT * from Tabelle where level=0);
while($row = mysql_fetch_array($rs)) {
    //hier alle Linkdaten des Links assignen
   makeNav($row['id'], 0)
}

function makeNav($parent_id, $level) {
   //$level gibt an wie tief du im Baum bist...das ist wichtig für die   Einrückung
 $sql = "SELECT * from Tabelle WHERE parent_id=$parent_id";
 $rs = mysql_query($sql);
 while($row = mysql_fetch_array($rs) {
     //hier wieder Linkdaten und Einrückung assignen
    makeNav($row['id'], $level+1);
}
?>
Ist mal eine kleine Idee von mir. Keine Garantie auf Vollständigkeit sowie auf Fehlerfreiheit.

Hoffe das bringt dir vielleicht eine Idee für ne Lösung.

Gruß

Verfasst: 20.12.2004 12:17
von Nana23
irgendwie habe ich ein brett vorm kopf :(
mein oberstes level ist 0

ich habe mal deine function genommen und meinen daten usw. entsprechend angepasst.
nur klappt es irgendwie nicht.
also hier mal ein DB auszug:

Code: Alles auswählen

CREATE TABLE `dlo_navi_kat` (
  `Id` int(11) NOT NULL auto_increment,
  `Name` varchar(25) NOT NULL default '',
  `parent_id` varchar(25) NOT NULL default '',
  `level` varchar(25) NOT NULL default '',
  `link_artikel` varchar(25) NOT NULL default 'link',
  `artikel_id` varchar(25) NOT NULL default '',
  `target` varchar(25) NOT NULL default '_self',
  PRIMARY KEY  (`Id`)
) TYPE=MyISAM AUTO_INCREMENT=12 ;

#
# Daten für Tabelle `dlo_navi_kat`
#

INSERT INTO `dlo_navi_kat` VALUES (4, 'Abteilungen', '1', '0', 'link_artikel', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (5, 'FAQ', '1', '0', 'link_artikel', '2', '_self');
INSERT INTO `dlo_navi_kat` VALUES (6, 'EU', '4', '1', 'link_artikel', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (7, 'G3/TOC', '4', '1', 'link', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (8, 'G2', '4', '1', 'link_artikel', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (9, 'KU', '4', '1', 'link_artikel', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (10, 'CG', '4', '1', 'link_artikel', '22', '_self');
INSERT INTO `dlo_navi_kat` VALUES (11, 'G6', '4', '1', 'link_artikel', '22', '_self');
    
so sieht meine tabelle aus und die datein zum abrufen ist diese:

Code: Alles auswählen

include 'include/config.php';

$sql = "select * from dlo_navi_kat where Id=4";
$menuelinks = mysql_query($sql) OR die(mysql_error());
$row23 = mysql_fetch_object($menuelinks);

$sql = "select *from dlo_navi_kat where level =1";
$rs = mysql_query($sql);
//$rs = mysql_query("SELECT * from dlo_navi_kat where level=1");
while($row = mysql_fetch_array($rs)) {
    //hier alle Linkdaten des Links assignen
   makeNav($row['Id'], 0);
}

function makeNav($parent_id, $level) {
   //$level gibt an wie tief du im Baum bist...das ist wichtig für die Einrückung
 $sql = "SELECT * from dlo_navi_kat WHERE parent_id=$parent_id";
 $rs = mysql_query($sql);
 while($row = mysql_fetch_array($rs)) {
     //hier wieder Linkdaten und Einrückung assignen
    makeNav($row['Id'], $level+1);
}
}

  makeNav(4,1);
nur kriege ich keine ausgabe hin :(

Verfasst: 20.12.2004 12:26
von Cojote
welches konkretes Beispiel willst du denn durchgehen?

Wie gibst du die Daten denn aus? per echo oder Template?
Der Einfachheit halbe gehe ich mal von echo aus und mache ein Beispiel wie du das Menü Abteilungen aufbaust:

Code: Alles auswählen

<?php 
$rs = mysql_query("SELECT * from Tabelle where Id=4);  //lese Eintrag Abteilungen 
while($row = mysql_fetch_array($rs)) { //schleife macht nur Sinn wenn du mehrere Hauptmenüs nacheinander aufbauen möchtest...dann oben in der Abfrage aber auch nach level suchen und nicht nach ID
    echo $row['Name']."<br>";
   makeNav($row['Id'], 1); 
} 


function makeNav($parent_id, $level) { 
   //$level gibt an wie tief du im Baum bist...das ist wichtig für die   Einrückung 
 $sql = "SELECT * from Tabelle WHERE parent_id=$parent_id"; 
 $rs = mysql_query($sql); 
 while($row = mysql_fetch_array($rs)) { 
     echo '<img src="spacer.gif" width=' . 20*$level . 'height=1>';  //hier wird spacer.gif verwendet um die Einrückung zu erzeugen
     echo $row['Name']."<br>";
    makeNav($row['Id'], $level+1); 
} 
?>

Verfasst: 20.12.2004 14:01
von Nana23
ah danke so geht es nur noch eine frage
wie kann ich statt dem spacer.gif die einrückung durch leerzeichen bewerbstelligen?

Verfasst: 20.12.2004 20:24
von Cojote
Hallo,

wenn du es nur mit Leerzeichen machen möchtest ersetze folgendes in der Funktion makeNav

Code: Alles auswählen

while($row = mysql_fetch_array($rs)) { 
     echo '<img src="spacer.gif" width=' . 20*$level . 'height=1>';  //hier wird spacer.gif verwendet um die Einrückung zu erzeugen 
     echo $row['Name']."<br>"; 
    makeNav($row['Id'], $level+1); 
}


durch

Code: Alles auswählen

while($row = mysql_fetch_array($rs)) { 
    for($i=0; $i<$level*20;$i++) {  //die Zahl hinter * gibt die Stärke der Einrückung an
        echo "&nbsp;";
    }
    echo $row['Name']."<br>"; 
    makeNav($row['Id'], $level+1); 
}
Gruß

Verfasst: 21.12.2004 07:21
von Nana23
hey danke das klappt auch primal, vielen dank
Eine frage zum Abschluss noch:

ich will die sind in einem dropdown menü unterbringen damit sie in einem formular liegen und ich sie am besten verarbeiten kann.
Wie bau ich dort dieses ein?
bei mir entstehen dann ganz viele felder und nicht ein einziges.
hier mal der code:

Code: Alles auswählen

  $rs = mysql_query("SELECT * FROM dlo_navi_kat where Id=4");  //lese Eintrag Abteilungen
while($row = mysql_fetch_array($rs)) {     echo $row['Name']."<br>";
   makeNav($row['Id'], 1);
}


function makeNav($parent_id, $level) {
echo "<form method=\"POST\" action=\"$PHP_SELF\">";
echo "<p><select size=\"15\" name=\"D1\">";*/
 $sql = "SELECT * from dlo_navi_kat WHERE parent_id=$parent_id";
 $rs = mysql_query($sql);
 while($row = mysql_fetch_array($rs))
  {
     echo '<option>';
     echo $row['Name']."<br>";
     makeNav($row['Id'], $level+1);
}
echo "<option>2</option>";
echo "<option>2</option>";
echo "</select>";
echo "</p>";
echo "<p><input type=\"submit\" value=\"Abschicken\" name=\"B1\"></p>";
echo "<p>&nbsp;</p>";
echo "<p><input type=\"reset\" value=\"Zurücksetzen\" name=\"B2\"></p>";
echo "</form>";
}

makeNav(0,0);
und wie schaffe ich es wenn ich was auswaehl, das die davorstehenden leerzeichen nicht mit gesendet werden in der var?

Verfasst: 21.12.2004 10:50
von Cojote
Der Option Tag hat ein value-Attribut dass du nutzen kannst.

Du kannst dann im vlaue Attribut den Wert ohne Leerzeichen angeben. Bei der ausgewählten option wird dann imer der value übertragen. Innerhalb des Tags gibst du das ganze mit Leerzeichen aus und hast deine Einrückung mit Übertragung der richtigen Werte.

So wie ich das sehe erzeugst du aber jetzt mit der makeNav invaliden Code da du ja für jeden Punkt ne neue select-Liste aufmachst.