Reihenfolge der Links in einer Navigation verändern

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

  • Reihenfolge der Links in einer Navigation verändern

    Eins vorneweg: Ich hab mich jetzt mehrere Stunden durch google gewühlt aber nichts gefunden. Hier im Forum fand ich einige Beiträge, die zwar mein Problem im Ansatz beschreiben, aber keine Lösung. Also versuche ich mein Glück mal.

    Ich will in meinem CMS die Funktion für eine dynamische Navigation einbauen. Man soll Links einfach über eine Eingabemaske hinzufügen können. Das ganze wird dann in einer MySQL- Datenbank gespeichert.

    Das Problem:
    Ich will, dass man die Reihenfolge ändern kann.

    Zuerst dachte ich, dass in die Tabelle die Spalte "position" hinzugefügt wird und gut ist. Allerdings müssten alle nachfolgenden Links bei einer Verschiebung um eins erhöht werden. Und ich fände es seeehr lästig, jeden Datensatz zu aktualisieren.

    Beispiel: Angenommen ich hab folgende Datensätze.
    1 - Home
    2 - Links
    3 - Bla
    4 - Blabla

    Nun soll Link 4 aber zwischen 1 und 2. Die Angabe in Klammern gibt die vorige Position an.

    1 - Home (1)
    2 - Blabla (4)
    3 - Links (2)
    4 - Bla (3)

    Ich denke, das beschreibt das Problem deutlich.

    Diese Möglichkeit kommt also nicht in Frage.
    Aber was stattdessen? Kann mir jemand von euch ein paar Tipps zur Realisierung geben?

  • #2
    kann dir aus eigener erfahrung sagen, dass es nicht verkehrt ist, die spalte "position" zu haben. das vorgehen würd ich dann folgendermaßen beschreiben:

    1. die spalte ist autoinkrementierend, so erscheinen neue elemente immer zum schluß (bzw. anfang, je nach dem).

    2. in der tabelle, in der die elemente angezeigt werden, gibt es für jede zeile zwei links - in etwa
    Code:
    reorder.php?position=7&direction=up
    reorder.php?position=7&direction=down
    3. beim anklicken ermittelt reorder.php zuerst die nächste bzw. vorige "position_nr".

    4. hier gibt es einen artikel, in dem beschrieben wird, wie man zwei werte in einer spalte leicht austauschen kann: http://devdesign.de/log/programmieru...stauschen.html

    beispiel:

    Code:
    name              |              position 
    erster_eintrag                         1
    zweiter_eintrag                         3
    dritter_eintrag                         7
    nach dem anklicken von "zweiter eintrag nach oben":

    Code:
    name              |              position 
    zweiter_eintrag                         1
    erster_eintrag                         3
    dritter_eintrag                         7
    so braucht reorder.php nur 2 queries, und das nötige ist erreicht.

    Kommentar


    • #3
      Ich glaube ich verstehe.

      in einem Satz zusammengefasst:

      Man verändert also nicht die Position, sondern den Linknamen?

      Richtig?

      Kommentar


      • #4
        nein. aber lies noch mal.

        Kommentar


        • #5
          Ich habs jetzt mehrfach versucht, aber es kommt immer wieder das selbe bei rum.

          Die Spalte "position" ist unverändert, dafür werden die entsprechenden Werte in "name" getauscht. Das ist das einzige, was ich daraus schließen kann.

          Außerdem finde ich die Idee gar nicht mal so verkehrt, wenn ich sie richtig zu Ende gedacht habe.

          Kommentar


          • #6
            Die Spalte "position" ist unverändert, dafür werden die entsprechenden Werte in "name" getauscht.
            andersrum - die spalte "position" ist die einzige, die verändert wird. nur habe ich die anzeige einer tabelle "sortiert nach 'position' aufsteigend" nachgestellt.

            denn es ist ganz einfach (wie dem artikel entnommen werden kann) zwei ganzzahlige werte in sql zu tauschen.

            Kommentar


            • #7
              Naja, mit dem Tauschen von ganzzahligen Werten hab ich auch noch so meine Probleme.

              Die Funktion IN() finde ich im MySQL- Handbuch nicht mal. Aber das ist ne andere Geschichte.

              Trotzdem finde ich, dass mein Problem bestehen bleibt. Mit deinem Beispiel kann ich den letzten Eintrag ja nur mit einem beliebigen Tauschen. Ich würde ihn aber gerne zwischen zwei beliebige Einträge einordnen.

              Oder versteh ich die Sache komplett falsch?

              Kommentar


              • #8
                1. http://dev.mysql.com/doc/mysql/en/co...operators.html

                2.
                Mit deinem Beispiel kann ich den letzten Eintrag ja nur mit einem beliebigen Tauschen.
                nein, eher so: man kann ein beliebiges element mit einem vorigen bzw. nächsten element in der reihenfolge tauschen. mit einfachen worten, "eine zeile rauf bzw. runter bewegen."

                wenn du die neue position "beliebig" gestalten willst, z.b. die letzte zeile (von insg. 10) zwischen die erste und die zweite setzen, wirst du es viel schwieriger haben.

                Kommentar


                • #9
                  Stimmt, jetzt macht alles Sinn.

                  Wenn ich jetzt allerdings

                  PHP-Code:
                  UPDATE navi
                  SET position 
                  = (position
                  WHERE position IN (2,3); 
                  ausführe, erhalte ich

                  #1062 - Duplicate entry '3' for key 1
                  Liegts an der Datenbankstruktur?

                  name varchar(10)
                  position int auto_increment, primary_key

                  Kommentar


                  • #10
                    ja, ein primary key darf die position nicht sein. hast du nicht eine spalte "id" oder so? lass sie doch primkey sein.

                    Kommentar


                    • #11
                      Jetzt klappt alles wie es soll.

                      Vielen Dank für deine Hilfe!

                      Kommentar


                      • #12
                        Hallo!

                        Der Link oben mit der beschrieben von dem umtauschen ist tot.
                        Ich will das auch machen!
                        Kann mir jemand sagen was da drin gestanden hat?

                        gruß, sepul

                        Kommentar


                        • #13
                          nicht viel mehr, als das, was hier besprochen wurde..

                          vielleicht noch ein allgemeiner takt zu der zweiten query:
                          Code:
                          UPDATE ...
                          SET position = ([summe] - position) 
                          WHERE position IN ([alte_position],[neue_position]);
                          mit [summe] = [alte_position] + [neue_position]

                          Kommentar


                          • #14
                            Hallo!

                            Hab jetzt noch ein problem:
                            Ich wollte jetzt den table anlegen.

                            SQL-Befehl:

                            CREATE TABLE partner(
                            id int NOT NULL ,
                            PRIMARY KEY ( id ) ,
                            name varchar( 255 ) ,
                            title varchar( 255 ) ,
                            url varchar( 255 ) ,
                            position int NULL AUTO_INCREMENT
                            )

                            #1075 - Incorrect table definition; There can only be one auto column and it must be defined as a key

                            Du hast doch oben geschrieben das id primary key sein soll. Aber position muss doch auto_increment sein oder?

                            Kommentar


                            • #15
                              richtig - aber nicht primär.

                              Kommentar

                              Lädt...
                              X