Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit Navigation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit Navigation

    Hallo zusammen,

    Wie einige von euch sicher schon bemerkt haben, bin ich am erstellen eines Navigationsscripts. Ich habe damit sehr grosse probleme, doch bis jetzt kam ich schon relativ weit.
    Aus meiner Sicht sollte das Script, in dem Stadium wie es sich jetzt befindet, funktionieren. Doch irgendwie scheint der PHP-Parser da nicht der selben meinung zu sein, den das Script bringt nicht das gewünschte Ergebnis.

    Lasst es mich versuchen zu Erklähren...

    Was das Script tun soll ist eigentlich relativ einfach beschrieben. Es sind verscheidene Seiten in einer Datenbank gespeichert, die Unterseiten haben. Diese Unterseiten haben evtl. wieder Unterseiten usw.

    Also in dieser MySQL-Datenbank, sind alle Seiten gespeichert. Jede Seite hat eine eigene ID, einen Namen usw. Falls die aktuelle Seite die oberste Ebene ist, enthält "top_id" den Wert "-1". Es wird jeweils nur die übergeordnete Seite angegeben(respektive dessen ID).

    Beispieldatenbank:
    Code:
    ID || TOP_ID || Name || Beschreibung    ||
    1 || -1 || Startseite || Oberste Ebene ||
    2 || -1 || Über mich || Oberste Ebene ||
    3 || 2 || Portraits || Unterseite von "Über mich" ||
    4 || 3 || Ich selbst || Unterseite von "Portraits" ||
    Nun versuche ich den Code zu erklähren...
    Ich weis, es wird wohl relativ viel Text geben, doch bitte lasst euch nicht Abschrecken. Ich brauche wirklich eure Hilfe!!!

    Um die Verbindung mit der MySQL DB habe ich mich natürlich gekümmert.
    Es wird nun eine Schleife eingeleitet die solange durchläuft bis alle Werte der MySQL-Datenbank durch sind:
    PHP-Code:
    while($navi mysql_fetch_object($naviquery)) { 
    Es gibt nun eine Variable, namens "oldhis", diese Beinhaltet jeweils die top_id und danach die ID der aktuellen Seite und alle vorherigen(ist ein Array). Diese Variable würde, nachdem die gesamte Schleife durchgelaufen ist, beim obigen DB-Beispiel etwa so aussehen:
    Code:
    $odlhis = Array([0] = -1, [1] = 1, [2] = 2, [3] = 3, [4] = 3, [5] = 5)
    Wenn dies nun der erste Aufruf der Schleife ist, was durch das existieren der Variable $oldhis geprüft wird, wird die Variable $oldhis erstellt. Halt mit aktueller top_id und ID. Ausserdem werden die aktuellen Werte ausgegeben, und eine Variable namens tago erhöt. Die Variable tago wird später verwendet und gibt an wie viele Ebenen neu erstellt wurden.
    PHP-Code:
    while($navi mysql_fetch_object($naviquery)) {
    if(isset(
    $oldhis)) {
    /* ANWEISUNGEN */
    } else {
    $oldhis = array($navi->top_id$navi->id);
    echo 
    '<li><ul>';
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    $tago++;
    }

    Weiter oben wo jetzt /* ANWEISUNGEN */ steht, kommen jetzt auch solche.
    Es wird jetzt überprüft ob sich die aktuelle Seite(in der schleife) immer noch auf der selben ebene befindet. Dies wird gemacht, indem man überprüft ob der zweitletzte wert in $oldhis immernoch der selbe ist wie die aktuelle top_id(zur erinnerung: der array oldhis beinhaltet die top_id und die id, der bisher durchgelaufenen seiten(die seiten sind nach top_id sortiert)). Das habe ich so gelöst(das die ausgabe nun stattfindet ist ja klar):
    PHP-Code:
    while($navi mysql_fetch_object($naviquery)) {
    if(isset(
    $oldhis)) {
    if(
    $originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    }
    } else {
    $oldhis = array($navi->top_id$navi->id);
    }

    Jetzt wird zur überprüfung, ob man sich immernoch auf der selben ebene befindet, noch ein else hinzugefügt. Wenn sich die Werte nun nicht mehr auf der selben Ebene befinden, wird eine neue ebene angefangen. Es wird nun überpüft ob die aktuelle top_id dem letzten wert in oldhis entspricht(letzter wert bei Oldis: ID der letzten Seite). Damit die ebene vollständig richtig angefangen wird, wird die Variable "tago" erhöt. In dieser Variable befindet sich ein Wert, der angibt wie viele Ebenen schon geöffnet sind(tags opend). Natürlich wird auch der Array "oldhis" aktuallisiert. Dieser bekommt nun neu dazu, die top_id und die ID der aktuellen Seite.
    Die neuen Seite in der Navigation werden natürlich auch ausgegeben.
    Ich habe das dann so gemacht:
    PHP-Code:
    while($navi mysql_fetch_object($naviquery)) {
    if(isset(
    $oldhis)) {
    if(
    $originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    } else {
    if(
    $navi->top_id == $oldhis[count($oldhis)-1]) {
    $tago++;
    $oldhis[] = $navi->id;
    echo 
    '<li><ul>';
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    }
    }
    } else {
    $oldhis = array($navi->top_id$navi->id);
    }

    So, das grundlegende ist schonmal erklährt.
    Weiter geht's. Nun möchte ich eben nur gerade eine Ebene weiter hinausblicken können. Also nicht gleich alle Ebenen angezeigt bekommen, sondern nur die nächste. Deswegen beende ich die Schleife, wenn die aktuelle top_id der aktuellen ID entspricht($api = active page id):
    PHP-Code:
    if($oldhis[count($oldhis)-2] == $api) break; 
    Nun, dieses Script funktioniert schon recht gut. Ein Problem stellt sich mir jetzt aber noch: Wenn die ID der aktuellen Seite höher ist als dessen untergeordnete Seite, werden gleich alle Seiten aus der DB angezeigt. Auch für dieses problem glaubte ich eine lösung gefunden zu haben. Ich erstelle mir einen Array, namens "originalid", der die alten ID's beinhaltet und die neuen, die kleiner sind als die, die untergeordnet sind. So habe ich genau 2 neue Variabeln: oid - diese wird bei jedem schleifenaufruf erhöt und gilt als die neue id, originalid - der Array, der alle alten sowie neuen ID's beinhaltet.
    Bei jedem Aufruf geschiet nun also folgendes:
    PHP-Code:
    $oid++;
    $originalid[$navi->id] = $oid
    Beim ersten schleifenaufruf werden diese Variabeln auch noch definiert:
    PHP-Code:
    $oid 1;
    $originalid = array($navi->top_id => -1$navi->id => $oid); 
    Nun wird überall, wo entweder $navi->top_id oder $navi->id vorkommt dies durch $originalid[$navi->top_id] respektive $originalid[$navi->id] ersetzt!

    So, das wars, nun zum Problem!
    Schon jetzt, vielen Dank, das Ihr so weit gelesen habt!!!

    Mein gesamter Code sieht so aus:
    PHP-Code:
    <?php
    $naviqd 
    'SELECT * FROM `******` ORDER BY `top_id`';
    $naviquery mysql_query($naviqd);
    $tago 0;
    $ownid 1;

    while(
    $navi mysql_fetch_object($naviquery)) {
    if(isset(
    $oldhis)) {
    $oid++;
    if(
    $oldhis[count($oldhis)-2] == $originalid[$api]) break;
    $originalid[$navi->id] = $oid;
    if(
    $originalid[$navi->top_id] == $oldhis[count($oldhis)-2]) {
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    } else {
    if(
    $originalid[$navi->top_id] == $oldhis[count($oldhis)-1]) {
    $tago++;
    $oldhis[] = $originalid[$navi->id];
    echo 
    '<li><ul>';
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    }
    }
    } else {
    $oid 1;
    $originalid = array($navi->top_id => -1$navi->id => $oid);
    $oldhis = array($navi->top_id$originalid[$navi->id]);
    echo 
    '<li><ul>';
    echo 
    '<li><a href="index.php?api='.$navi->id.'" title="'.$navi->title_alternative.'">'.$navi->title.'</a></li>';
    $tago++;
    }
    }

    if(isset(
    $oldhis)) { /* Diese Zeilen sind zum schliessen der Tags... */
    $i 1/* Diese Zeilen sind zum schliessen der Tags... */
    while($i <= $tago) { /* Diese Zeilen sind zum schliessen der Tags... */
    echo '</ul></li>'/* Diese Zeilen sind zum schliessen der Tags... */
    $i++; /* Diese Zeilen sind zum schliessen der Tags... */
    /* Diese Zeilen sind zum schliessen der Tags... */
    /* Diese Zeilen sind zum schliessen der Tags... */
    ?>
    Nun besteht mein Problem, das ich gerne mit der Variable "originalid" gelöst hatte, immer noch.
    Ist die ID der aktuellen Seite höher als die, der unterseite, werden restlos alle Seiten in der Navigation angezeigt. Seien dies Unterseiten der aktuellen Seite oder nicht...
    Hat jemand eine Idee wie ich das lösen kann? Ich bin wirklich ab jeder hilfe extrem dankbar!

    Vielen Dank im voraus, und auch grossen Dank an die die diesen riesen Roman gelesen haben!!!

    MFG
    [ASTERIX]

  • #2
    AW: Problem mit Navigation

    ich habe dir schon angeraten, arrays zu nutzen. naja, hier ist mal ein funktionierendes beispiel, mit recursions würde es wohl einfacher gehen und mit unendlich vielen ebenen, aber dafür habe ich jetzt nicht die zeit.

    p.s. OOP los kann ich nicht mehr proggen

    PHP-Code:
     <?php

    error_reporting
    (E_ALL|E_STRICT);

    #DB DATEN
    $array=Array(
            Array(
    'id'=>1,'top_id'=>-1,'Name'=>'Startseite'),
            Array(
    'id'=>2,'top_id'=>-1,'Name'=>'Über mich'),
            Array(
    'id'=>3,'top_id'=>2,'Name'=>'Portraits'),
            Array(
    'id'=>4,'top_id'=>3,'Name'=>'Ich selbst'),
            Array(
    'id'=>5,'top_id'=>2,'Name'=>'Du ich und er'),
            Array(
    'id'=>6,'top_id'=>-1,'Name'=>'Speer und er'),
        );

    $menu=new menu($array);
    print_r($menu->create());

    class 
    menu
    {
        protected 
    $menu;
        protected 
    $top_menus=Array();

        public function 
    __construct(array $menu)    
        {
            
    $this->menu=$menu;
        }

        public function 
    create()
        {
            
    $return=Array(); $top_menus=Array();
            foreach(
    $this->menu as $entry)
            {
                if(
    $entry['top_id']===-1$return[$entry['id']]=$entry;
                    else
                    {
                        
    $top_menus[$entry['id']]=$entry['top_id'];

                        if(isset(
    $return[$entry['top_id']]))
                        {
                            if(!isset(
    $return[$entry['top_id']][$entry['top_id']]))
                            {
                                
    $temp=$return[$entry['top_id']];
                                
    $return[$entry['top_id']]=Array();
                                
    $return[$entry['top_id']][$entry['top_id']]=$temp;
                            }

                            
    $return[$entry['top_id']][$entry['id']]=$entry;
                        }
                        elseif(isset(
    $top_menus[$entry['top_id']]))
                        {
                            if(!isset(
    $return[$top_menus[$entry['top_id']]][$entry['top_id']][$entry['top_id']]))
                            {
                                
    $temp=$return[$top_menus[$entry['top_id']]][$entry['top_id']];
                                
    $return[$top_menus[$entry['top_id']]][$entry['top_id']]=Array();
                                
    $return[$top_menus[$entry['top_id']]][$entry['top_id']][$entry['top_id']]=$temp;
                            }
                        
                            
    $return[$top_menus[$entry['top_id']]][$entry['top_id']][$entry['id']]=$entry;
                        }
                        else throw new 
    Exception('Konnte Eintrag #'.$entry['id'].' nicht dem obermenü '.$entry['top_id'].' zuordnen! Wahrscheinlich falsche ordnung!');
                    }
            }

            return 
    $return;
        }
    }

    ?>
    gibt aus:

    Code:
     Array
    (
        [1] => Array
            (
                [id] => 1
                [top_id] => -1
                [Name] => Startseite
            )
    
        [2] => Array
            (
                [2] => Array
                    (
                        [id] => 2
                        [top_id] => -1
                        [Name] => Über mich
                    )
    
                [3] => Array
                    (
                        [3] => Array
                            (
                                [id] => 3
                                [top_id] => 2
                                [Name] => Portraits
                            )
    
                        [4] => Array
                            (
                                [id] => 4
                                [top_id] => 3
                                [Name] => Ich selbst
                            )
    
                    )
    
                [5] => Array
                    (
                        [id] => 5
                        [top_id] => 2
                        [Name] => Du ich und er
                    )
    
            )
    
        [6] => Array
            (
                [id] => 6
                [top_id] => -1
                [Name] => Speer und er
            )
    
    )
    jeweils der 1. punkt in einem array ist der oberpunkt. den kannst du mit array_shift herrausfinden.
    zudem kannst du das script optimieren indem du dir nur die ebenen raussuchst die du brauchst.
    Zuletzt geändert von Brian; 25.11.2007, 17:42.
    AC/DC Fanpage www.ifyouwantblood.de
    Nein zur Zensur im Internet und anderswo - Anonymous

    Kommentar


    • #3
      AW: Problem mit Navigation

      Hallo,

      Danke schonmals für die Antwort! Ja, den Tipp mit den Arrays hab ich auch noch im Hinterkopf gehabt... Doch ich wollt's zuerst so versuchen.

      Werde mir das Script nochmals genauer anschauen, doch mir selbst wär eine lösung direkt in der DB-Ausles-Schleife(ein Wort ) lieber. Doch falls ich tatsächlich keine Lösung finden würde, werde ich auf deine Methode umsteigen.

      Danke.
      Freue mich natürlich Trotzem weiterhin über Antworten, wie ich das direkt in der DB-Ausles-Schleife machen könnte.

      MFG
      [ASTERIX]

      Kommentar


      • #4
        AW: Problem mit Navigation

        Hi,

        bin kein Profiprogrammierer. Aber ich kann auch nur für die Verwendung von Arrays voten. Nicht nur das du flexibler mit den Daten arbeiten kannst, es entlastet imho auch die DB.

        Schönen Gruß

        Kommentar


        • #5
          AW: Problem mit Navigation

          Zitat von [ASTERIX] Beitrag anzeigen
          Hallo,

          Danke schonmals für die Antwort! Ja, den Tipp mit den Arrays hab ich auch noch im Hinterkopf gehabt... Doch ich wollt's zuerst so versuchen.

          Werde mir das Script nochmals genauer anschauen, doch mir selbst wär eine lösung direkt in der DB-Ausles-Schleife(ein Wort ) lieber. Doch falls ich tatsächlich keine Lösung finden würde, werde ich auf deine Methode umsteigen.

          Danke.
          Freue mich natürlich Trotzem weiterhin über Antworten, wie ich das direkt in der DB-Ausles-Schleife machen könnte.

          MFG
          [ASTERIX]
          wo ist dann das problem? ersetze einfach die foreach schleife durch deine auslese while schleife und gut ist....
          AC/DC Fanpage www.ifyouwantblood.de
          Nein zur Zensur im Internet und anderswo - Anonymous

          Kommentar


          • #6
            AW: Problem mit Navigation

            Hallo,

            Ja sorry, manchmal stelle ich mich wohl tatsächlich ein bisschen blöd. Sorry... Danke auf jeden fall! Auch für die Tipps!

            MFG
            [ASTERIX]

            Kommentar

            homepage-forum.de - Hilfe für Webmaster! Statistiken

            Einklappen

            Themen: 57.203   Beiträge: 432.325   Mitglieder: 29.596   Aktive Mitglieder: 49
            Willkommen an unser neuestes Mitglied, BillyTig.

            Online-Benutzer

            Einklappen

            621 Benutzer sind jetzt online. Registrierte Benutzer: 5, Gäste: 616.

            Mit 4.707 Benutzern waren am 12.01.2023 um 03:07 die meisten Benutzer gleichzeitig online.

            Die neuesten Themen

            Einklappen

            • bodan
              Bard - Googles Antwort auf ChatGPT geht ins Rennen
              Try Bard and share your feedback Mar 21, 2023 - so der Aufruf vor wenigen Stunden.

              und weiter: We’re starting to open access to Bard, an early experiment that lets you collaborate with generative AI. We're beginning with the U.S. and the U.K., and will expand to more countries and languages...
              22.03.2023, 23:20
            • daggel
              Eine horizontale Linie mit <hr> in css als bild mit wiederholung anzeigen?
              Hallo,

              ich bin neu hier und Webseiten-Anfänger. Trotzdem möchte ich in einem HR-Tag mit Css ein Bild anzeigen, dass nur horizontal über die gesamte Seite wiederholt wird.
              HTML-Code:
                <!--<div id="bild2">      
              <img src="..\Bilder\TrennungTranparentQuer.jpeg">
              ...
              22.03.2023, 15:44
            • bodan
              CloudFest Hackathon 2023 noch bis 23 März- mit innovativen Projekten
              Hi liebe Homepage-Foren-Feunde,


              hier ein kurzer Hinweis auf das CloudFest 2023

              wie immer gibts eine Fülle von Angeboten am Fest. Da ist ganz ganz viel dabei!
              ...unter anderem auch mit innovativen WordPress-Projekten: VS Code-Erweiterung für In-Browser-Entwicklung...
              21.03.2023, 12:41
            • PatX
              Design Hilfe zu einer Form die ein PHP Script triggert
              Ich würde mich über eure Meinung zu dem folgenden Szenario freuen:

              Ich möchte ein Formular einrichten, das im Wesentlichen die folgenden Schritte triggert:
              - Ein PHP-Skript ausführen
              - Formulardaten in die WordPress-Datenbank meiner Website speichern
              - KEINE anderen...
              21.03.2023, 07:20
            • Reservespieler
              Website pflegen
              Ein freundliches Hallo an alle,
              Ich würde gerne von meinem Verein die Pflege der Website übernehmen da es auch einige Vorteile als aktives Mitglied hat. Das Problem ist nur das ich überhaupt keine Ahnung davon habe.
              Daher hier meine Frage:
              Wie funktioniert sowas und was muss ich...
              18.03.2023, 16:48

            Die neuesten Beiträge

            Einklappen

            Lädt...
            X