AdminBereich für Navigation

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Benutzeravatar
Nana23
Mitglied
Beiträge: 148
Registriert: 18.01.2003 11:59
Wohnort: Köln / Bad Salzungen
Kontaktdaten:

AdminBereich für Navigation

Beitrag 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?
Cojote
Mitglied
Beiträge: 40
Registriert: 14.10.2004 14:44

Beitrag 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.
Benutzeravatar
Nana23
Mitglied
Beiträge: 148
Registriert: 18.01.2003 11:59
Wohnort: Köln / Bad Salzungen
Kontaktdaten:

Beitrag 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?
Cojote
Mitglied
Beiträge: 40
Registriert: 14.10.2004 14:44

Beitrag 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ß
Benutzeravatar
Nana23
Mitglied
Beiträge: 148
Registriert: 18.01.2003 11:59
Wohnort: Köln / Bad Salzungen
Kontaktdaten:

Beitrag 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 :(
Cojote
Mitglied
Beiträge: 40
Registriert: 14.10.2004 14:44

Beitrag 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); 
} 
?>
Benutzeravatar
Nana23
Mitglied
Beiträge: 148
Registriert: 18.01.2003 11:59
Wohnort: Köln / Bad Salzungen
Kontaktdaten:

Beitrag von Nana23 »

ah danke so geht es nur noch eine frage
wie kann ich statt dem spacer.gif die einrückung durch leerzeichen bewerbstelligen?
Cojote
Mitglied
Beiträge: 40
Registriert: 14.10.2004 14:44

Beitrag 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ß
Benutzeravatar
Nana23
Mitglied
Beiträge: 148
Registriert: 18.01.2003 11:59
Wohnort: Köln / Bad Salzungen
Kontaktdaten:

Beitrag 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?
Cojote
Mitglied
Beiträge: 40
Registriert: 14.10.2004 14:44

Beitrag 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.
Antworten

Zurück zu „Coding & Technik“