Ankündigung

Einklappen
Keine Ankündigung bisher.

Ablegung von Controllern mit Methoden in DB

Einklappen

Neue Werbung 2019

Einklappen
Dieses Thema ist geschlossen.
X
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Ablegung von Controllern mit Methoden in DB

    Hi,

    ich habe ein kleines MVC-Framework entwickelt (Nein, ich möchte KEIN fertiges Framework verwenden, sondern mein eigenes. hat seine Gründe ).

    Es gibt verschiedene Controller mit Aktionen.

    Ich möchte jetzt ein Menü erstellen, da so aufgebaut sein soll:

    Hauptmenü
    Es gibt ein Hauptmenü, über das ich auf andere Seiten wechseln kann (Ein Controller stellt dabei eine Seite dar, Standartaktion ist Index_Action())
    Nennen wir das mal Ebene 1.

    Untermenü
    Auf manchen Seiten gibt es ein Untermenü (Wichtig ist, dass das optional bleibt). In diesem Untermenü gibt es Einträge, die bei jeder Aktion des Controllers im Menü angezeigt werden (Ebene 2 sozusagen).
    Dann gibt es Einträge, die nur bei bestimmten Aktionen angezeigt werden, z.B. bei Controller_Index::Linkpartner_Action().
    Das ist dann Ebene 3

    Das Problem ist jetzt: Wie speichere ich das in der Datenbank ab, so dass ich anhand der URL (Die URL erhält den Namen des Controllers und den Namen der Action) rausfinden kann, welche Einträge ich anzeigen lassen muss?

    Bisher habe ich das ohne Datenbank gelöst, über eine Registry.
    PHP-Code:
    class ViewHelper_Menu implements FW_View_Helper_Interface
    {
      private 
    $registry;
      const 
    REGISTRY_KEY "__SUBMENU_REGISTRY_KEY__ENTRIES_MEN"
      
      public function 
    run(array $params = array())
      {
        
    $this->registry FW_Registry::getInstance(self::REGISTRY_KEY);
        return 
    $this;
      }
      
      public function 
    add($name$url$title ""$external false)
      {
        
    $entries $this->registry->entries;
        
    $entries[] = array(
                              
    "name" => $name,
                              
    "link" => $url,
                              
    "title" => ($title == "") ? $name $title,
                              
    "external" => $external
                          
    );
        
    $this->registry->entries $entries;
        return 
    $this;
        
      }
      
      public function 
    getEntries()
      {
        return 
    $this->registry->entries;
      }

    Man kann hier in allen Controllern Einträge zur Registry hinzufügen und sie auch überall wieder auslesen.

    In meinem Controller habe ich dann z.B. sowas:

    PHP-Code:
    class Controller_Index extends FW_Controller_Abstract
    {
      public function 
    init()
      { 
         
    $this->FW_View_Helper_Path()->add("Startseite"$this->ViewHelper_URL("index""index"));
         
         
    //Diese EInträge sind auf allen Unterseiten des Controllers zu sehen
         
    $this->ViewHelper_Menu()->add("Überall zu sehen""google.de""titel");
         
    $this->ViewHelper_Menu()->add("auch Überall zu sehen""google.de""titel");
      }
      
      public function 
    index_Action()
      { 
         
    $this->FW_View_Helper_Title()->set("Startseite");                  
         
    $this->view->addTemplateContent("content"null"index.tpl.php");
         
    $this->ViewHelper_Menu()->add("nur in index_Action zu sehen""google.de""titel");
      }
      
      public function 
    unterseite_Action()
      { 
         
    $this->FW_View_Helper_Title()->set("Unterseite");                  
         
    $this->view->addTemplateContent("content"null"index.tpl.php");
         
    $this->ViewHelper_Menu()->add("nur auf Unterseite zu sehen""google.de""titel");
      }

    Ich habe mir jetzt überlegt, dass ich ein DB-Design anlege, das so aussieht
    menu (id, name, parent_id, url, external, title)
    action (id, controller_id, name)
    controller (id, name)

    Aber es ist mir auch nach reichlichen Überlegungen nicht gelungen, wie ich das jetzt richtig auslesen soll. Hat jemand eine Idee?

    MfG fat32

  • #2
    Hat das noch nie jemand gemacht?

    Meint ihr, ich brauche unbedingt Nested Sets dazu?

    Kommentar


    • #3
      Entweder versteh ich dein Problem nicht, oder hä? Du willst einfach einen Art Kategorie/Navigationsbaum in der Datenbank speichern und wissen in welchen Zweig du bist damit du die Kindknoten auslesen kannst, oder?

      Dazu reicht: "menu (id, name, parent_id, url, external, title)" wenn eine URL aufgerufen wird suchst du einfach nach dieser URL in der Datenbank hollst die zugehörige ID und suchst damit die Kinder. Die einzige Anforderung dazu ist das die URL Unique ist.

      Kommentar


      • #4
        Ganz einfach:
        Speichere die Daten als Parent-ID-Struktur, halte dir ein SessionSingleton-Model, in dem die geöffneten Menü-Knoten gespeichert sind und lese dieses zum Baum darstellen wieder aus.

        Die Trennung in Menü und Untermenü ist nicht sinnvoll, da die Typen, die du hier behandelst nicht wirklich unterscheiden (sind alles Navi-Knoten).

        Hat das noch nie jemand gemacht?
        Doch, Google liefert hierzu einige gute Ergebnisse.

        Kommentar


        • #5
          Nach was soll ich googeln? Nach verschachtelten Menüs? Das hab ich schon x-mal gemacht, aber ich bin anscheinend zu blöd dazu...

          Was ist denn ein SessionSingleton-Model?
          Ich hab keine wirkliche Info darüber bei Google gefunden.

          Du willst einfach einen Art Kategorie/Navigationsbaum in der Datenbank speichern und wissen in welchen Zweig du bist damit du die Kindknoten auslesen kannst, oder? Dazu reicht: "menu (id, name, parent_id, url, external, title)" wenn eine URL aufgerufen wird suchst du einfach nach dieser URL in der Datenbank hollst die zugehörige ID und suchst damit die Kinder. Die einzige Anforderung dazu ist das die URL Unique ist.
          Genau das will ich!

          Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?

          Kommentar


          • #6
            Zitat von fat32 Beitrag anzeigen
            Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?
            Dann speichere es so ab:
            menu (id, name, parent_id, controller, action)

            und beim auslesen suchst du nach controller und action.

            Kommentar


            • #7
              Hi,

              Zitat von fat32 Beitrag anzeigen
              Was ist denn ein SessionSingleton-Model?
              Vielleicht doch noch nicht der richtige Zeitpunkt um ein Framework zu entwickeln...

              Zitat von fat32 Beitrag anzeigen
              Aber bei mir ist es so, dass ich die URL nicht direkt ablegen möchte, sondern nur den Namen des Controllers und den Namen der Action. Und hier ist dann auch das Problem: Wie?
              Beides ist von der Vorgehensweise schlecht, denn ein Baum-Knoten sollte nichts von seiner Repräsentation kennen. Wenn du schon MVC anwenden möchtest, solltest du die interne Repräsentation des Baumes in der Datenbank von der in der Business-Schicht und diese wiederum von der Präsentation trennen. Das Handling der Struktur (Aufklappen/Zuklappen) sollte in der Präsentation und der Business-Logik verpackt sein. Damit solltest du den Controller und die Action auch nur in der Präsentation - beim Generieren des Links - kennen und hinzufügen. Andernfalls läufst du Gefahr, den Mechanismus zum Handling eines Menü-Baums nicht wiederverwenden zu können.

              In 3-tier-architecture (3TA) + MVC + FrontController (FC) (MVC ist nur ein Spezialisierungspattern der 3TA) würde das so aussehen:

              • Controller bezieht interne Repräsentation aus Business-Schicht und stellt diesen dar.
              • Der generierte Link enthält eine FC-Anweisung, die die zugehörige FC-Action anweist, das Model mit den geöffneten Knoten zu füllen.
              • Nach dem Öffnen kann die Business-Schicht diese Information nutzen um den "richtigen" Baum zu laden, sprich diejenigen Knoten, dich auch dargestellt werden sollen.
              • Um die Datenbank-Repräsentation nochmals zu abstrahieren solltest du noch ein eigenen Datentyp (Klasse) für einen Baum-Knoten einführen.

              Kommentar


              • #8
                Hallo fat32,

                können wir noch behilflich sein oder hast du das Problem mit den o.g. Hinweisen gelöst?

                Kommentar


                • #9
                  Hi,

                  ich hatte bisher keine Zeit mehr dazu.
                  Wenn ich ehrlich bin, ist dein Beitrag auch extrem kompliziert geschrieben. Selbst ein bekannter IT-Student wusste nicht, was du damit sagen möchtest.

                  Aber ich versuche nochmal, den Beitrag zu verstehen

                  Simon

                  Kommentar


                  • #10
                    Einfach konkrete Fragen stellen, es findet sich schon ein Übersetzer für normalsterbliche

                    Kommentar


                    • #11
                      @fat32: Ich kann mich phpdummi nur anschließen. Wenn du etwas nicht verstehst, dann stell konkrete Fragen.

                      Selbst ein bekannter IT-Student wusste nicht, was du damit sagen möchtest.
                      Das wundert mich überhaupt nicht. Die genannten Themen lernt man ja auch nicht während des Studiums. Dafür gibt es keine Vorlesungen.

                      Kommentar


                      • #12
                        Also hauptsächlich stelle ich mir die Frage, was denn die Session mit dem ganzen zu tun hat.

                        Dann stelle ich mir die Frage, wie ich die Links abspeichern soll, ohne die URL direkt abzulegen oder den Controllernamen und den Aktionsnamen.

                        Das wären jetzt erstmal die 2 wichtigsten Fragen...

                        Simon

                        Kommentar


                        • #13
                          was denn die Session mit dem ganzen zu tun hat.
                          Antwort:
                          Dann stelle ich mir die Frage, wie ich die Links abspeichern soll, ohne die URL direkt abzulegen
                          Doc hat schon Recht,
                          Vielleicht doch noch nicht der richtige Zeitpunkt um ein Framework zu entwickeln...

                          Kommentar


                          • #14
                            Hi,

                            Also hauptsächlich stelle ich mir die Frage, was denn die Session mit dem ganzen zu tun hat.
                            Du musst doch an einem über den Besuch persistenten Ort abspeichern, welcher Baum-Knoten geöffnet ist, oder nicht? Tust du das nicht, müsstest du diese Information in der URL mitschleppen, was nicht besonders hübsch aussieht. Daher meine Überlegung mit dem Model - das über die Session Bestand hat (SessionSingleton) - einen Ort zu schaffen, ab dem die aufgeklappten Knoten gespeichert sind. Diese kannst du dann beim Auslesen des Baumes nutzen um diejenigen Knoten, die geöffnet sind auch zu öffnen - sprich die Kinder zu lesen.

                            Dann stelle ich mir die Frage, wie ich die Links abspeichern soll, ohne die URL direkt abzulegen oder den Controllernamen und den Aktionsnamen.
                            Du sollst die Links eben nicht speichern. Die einzige Info die du mit der Baumstruktur speicherst ist die ID des Knotens. Diesen inkludierst du in den Link, den du bei der Generierung der Ausgabe zusammensetzt und damit hast du alles. Dort kennst du auch Controller und Action (wobei ich mich frage, wozu du beides brauchst?) und kannst den Link ohne Abhängigkeiten zur Datenhaltung generieren.

                            Soweit klar?

                            Viele Grüße,
                            Dr.E.

                            Kommentar


                            • #15
                              Zitat von fat32 Beitrag anzeigen
                              Wenn ich ehrlich bin, ist dein Beitrag auch extrem kompliziert geschrieben.
                              Ja echt mal!
                              Nichts gegen die Kompetenz von dr.e., aber die Posts sind mir teilweise auch zu abstrakt, wie dieses hier:
                              Der generierte Link enthält eine FC-Anweisung, die die zugehörige FC-Action anweist, das Model mit den geöffneten Knoten zu füllen.
                              Nach dem Öffnen kann die Business-Schicht diese Information nutzen um den "richtigen" Baum zu laden, sprich diejenigen Knoten, dich auch dargestellt werden sollen.
                              Das wundert mich überhaupt nicht. Die genannten Themen lernt man ja auch nicht während des Studiums. Dafür gibt es keine Vorlesungen.
                              <Zynismus>
                              Das oben Zitierte ist theoretischer Softwaredesign-Bullshit-Bingo.
                              Viele Buzzwords, aber nichts pragmatisch Greifbares.
                              </Zynismus>

                              Während meines Studiums lernte ich auch Dozenten aus beiden Lagern kennen. Einige prügelten nur staubtrockenen Fachstoff runter (gerne übersät mit Fachbegriffen), andere garnierten die Vorlesungen mit anschaulichen, nachvollziehbaren Beispielen.

                              Aber ich werde mir gerne dr.e.'s Artikel im kommenden PHP-Journal durchlesen (wann kommt das raus?), vielleicht ist das etwas mehr mainstream-tauglich.

                              Kommentar

                              Lädt...
                              X