Ankündigung

Einklappen
Keine Ankündigung bisher.

Denkfehler? Objektorientierte Programmierung...

Einklappen

Neue Werbung 2019

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

  • Denkfehler? Objektorientierte Programmierung...

    Hallo

    Ich zerbrech mir gerade den Kopp darüber wie man ein Onlinemagazin am besten objektorientiert gestalten kann.

    Meine Überlegungen, soweit:

    PHP-Code:
    class website {
        var 
    $title;     // Abweichender <title></title>-Inhalt
        
    var $nav_kartei// Aktive Karteikarte (Standard: "Home")
        
    var $nav_kartei_sub;    // Aktiver Menüpunkt unter der gewählten Karteikarte (Standard: Der Erste)
        
        
    function website($title,$nav_kartei,$nav_kartei_sub) {        // Konstruktor: 
            
    $this->html_header($title);
            
    $this->kartei_nav($nav_kartei);
            
    $this->kartei_nav_sub($nav_kartei_sub);
        }
        
        function 
    html_header($title) {
            
    // hier wird der Header erzeugt (<HTML><HEAD>...)
        
    }
        
        function 
    kartei_nav($nav_kartei) {
            
    // hier wird die Karteikarten-Navi generiert
        
    }
        
        function 
    kartei_nav_sub($nav_kartei_sub){
            
    // hier wird das Untermenü der Karteikarten-Navi generiert
        
    }

    mein Plan ist: In jeder Seite erzeuge ich ein Objekt namens website und weise dem Objekt dann Eigenschaften zu, wie z.B. den Header, dem Navi-Menü, dem Untermenü des Navi-Menüs etc.
    Die Klasse website soll quasi den Bauplan darstellen, nach dem eine Seite des Onlinemagazins gestaltet werden soll.

    Aber irgendwie leuchtet es mir noch nicht ganz ein, wie der Content in das Objekt gelangt, also in die Seite, und wie sich das ganze OOP-Technisch gestalten lässt.

    Vielleicht kann mir der eine oder andere OOP-Fuchs* mal behilflich sein. Wäre sehr nett. Stehe auf dem Schlauch.

    MfG
    FiredUp

    *jemand, der Ahnung von der objektorientierten Programmierung hat, und mir nicht nur Links zu Tuts schickt die ich schon kenne :wink:

  • #2
    Irgendwie versteht ich nicht genau was du meinst....

    So wähle ich die methode die die einzelne Seite erzeugt:
    PHP-Code:
    function select(){
            switch(
    $_GET['page']){
                case 
    "home":      $this -> page_home();      break;
                case 
    "links":     $this -> page_links();     break;
                case 
    "kontakt":   $this -> page_kontakt();   break;
                default:          
    $this -> page_home();      break;
            }
    //End of switch
        
    }//end of select() 
    Diese Erweiterung ist EXPERIMENTELL.
    [...]
    Seien Sie gewarnt und verwenden Sie diese Erweiterung auf eigenes Risiko..

    Kommentar


    • #3
      Es geht um die Struktur an sich. Wie gestaltet man eine Website objektorientiert, wo legt man den Content ab und wie wird er eingebunden etc.

      Finde leider keine konkreten Beispiele im Netz. Meine ersten Versuche gehen alle in die Richtung, das ich auch gleich einfach nur Funktionen und Includes nehmen kann und auf das selbe Ergebnis komme. Wollte aber gerade die objektorientierte Programmierung anwenden um das zu lernen.

      Kommentar


      • #4
        Man realisiert ein Projekt nicht mittels einer Klasse. Mehr brauch ich dazu jetzt erstmal nicht sagen.
        [b][url=http://www.benjamin-klaile.de]privater Blog[/url][/b]

        Kommentar


        • #5
          Vielen dank auch, Ben.

          Beherrscht hier niemand die OOP, oder will mir einfach nur keiner helfen? Wo klemmt es?

          Von mir aus hat das Projekt auch 20 Klassen. Mir gehts darum es mittels OOP zu realisieren. Ich versuche herauszufinden, wie ich das anpacke. Auf traditionelle Art wäre das auch gar kein Problem, nur OOP ist eine Sache für sich...

          Oder soll ich meine Frage mal bei forum.developers-guide.net stellen? Aufstrebend, kompetent und werbefrei... da kann ich eventuell bessere Antworten von dir erwarten, nehme ich an.

          Kommentar


          • #6
            Zitat von FiredUp
            1)Wie gestaltet man eine Website objektorientiert

            2) wo legt man den Content ab und wie wird er eingebunden etc.
            zu 1) das ist in etwa wie wenn du fragst, male ich Bäume mit Bleistift?
            Das ergibt keinen Sinn.

            Ich löse es so, dass ich eine HTML-Klasse habe, die ich abstrakt halte.
            Eine MyHTML-Klasse die von HTML erbt, aber ein paar projektspezifische
            Eigenarten haben kann, wie z.B. für jede Seite eine bestimmte CSS-Datei reinladen etc.

            Eine normale Seite erstelle ich dann praktisch so

            // home.php
            Code:
            <?php
            $html =& new MyHTML();
            $html->addCSS('home.css');
            print $html->head('Home');
            ?>
            hier steht mein Content
            <?php
            print $html->foot();
            ?>
            hier meine Klassen, vielleicht inspiriren sie dich ja in eine Richtung:
            class.HTML.php:
            http://nopaste.php-q.net/174080
            class.MyHTML.php:
            http://nopaste.php-q.net/174081
            head.tpl:
            http://nopaste.php-q.net/174082
            foot.tpl:
            Code:
            
            </body>
            </html>

            Kommentar


            • #7
              Hi.

              Ich bin zwar sicher kein "PHP-Fuchs", aber vielleicht kann ich dich
              dennoch ein wenig weiterbringen.

              Zunächstmal ist "website" die falsche Übersetzung für eine Webseite im
              Sinne einer einzelnen Seite. Page wäre hier eher angebracht. Dann steht
              natürlich die Frage nach den konkreten Anforderungen im Raum. Diese
              mal meiner Phantasie überlassen könnte das vielleicht so aussehen:

              Eine Seite ist bestimmt durch Inhalte, einem Layout und seinem Platz
              innerhalb der Website. Die Inhalte lassen sich in versciedene Typen
              aufteilen. Im einfachsten gibt es einen Typ "Article", der es Redakteuren
              leicht ermöglicht, einen Text mit Überschrift, Aufreißer, Absätzen, Links
              und Bildern (etc.) einzufügen. Ein zweiter Typ wäre einfach "HTML", der die
              freie Gestaltung einiger anderer Seiten durch fachkundige Hände schnell
              ermöglicht.

              Folglich wären also schonmal zwei Klassen "Article" und "HTMLPage"
              (besserer Name wäre nicht schlecht) geboren, die beide von einer Klasse
              "Page" abzuleiten wären, denn beide Seitentypen differieren ja nur in der
              Aufmachung und den Bearbeitungsroutinen des Haupt-Inhaltes - andere
              Elemene, wie das Grund-Layout, die Navigationselemente, Header und
              Methoden zum Rendern des Ganzen sind für beide Seitentypen von der
              Struktur her ja identisch.

              Nun die Navigation. Hier brauchst du im einfachsten Fall einfach eine
              Klasse, die einen Baum abbildet und die quasi die Sitemap abbildet (sei
              "Sitemap"). Die übergibst du der konkreten Page-Objektes, damit dieses
              dann daraus die Navigation erstellen kann.

              In eine Klasse "Site" wäre dann vielleicht noch sinnig. Sie liest die
              (Site-weite) Konfiguration aus, erzeugt die Sitemap und angefragte Seiten.

              Das wäre mal so in etwa das einfachste Modell ... etwas arg oberflächlich
              betrachtet...

              Basti

              Kommentar


              • #8
                Vielen herzlichen Dank, Zergling und Basti. Ihr habt mir eine Ecke weiter geholfen. Super!

                Also habe ich mal damit angefangen, eine Klasse für die Karteikarten-Navigation zu schreiben, die auch schon gut funktioniert.

                Mit einem neuen Objekt als Instanz der Klasse karteikarten_navi() wird der Anfang der HTML-Tabelle erzeugt. Also <TABLE> <TR>. Dann kann man mit der Methode karteikarte_erstellen() jeweils eine Karteikarte erstellen. Man übergibt dabei die Parameter Titel, URL und Aktiv (aktiv = 1 bedeutet, die Karteikarte ist angewählt, also im Vordergrund).
                Mit der Methode output() wird alles inkl. Ende der Tabelle durch </TR></TABLE> ausgegeben.

                Hier merke ich das erste mal, das die OOP sinn macht.

                Das mache ich nun also für alle wesentlichen dynamischen Elemente in der Website die immer wieder auftauchen, und erzeuge innerhalb der Klassen wie Page bzw. Website neue Instanzen von Objekten aus diesen Klassen wie die karteikarten_navi, und bastel so stück für stick ein vollständiges HTML-Dokument zusammen. Stimmt's soweit? :P

                @Zergling, was bedeutet das =& in

                PHP-Code:
                $html =& new MyHTML(); 
                ? habe es noch nie gebraucht... danke für die Info

                MfG
                FiredUp

                Kommentar


                • #9
                  hmm irgendwie ist das Forum k-putt. War ich das etwa?

                  Kommentar


                  • #10
                    Zitat von FiredUp
                    was bedeutet das =&
                    http://de2.php.net/manual/en/language.references.php

                    Kommentar


                    • #11
                      Das =& macht glaub garnicht mehr so viel Sinn, ist mehr ein Relikt. Es weist die Referenz/"Zeiger" des Objekt und nicht eine komplette Kopie zu.
                      Bei new macht es glaube ich keinen Sinn und bei PHP5 schon garnicht mehr.

                      Code:
                      $a = 5;
                      $b =& $a;
                      $b = 10;
                      print $a; // müsste 10 ergeben

                      Kommentar


                      • #12
                        Hallo.

                        Zitat von FiredUp
                        Also habe ich mal damit angefangen, eine Klasse für die
                        Karteikarten-Navigation zu schreiben, die auch schon gut funktioniert.

                        Mit einem neuen Objekt als Instanz der Klasse karteikarten_navi() wird
                        der Anfang der HTML-Tabelle erzeugt. Also <TABLE> <TR>. Dann kann
                        man mit der Methode karteikarte_erstellen() jeweils eine Karteikarte
                        erstellen. Man übergibt dabei die Parameter Titel, URL und Aktiv (aktiv = 1
                        bedeutet, die Karteikarte ist angewählt, also im Vordergrund).
                        Mit der Methode output() wird alles inkl. Ende der Tabelle durch
                        </TR></TABLE> ausgegeben.
                        Mach es besser so, dass du alles HTML ausschließlich in die Methode
                        karteikarten_navi:utput() packst. Die Methode ...erstellen() nimmt
                        lediglich die Daten entgegen, validiert ggf. (nur eine Karte darf aktiv sein)
                        und speichert die Daten im Objekt. In output() liest du die Daten dann aus
                        und schnipselst deine Tabelle zusammen.

                        Noch drei Anmerkungen dazu:

                        1. ist es üblich, Klassen mit großen Anfansbuchstaben zu schreiben:
                        KarteikartenNavi(). Letztlich ist nur wichtig, dass du dich auf eine
                        Schreibweise festlegst. Zur Unterscheidung gegenüber Funktonsnamen ist
                        diese Schreibweise jedoch sinnvoll.

                        2. ist es natürlich auch üblich in englischer Sprache zu programmieren.
                        Ich sitze gerade vor einer Anwendung, die einen Mix aus Englisch und
                        Deutsch benutzt und das ist irgendwie ... komisch. Musst du natürlich auch
                        selbst enscheiden. Ich denke, besser in Deutsch, als drei Minuten
                        rumsiten und nach dem passenden englischen Begriff suchen - aber
                        schräg ist es schon irgendwie.

                        3. lassen sich auch Karteikartenreiter ganz gut in HTML packen, ohne die
                        Inhalte logisch falsch auszuzeichnen. Du bietest damit letztlich eine
                        listenartige Auswahl an, keine tabellarischen Daten. Deshalb wäre eben
                        eine <ul> die richtige Wahl. Schau doch mal z.B. hier, ob du da was
                        passendes findest:

                        http://css.maxdesign.com.au/listamatic/horizontal05.htm

                        Hier merke ich das erste mal, das die OOP sinn macht.

                        Das mache ich nun also für alle wesentlichen dynamischen Elemente in
                        der Website die immer wieder auftauchen, und erzeuge innerhalb der
                        Klassen wie Page bzw. Website neue Instanzen von Objekten aus diesen
                        Klassen wie die karteikarten_navi, und bastel so stück für stick ein
                        vollständiges HTML-Dokument zusammen. Stimmt's soweit? :P
                        Das ist in jedem Fall ein Weg. Als Alterativ zu meinem obigen Vorschlag
                        ist es in dem Kontext dann sicherlich sinnvoll, wenn du z.B. die Klasse
                        Article nicht von Page ableitest, sondern diese separat baust und dann
                        dem Page-Objekt als Wert übergibst. Das könnte dann, statisch
                        programmiert so aussehen:
                        PHP-Code:
                        <?php
                        $Site 
                        = new Site();
                        $Sitemap $Site->getSitemap();

                        // Aus der Anfrage zu entnehmen:
                        $sCurrPage 'article003';
                        $sCmd 'edit';

                        if (!
                        $Sitemap->pageExists($sCurrPage)) {
                            
                        $sCurrPage 'error404';
                            if (!
                        $Sitemap->pageExists($sCurrPage)) die('Fatal...');
                        }

                        // Jede Seite ist von enem bestimmten Typ; erzeugt und
                        // verwaltet durch ein entsprechendes Modul (z.B. Article)
                        // Die Sitemap kennt die Typen/Module der Seiten
                        $sModule $Sitemap->getModule($sCurrPage);

                        // Eine Modul-Fabrik erzeugt das entsprechende Modul, also
                        // z.B. eine Instanz von Article
                        $Module ModuleFactory::getModule($sModule);

                        // die angefragte Seite wird dem Modul übergeben, damit
                        // es weiß, worauf es sich beziehen muss; Ebenso der
                        // übergebene Befehl. Daraus kann das Modul dann
                        // auswählen, welche Ansicht (View) der Benutzer zu sehen
                        // bekommen soll (Artikel anzeigen, Artikel bearbeiten, 
                        // Löschen bestätigen, Fehler etc.) und die benötigten Daten
                        // für die Anzeige zusammentragen
                        $Module->setPage($sCurrPage);
                        $Module->setCmd($sCmd);

                        // Die Navigation wird aus der Struktur der Site und der ID
                        // der aktuellen Seite gebildet. Sie könnte dann verschiedene
                        // Methoden bereithalten, z.B. ein Hauptmenü, ein Breadcrumbs-
                        // Menü, ein Untermenü etc. zu erzeugen bzw. besser die Daten 
                        // für eine Ausabe im Template vorzubereien.
                        $Navigation = new Navigation($Sitemap$sCurrPage);

                        // Jetzt die Seite, in die die verschiedenen Elemente eingeladen
                        // werden und die am Ende aus Templates und Inhalten
                        // zusammengestelt und ausgespuckt wird:
                        $Page = new Page();
                        $Page->setModule($Module);
                        $Page->setNavigation($Navigation);
                        $Page->setThieme('default');
                        $Page->render();
                        ?>
                        @Zergling, was bedeutet das =& in

                        PHP-Code:
                        $html =& new MyHTML(); 
                        ? habe es noch nie gebraucht...
                        In PHP5 werden implizit Referenen zurükgegeben. Das Kaufmanns-Und
                        ist also ab da unnöig (in diesem Kontext). Solltest dir eh mal die
                        Synthax der PHP5-OOP anschauen:

                        http://php.net/manual/en/language.oop5.php

                        Viel Erfolg.
                        Basti

                        Kommentar


                        • #13
                          Erstmal vielen herzlichen Dank für die ausführlichen Infos. Mit dem Deutsch / Englisch habe ich immer so meine Probleme. Nehme zwar bevorzugt englisch, aber nur wenn mir das passende Wort gerade auf der Zunge liegt.

                          Zur OOP nochmal...
                          ich habe nun noch eine Menü-Box in OOP umgewandelt, die sich links oder rechts im Content befinden kann. Die Box hat abgerundete Ecken (grafisch mit Backgrounds) und besteht im Wesentlichen aus DIV-Containern und einer Tabelle. Neben Link-Elementen können auch Suchformulare enthalten sein, z.B. um einen aktuellen Artikel der über mehrere Seiten geht gezielt zu durchsuchen.

                          Hier der Code (getestet, funktionockelt...)

                          Code:
                          class NavBox {
                          	var $content; 		// Zwischenspeicher
                          	var $start_navbox; 	// Kopf
                          	var $end_navbox; 	// Fuss
                          	var $titel; 			// Titel
                          	
                          	function navbox() { // Konstruktor, erzeugt gleich Kopf + Fuss
                          		$this->start_navbox = "<div class=\"module\"><div><div><div>\n";
                          		$this->end_navbox = "</div></div></div></div>\n";
                          	}
                          
                          	function set_title($titel) {
                          		$this->titel = "<h3>".$titel."</h3>";
                          	}
                          	
                          	function mk_link($titel,$url,$target_blank){
                          		if($target_blank and $target_blank != 0){
                          			$target_blank = "target=\"_blank\" ";
                          		} else {
                          			unset($target_blank);
                          		}
                          		$this->content .= "<tr align=\"left\"><td><a href=\"".$url."\" ".$target_blank."class=\"mainlevel\">".$titel."</a></td></tr>";
                          	}
                          	
                          	function start_link_block(){
                          		$this->content .= "<table width=\"100%\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\">";
                          	}
                          	
                          	function end_link_block(){
                          		$this->content .= "</table>";
                          	}
                          	
                          	function mk_searchform($action,$vorbelegung){
                          		$this->content .= "<form action=\"".$action."\" method=\"post\" style=\"display:inline; nowrap\">\n";
                          		$this->content .= "<div align=\"left\" class=\"search\" style=\"padding-top:0px\">\n";
                          		$this->content .= "<input class=\"inputbox\" type=\"text\" name=\"suche\" size=\"20\" value=\"".$vorbelegung."\" onblur=\"if(this.value=='') this.value='".$vorbelegung."';\" onfocus=\"if(this.value=='".$vorbelegung."') this.value='';\" />\n";
                          		$this->content .= "</div><input type=\"hidden\" name=\"option\" value=\"search\" /></form>\n";
                          	}
                          	
                          	function output(){
                          		echo $this->start_navbox.$this->titel.$this->content.$this->end_navbox;
                          	}
                          }
                          und NavBox gross geschrieben, wie vorgeschlagen :P

                          die Einbindung bzw. gestaltung einer NavBox würde dann so aussehen:

                          Code:
                          $navbox = new NavBox();
                          $navbox->mk_searchform("suche.php","Suche...");
                          $navbox->start_link_block();
                          $navbox->mk_link("Guckste", "http://www.google.de", 1);
                          $navbox->mk_link("Infos", "http://www.phpfriend.de", 0);
                          $navbox->mk_link("Witzig", "http://www.autsch.de", 0);
                          $navbox->end_link_block();
                          $navbox->mk_searchform("archiv.php","Suche im Archiv...");
                          $navbox->start_link_block();
                          $navbox->mk_link("Archiv", "http://www.google.de", 1);
                          $navbox->end_link_block();
                          $navbox->set_title("Weitere Optionen");
                          $navbox->output();
                          klappt wunderbar soweit. Was mir hierbei noch nicht gefällt ist, das ich manuell den Start der Link-Tabelle innerhalb der NavBox mit start_link_block() initialisieren muss und mit end_link_block() beenden muss. Wie könnte man das automatisieren, also das die Klasse bzw. der Konstruktor selbst erkennt wenn der erste Link kommt bzw. der letzte?

                          Denn das Suchformular wird z.B. ausserhalb der Tabelle platziert, da die Tabelle mit einem CSS belegt ist welches automatisch Trennlinien rein fummelt.

                          Als nächstes feile ich nochmal an der Karteikarten-Klasse, mit den neuen Erkenntnissen

                          MfG
                          FiredUp

                          p.s. php-code markierung hat nicht geklappt, das board hatte probs damit. also habe ich die code-markierung genommen. sorry wenn's dadurch unübersichtlicher ist...

                          Kommentar


                          • #14
                            ...auch hier:

                            HTML nur in die output()-Funktion. Damit hast du natürlich dann das Problem der Reihenfolge: Kommt zuerst die Suchbox oder zuerst die Links und, wichtiger, wer entscheidet das? Das NavBox-Objekt selbst, die Objekte, die NavBox ansteuern? Legt der Designer das in einem Template fest oder der Admin über einen Konfigurationsparameter?

                            Basti

                            Kommentar


                            • #15
                              Die Reihenfolge soll man selbst wählen können. Hängt davon ab, wie man die Befehle im Quelltext platziert. Der Content wird dann Stück für Stück gefüllt. Wäre schon wichtig das man die Reihenfolge auf diese Weise definieren kann. Mir ist nicht ganz klar, wie man das anstellt, wenn alle HTML-Codes in der output()-Funktion auftauchen... ?

                              Kommentar

                              Lädt...
                              X