wie macht mans am besten?

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

  • #16
    hi,

    ich bin bei der Suche auf diesen Thread gestossen, und da ich gerade eine ähnliche Baumstruktur benötige, wollte ich fragen ob jemand so freundlich wäre und die Tabellen Struktur posten könnte.

    Wäre echt nett...

    mfg

    Spea

    Kommentar


    • #17
      Re: wie macht mans am besten?

      Original geschrieben von TBT
      derzeitige Tabellen:

      menu
      ========
      menu_id ( Menupunkt )
      parent_id ( übergeordneter Menupunkt, oder 0 wenn ganz oben )
      level ( Baumtiefe )
      sort ( Sortierung bei nebeneinander liegenden Menupunkten )

      menu_menu
      =========
      menu_id ( Menupunkt )
      child_id ( alle untergeordneten Menupunkte )
      diese?
      Ich denke, also bin ich. - Einige sind trotzdem...

      Kommentar


      • #18
        fehlt da nicht noch was?
        oder sehe ich das falsche?

        |
        |
        |
        \/
        PHP-Code:
        $result $query->select('SELECT m2.menu_id, m2.level, m2.sort, m2.parent_id, 
                                if(isnull(mu.user_right),0,mu.user_right) + 
                                sum(mu2.user_right) my_user_right, d.text
                            FROM  menus m 
                            LEFT JOIN menus_has_menus mm 
                                ON  ( m.menu_id = mm.child_id ) 
                            LEFT JOIN menus m2 
                                ON ( mm.menu_id = m2.parent_id )
                            LEFT JOIN menus_has_user mu
                                ON ( m2.menu_id = mu.menu_id AND mu.user_id = 1)
                            LEFT JOIN menus_has_menus mm2
                                ON ( m2.menu_id = mm2.child_id )
                            LEFT JOIN menus_has_user mu2
                                ON ( mm2.menu_id = mu2.menu_id AND mu2.user_id = 1)
                            LEFT JOIN datas d 
                                ON ( m2.data_id = d.data_id ) 
                            WHERE m.menu_id = '
        .$site.' or m.parent_id = '.$site.
                            GROUP BY m2.menu_id, m2.parent_id, m2.level, m2.sort 
                            ORDER BY m2.parent_id, m2.level, m2.sort'
        ); 

        Kommentar


        • #19
          was hat das mit der tabellenstruktur zu tun?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #20
            die beiden tabellen menus_has_user und datas sind für seine benutzerverwaltung und haben ncihts mit dem menü zu tun.

            die kannst du auch aus der query entfernen.
            INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


            Kommentar


            • #21
              ok, mal sehen ob ich es hinbekomme

              danke nochmals

              Kommentar


              • #22
                Könnte mir mal Jemand sagen wie die menus_has_users aussehen müsste um den ersten Knoten anzuzeigen ?

                Wenn die Table leer ist => komplette NULL Zeile...
                Wenn die menu_id gesetzt ist und das user_rights Spalte 0,-1,1,2,3,4 ist selbiges......

                Mit anderen Worten bis auf die Nested Sets Modell Table menu in Verbindung mit der menus_has_menus Table erhalte ich die geforderte Ausgabe......

                Für ein exemplarisches Durchspielen mit menu_has_user wäre ich sehr dankbar....

                bin nämlich im moment etwas verwirrt
                [color=blue]MfG Payne_of_Death[/color]

                [color=red]Manual(s):[/color] <-| PHP | MySQL | SELFHTML |->
                [color=red]Merke:[/color]
                [color=blue]Du brauchst das Rad nicht neu erfinden ! [/color]<-ForumSuche rettet Leben-> || <-Schau in den Codeschnippsels->

                Murphy`s Importanst LAWS
                Jede Lösung bringt nur neue Probleme
                Das Fluchen ist die einzige Sprache, die jeder Programmierer beherrscht.
                In jedem kleinen Problem steckt ein großes, das gern raus moechte.

                Kommentar


                • #23
                  Re: wie macht mans am besten?

                  Original geschrieben von TBT


                  derzeitige Tabellen:

                  menu
                  ========
                  menu_id ( Menupunkt )
                  parent_id ( übergeordneter Menupunkt, oder 0 wenn ganz oben )
                  level ( Baumtiefe )
                  sort ( Sortierung bei nebeneinander liegenden Menupunkten )

                  menu_menu
                  =========
                  menu_id ( Menupunkt )
                  child_id ( alle untergeordneten Menupunkte )
                  wäre es nicht besser so:

                  menu
                  --------------
                  menu_id
                  parent_id (menu_id als FK)
                  sort


                  Und das ganze dann rekursiv lesen. Parent_id ist null wenn es die
                  allererste generation ist. Ansonsten über den parent_id findest du
                  schon raus welches level es ist. Das braucht man nicht mehr extra
                  speichern.

                  Zur Rekursion gibt es hier was:
                  http://www.phun-x.com/index.php?pid=9&lang=de

                  Was die Rechte angeht, habe ich mal gelesen, dass dafür die beste
                  Lösung eine Bitweise Berechnung ist. Denn es spart dann ständiege
                  Erweiterungen bei der Datenbank. Wie es aber im einzeln
                  funktioniert kann ich leider nicht sagen. Vielleicht findet man was
                  beim Google.
                  Xdevel

                  Kommentar


                  • #24
                    natürlich, Rekursion das Zauberwort!

                    Rekursion ist schön und gut, doch sollte man genau abschätzen wann es was bringt
                    und wann nicht. Was passiert wohl bei 20 Ebenen? 20 Anfragen an die Datenbank? Das ist ja wohl nicht sind der Sache.
                    Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
                    kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
                    Das Verschieben der Knoten ist einfacher als beim Nested Set, und beim Einfügen braucht man auch keinerlei Update Anweisungen.
                    Probiere es einfach aus, oder lass es sein.
                    TBT

                    Die zwei wichtigsten Regeln für eine berufliche Karriere:
                    1. Verrate niemals alles was du weißt!


                    PHP 2 AllPatrizier II Browsergame

                    Kommentar


                    • #25
                      Original geschrieben von TBT
                      natürlich, Rekursion das Zauberwort!

                      Rekursion ist schön und gut, doch sollte man genau abschätzen wann es was bringt
                      und wann nicht. Was passiert wohl bei 20 Ebenen? 20 Anfragen an die Datenbank? Das ist ja wohl nicht sind der Sache.
                      Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
                      kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
                      Das Verschieben der Knoten ist einfacher als beim Nested Set, und beim Einfügen braucht man auch keinerlei Update Anweisungen.
                      Probiere es einfach aus, oder lass es sein.
                      Klar, mit Sicherheit. Ales ist die Frage des Stills, einer macht so und der andere so.

                      Aber was die Übersichtlichkeit betrifft, ist die Rekursion besser.
                      Was die Performance angeht - komm wenn die Sache richtig programmiert ist gibt es keine Probleme. Ich hatte bei einem Projekt über 10 Tausen Einträge mit bis zum Level 10 und es dauerte vielleicht mal 2 Sekunden bis der Baum im Browser angezeigt wurde.
                      Xdevel

                      Kommentar


                      • #26
                        Stehe vor dem gleichen Problem (denke ich).

                        Wenn ich TBT richtig verstanden habe, brauchte er die komplette Baumstruktur.
                        Ich brauch jedoch immer nur den übergeordneten Ordner.
                        Derzeit setze ich bei einer Tiefe von 14 Ebenen insgesamt 45 Queries ab in 0,88ms wobei 26 Queries für die Prüfung der Rechte und das auslesen des übergeordneten Ordners draufgehen, nicht sehr toll also.

                        Meine Tabellenstruktur ist so:
                        content
                        c_id (Menpunkt)
                        c_parentid (übergeordneter Menüpunkt, bei 0 oberste Ebene)
                        ....

                        modules
                        module (Name des Modules)
                        module_table_name (Tabellenname, in dem Falle "content")
                        module_primary_key (Primärschlüssel, in dem Falle "c_id")
                        module_secondary_key (Sekundärschlüssel, in dem Falle "c_parentid")
                        module_title_column (in dem Fall "titel", nicht weiter wichtig)
                        no_table (auch nicht weiter wichtig)
                        recursive_permission_check (sagt aus, dass die Rechteverwaltung Rekursiv prüfen soll)
                        administrator (1=Gruppe muss vom Typ Administrator sein)
                        backend (1=Gruppe muss vom Typ Backend sein)
                        frontend (1=Gruppe muss vom Typ Frontend sein)

                        permissions
                        module (Name des Modules)
                        administrator
                        backend
                        frontend
                        id (in dem Falle die ID der Spalte "c_id" aus "content")
                        group_id
                        read
                        edit
                        create
                        delete

                        Meine Prüfung
                        PHP-Code:
                        $result_module_preferences $this->_db->query("SELECT `module_table_name`, 
                                                            `module_primary_key`, 
                                                            `module_secondary_key`, 
                                                            `recursive_permission_check`
                                                            FROM {prefix}modules WHERE `module`='"
                        .$this->_db->escape($module)."'");
                        $row_module_preferences $this->_db->fetch_assoc($result_module_preferences);

                        if (
                        $row_module_preferences['recursive_permission_check'] == 1) {
                            
                        $finish false;
                            while (
                        $finish != true) {
                                
                        $result_parentid $this->_db->query("SELECT 
                                    `"
                        .$this->_db->escape($row_module_preferences['module_secondary_key'])."`
                                    FROM {prefix}"
                        .$this->_db->escape($row_module_preferences['module_table_name'])."
                                    WHERE 
                                    `"
                        .$this->_db->escape($row_module_preferences['module_primary_key'])."`='".$this->_db->escape($id)."'");
                                
                        $row_parentid $this->_db->fetch_assoc($result_parentid);
                            
                                
                        $result_permission $this->_db->query("SELECT `".$this->_db->escape($access_type)."`, 
                                                                        `administrator`, 
                                                                        `backend`, 
                                                                        `frontend` 
                                                                        FROM {prefix}permissions
                                                                           WHERE module='"
                        .$this->_db->escape($module)."'
                                                                        AND id='"
                        .$this->_db->escape($id)."'
                                                                        AND group_id='"
                        .$this->_db->escape($group_id)."'");
                                
                        $row_permission $this->_db->fetch_assoc($result_permission);
                            
                                if (
                        $row_permission[$access_type]) {
                                    
                        $id $row_parentid[$row_module_preferences['module_secondary_key']];
                                    if (
                        $row_parentid[$row_module_preferences['module_secondary_key']] == 0) {
                                        
                        $finish true;
                                    }
                                } else {
                                    
                        $finish true;
                                }
                            }

                        Wie muss ich das nun umformen, oder geht das mit dieser Struktur überhaupt nicht?
                        Sunshine CMS
                        BannerAdManagement
                        Borlabs - because we make IT easier
                        Formulargenerator [color=red]Neu![/color]
                        Herkunftsstatistik [color=red]Neu![/color]

                        Kommentar


                        • #27
                          du willst also diese Brotkrümel haben?
                          Das ist mit 1 SQL Anweisung zu erschlagen

                          SELECT c.name_c
                          FROM menu_menu b
                          INNER JOIN menu c
                          ON ( b.parent_i = c.menuid_i )
                          WHERE b.child_i = \''.$_point.'\'
                          GROUP BY c.name_c
                          ORDER BY c.level_i ASC
                          TBT

                          Die zwei wichtigsten Regeln für eine berufliche Karriere:
                          1. Verrate niemals alles was du weißt!


                          PHP 2 AllPatrizier II Browsergame

                          Kommentar


                          • #28
                            Original geschrieben von TBT
                            du willst also diese Brotkrümel haben?
                            auch, aber es geht mir insbesondere um die Abfrage der Rechte aus der Tabelle permission.

                            Und ich habe nicht wie du eine Tabelle menu und menu_menu sondern NUR die Tabelle content. Deswegen auch die Frage: geht das überhaupt mit der Struktur?
                            Sunshine CMS
                            BannerAdManagement
                            Borlabs - because we make IT easier
                            Formulargenerator [color=red]Neu![/color]
                            Herkunftsstatistik [color=red]Neu![/color]

                            Kommentar


                            • #29
                              Original geschrieben von TBT
                              Bei der von mir beschriebenen, und inzwischen als Klasse implementierte Methode
                              kannst man bei jeder beliebigen Baumtiefe alle Daten mit nur einer SQL Anweisung ermitteln.
                              Frage, braucht es bei zB 20 Ebenen ein 20faches join, oder geht deine Methode immer mit
                              den beschriebenen etwa 2 joins? Ich blicke noch nicht soweit durch.
                              Danke trotzdem.

                              Kommentar


                              • #30
                                du brauchst immer nur eine SQL mit 2 Joins dafür
                                TBT

                                Die zwei wichtigsten Regeln für eine berufliche Karriere:
                                1. Verrate niemals alles was du weißt!


                                PHP 2 AllPatrizier II Browsergame

                                Kommentar

                                Lädt...
                                X