Sortierung von Menupunkten

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

  • Sortierung von Menupunkten

    Hallo, ich arbeite an einem Menu, dass vom User selbst erstellt werden kann und komplett editiert werden kann. Ich habe zwar bis jetzt schon einige vorschläge bekommen, bringe aber nichts zu stande. Am Ende sollte das Menu so aussehen:
    Haupttitel
    -inhalt
    -inhalt

    Haupttitel 2
    -inhalt
    -....usw

    Nun zu meiner Frage, wie löse ich das am besten, wenn ich dem User die möglichkeit geben will, die ganzen Kategorien (Menublöcke) und aber auch die Untertitel selbst zu sortieren. Ich denke eine Sortspalte machen und dort dann Werte tauschen. Hat jemand damit erfahrung?

    Danke schon im voraus für die Hilfe
    Figugegu

  • #2
    sicher ... 4 Spalten
    - ID
    - PARENT
    - POS
    - LABEL

    In PARENT steht für die Haupttitel 0, für die Unterpunkte die ID des jeweiligen Haupttitels;
    in POS wird die Reihenfolge bestimmt.

    Für eine saubere Struktur wäre zwar rein theoretisch ein UNIQUE index über PARENT,POS fällig; aber der behindert das Verschieben der Positionen einigermaßen.

    Bei einem Menü mit nur zwei Ebenen kriegst du sogar noch alle Einträge mit einer Query:

    select a.ID, a.LABEL, if(b.ID,0,1) as is_haupttitel
    from tabelle a
    left join tabelle b on b.ID=a.PARENT
    order by if(b.ID,b.POS,a.POS), b.ID
    mein Sport: mein Frühstück: meine Arbeit:

    Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

    Kommentar


    • #3
      Hmmm, ich verstehe deine Ausgabe nicht so ganz. Aber noch was anderes, das mit den Feldern ist mir eigentlich klaar, aber wie schreibe und tausche ich jetzt diese Werte?

      Kommentar


      • #4
        Schau mal ins Handbuch:
        7.4.2 INSERT-Syntax
        7.4.5 UPDATE-Syntax
        7.3.3.1 Arithmetische Operationen
        mein Sport: mein Frühstück: meine Arbeit:

        Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

        Kommentar


        • #5
          ok

          Ok, ich werde das mal genauer anschauen.
          Danke

          Kommentar


          • #6
            Hmmm, ich blick da nicht genau durch, ich habe nach einem Code, den ich gefunden hab, etwas zusammengestellt:

            PHP-Code:
            if ($up) {
            sql="UPDATE menu_test SET no=0 WHERE no=$no";
                    
            $result mysql_query($sql,$db);
                    
            sql="UPDATE menu_test SET no = '$no' + 1 WHERE no BETWEEN 1 AND $no ORDER BY no";
                    
            $result mysql_query($sql,$db);
                    
            sql="UPDATE menu_test SET no = 1 WHERE no = '$no'";
                    
            $result mysql_query($sql,$db);

            Nur stimmt es irgendwi nicht so recht.
            Es wird nach der Spalte no sortiert!

            THX

            Kommentar


            • #7
              irgendwie hast du da einen denkfehler.

              $alte_position = 5;
              $neue_position = 2;

              mit den 2 werten kannst du jetzt aufstufen:
              PHP-Code:
              sql="UPDATE menu_test SET no=0 WHERE no=$alte_position";
                      
              $result mysql_query($sql,$db);
                      
              sql="UPDATE menu_test SET no = no + 1 WHERE no BETWEEN  $neue_position AND $alteposition";
                      
              $result mysql_query($sql,$db);
                      
              sql="UPDATE menu_test SET no = $neue_position WHERE no = 0";
                      
              $result mysql_query($sql,$db); 
              mit der parentid kannst du das ganze weiter eingrenzen.
              Kissolino.com

              Kommentar


              • #8
                Ich bin mir da nicht so sicher. Ich habe zu jedem Eintrag einen Link "auf" und einen "ab". Wenn ich nun "auf" wähle, wird die no (alt) mitgegeben und up=1.

                PHP-Code:
                if($up) {
                sql="UPDATE menu_test SET no=0 WHERE no=$no";
                        
                $result mysql_query($sql,$db);
                        
                sql="UPDATE menu_test SET no = no + 1 WHERE no BETWEEN  $no+1
                 AND 
                $no";
                        
                $result mysql_query($sql,$db);
                        
                sql="UPDATE menu_test SET no = $no+1 WHERE no = 0";
                        
                $result mysql_query($sql,$db);

                Ich schnalls echt nicht.

                Danke für die Geduld!

                Figugegu

                Kommentar


                • #9
                  [list=1][*]Wie Wurzel schon erwähnte, solltest du
                  die Queries mit der parent_id eingrenzen.
                  also: neuer Parameter parent dazu[*]Um einen Punkt nach oben (vorne) zu verschieben,
                  musst du seine Position verringern;
                  also -1 in der dritten Query und[*]da du nur um eine Position verschieben willst,
                  kannst du dir das between in der zweiten Query sparen:
                  ... where parent=$parent and no=$no-1[*]Wenn du noch weitere Hilfe brauchst,
                  poste mal deine Tabellenstruktur
                  (am besten als Dump, da sind dann auch alle Indizes dabei)[/list=1]
                  mein Sport: mein Frühstück: meine Arbeit:

                  Sämtliche Code-Schnipsel sind im Allgemeinen nicht getestet und werden ohne Gewähr auf Fehlerfreiheit und Korrektheit gepostet.

                  Kommentar


                  • #10
                    OK, ich verstehe das mit der parent_id noch nicht. Sollte ich da in der Schleife einen Zähler einbauen und die zugewiesene nummer mitgeben? Meine Tabellenstruktur sieht so aus:

                    CREATE TABLE `menu_test` (
                    `id` tinyint(4) NOT NULL auto_increment,
                    `no` tinyint(4) NOT NULL default '0',
                    `titel` varchar(60) NOT NULL default '',
                    `inhalt` text NOT NULL,
                    `autor` varchar(60) NOT NULL default '',
                    `date` datetime NOT NULL default '0000-00-00 00:00:00',
                    `language` char(3) NOT NULL default '',
                    `fot` char(2) NOT NULL default '',
                    `cat` tinyint(4) NOT NULL default '0',
                    PRIMARY KEY (`id`)
                    ) TYPE=MyISAM AUTO_INCREMENT=39 ;


                    no ist die Sortierung innerhalb einer Categorie

                    Kommentar


                    • #11
                      denk nochmal in aller ruhe drüber nach:

                      mit meinem/deinem code stufst du positionierst du einen eintrag um,
                      unabhängig von seiner zuordnung in der struktur oder kategorie = alle!

                      damit fehlt dir die eindeutigkeit.

                      eindeutig ist es, wenn du so vorgehst:
                      1. update:
                      "setze die position des eintrages mit der eintragsid x auf 0"

                      2. update:
                      "ändere die position aller einträge um 1 (+|-), die zur selben kategorie gehören, wie der eintrag mit der eintragsid x"

                      3. update
                      "setze die position des eintrages mit der eintragsid x auf die zielposition"

                      wenn du das jetzt auf mysql umsetzt, bist du am ziel.
                      Kissolino.com

                      Kommentar


                      • #12
                        Vielen Dank, soweit verstanden.. was ich aber noch immer nicht verstehe, ist, wie ich im 3. Update die zielposition festlege... ich möchte den Eintrag ja wirklich nur eine Stelle nach oben..


                        EDIT:
                        Noch was, wenn ich jetzt einen neuen Eintrag mache, welche nummer soll der bekommen? 0?
                        Zuletzt geändert von figugegu; 08.11.2003, 15:58.

                        Kommentar


                        • #13
                          es geht!
                          Nur leider werden die Eintrage entweder ganz nach oben oder ganz nach unten verschoben!

                          Kommentar


                          • #14
                            schau dir mein posting mit start & ziel nochmal an.

                            im prinzip brauchst du 3 werte:
                            - id des eintrages
                            - aktuelle position
                            - die zielposition

                            aufstufen:
                            eintrag 1 mit der position 3 soll auf position 5 verschoben werden

                            - eintrag 1 wird position=0
                            - alle einträge, die >= startposition 3 UND <= zielposition 5 sind, werden um 1 reduziert (4 wird 3, 5 wird 4)
                            - damit ist 5 frei und wird im letzten update vom aktuellen eintrag belegt


                            abstufen:
                            eintrag 1 mit der position 8 soll auf position 3 verschoben werden

                            - eintrag 1 wird position=0
                            - alle einträge, die >= zielposition 1 UND <= startposition 8 sind, werden um 1 erhöht (3 wird 4, 4 wird 5 .... 7 wird 8)
                            - damit ist 3 frei und wird im letzten update vom aktuellen eintrag belegt

                            du musst lediglich unterscheiden, ob du aufstufen (zielpos > startpos)
                            oder abstufen (zielpos < startpos) willst und danach die queries
                            abstimmen.


                            wenn du einen neuen eintrag erstellst, hast du 2 möglichkeiten:
                            - du hängst ihn hinten an (letzteposition der kategorie +1)
                            - du packst ihn an eine bestimmte position, dann machst du vor dem insert ein update:
                            --- erhöhe alle positionen+1 deren nummer >= der zielposition ist
                            --- danach das insert mit der zielposition und das wars.
                            Kissolino.com

                            Kommentar


                            • #15
                              hoch:
                              Code:
                              pseudocode:
                              
                              jetzige_position="SELECT pos FROM tabelle WHERE id=45"
                              andere_id="SELECT id FROM tabelle WHERE pos>jetzige_position ORDER BY pos ASC LIMIT 1"
                              
                              UPDATE tabelle SET pos=pos-1 WHERE id=andere_id
                              
                              UPDATE tabelle SET pos=pos+1 WHERE id=45
                              runter:
                              Code:
                              pseudocode:
                              
                              jetzige_position="SELECT pos FROM tabelle WHERE id=45"
                              
                              andere_id="SELECT id FROM tabelle WHERE pos<jetzige_position ORDER BY pos DESC LIMIT 1"
                              
                              UPDATE tabelle SET pos=pos+1 WHERE od=andere_id
                              
                              UPDATE tabelle SET pos=pos=1 WHERE id=45
                              so kannst du einen eintrag um eine stelle hoch oder runter stufen (die einschränkung, dass alles innerhalb derselben parent_id bleibt fehlt noch)

                              wenn du komplett umsortieren willst, empfehle ich dir nach nested sets zu googlen
                              Ich denke, also bin ich. - Einige sind trotzdem...

                              Kommentar

                              Lädt...
                              X