Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP-Code und HTML durch MVC im nachhinein trennen

Einklappen

Neue Werbung 2019

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

  • PHP-Code und HTML durch MVC im nachhinein trennen

    Hallo Leute,

    ich programmiere jetzt schon seit einigen Jahren und programmiere auch ein Browsergame. Mit dem Browsergame habe ich mit noch nicht so vielen PHP-Kenntnissen begonnen und dadurch mittlerweile schon viel Erfahrung gesammelt, man kann davon aber eben nie genug bekommen

    Bisher habe ich in jeder Datei eine global.php includet, die mir dann meine eigenen Sessions und alle anderen Klassen, die ich brauche, geladen hat. In der Datei, die aufgerufen wurde selbst, hab ich dann die Daten immer über die Klassen abrufen lassen und dann verarbeitet, wobei das Ganze ein Mischmasch aus HTML und PHP ist.
    Jetzt soll ein neues Layout ins Game eingebaut werden und ich überlege mir jetzt, wie ich den Code jetzt möglichst so umschreibe, dass ich HTML und PHP trenne und somit auch später immer wieder neue Layouts einbauen kann.

    Habe mich mal umgeguckt und bin auf MVC (Model View Controller) gekommen und dabei festgestellt, dass ich ja eigentlich schon ein Model habe (meine Klassen, die die Daten abrufen) jetzt müsste ich eben nurnoch trennen.
    Ich persönlich bin aber gegen ein Templatesystem, wie z.B. Smarty, weil ich auf den Seiten teilweise extrem viele verschiedene Daten ausgeben muss und die alle an Smarty zu übergeben wäre eine ewige Arbeit und das ganze soll ja auch noch übersichtlich bleiben.

    Was hätte ich denn noch für andere sinnvolle Möglichkeiten? Wie macht ihr das? Wie könnte man das MVC-Pattern vervollständigen, was ich ja schon teilweise habe (Antworten darauf würden mich besonderns freuen und helfen)?

    Ich hoffe ihr könnt mir helfen und ein paar Tipps geben.

    PS: Ich habe auch schon die Forensuche benutzt (mvc, template, ...) aber eben noch nicht gefunden, was dem entspricht, was jetzt meinem Fall entspricht.

  • #2
    Also, das ist ein großes Problem, wenn du keine Tempalte Engines benutzen willst, weil die sind die, meines wissens, einzigen Möglichkeiten performant und sinnvoll dein "View" von dem MVC zu reallisieren, ich bin mir recht sicher, dass andere aus diesem Forum meiner meinung sind !?

    lg
    PHP-Code:
    if ( $humans >= ) {
       
    war ();

    Kommentar


    • #3
      Naja, ein Templatesystem nicht benutzen wollen ist vielleicht übertrieben, aber ich suche eben eine Möglichkeit, die leicht verständlich, einfach, kompatibel und performant ist
      Und ich hör mir gerne noch mehr Vorschläge an.

      mfg Tobby

      Kommentar


      • #4
        Zitat von Tobby Beitrag anzeigen
        PS: Ich habe auch schon die Forensuche benutzt (mvc, template, ...) aber eben noch nicht gefunden, was dem entspricht, was jetzt meinem Fall entspricht.
        Was hast Du denn bei der Suche nach MVC eingegeben? Nur MVC?

        Zitat von Tobby Beitrag anzeigen
        Naja, ein Templatesystem nicht benutzen wollen ist vielleicht übertrieben, aber ich suche eben eine Möglichkeit, die leicht verständlich, einfach, kompatibel und performant ist
        Und ich hör mir gerne noch mehr Vorschläge an.

        mfg Tobby
        Wenn es performant sein soll mach doch einfach folgendes als Template:

        PHP-Code:
        <title><?php echo $title?></title>

        Kommentar


        • #5
          Ja, darüber hab ich mir auch schon Gedanken gemacht, aber ich wollte eben noch die Meinung anderer Leute einholen, trotzdem schonmal danke.
          Um nochmal zum MVC-Pattern zurückzukommen (habe mir schon ein Tutorial angeschaut), das mit dem FrontController, Controller, ... hab ich irgendwie nicht verstanden, deshalb hab ich ja auch hier nochmal nachgefragt.

          Kennt vielleicht jemand ein gutes Tutorial für MVC (und ein Projekt oder Framework, bei dem man das ganze anschauen kann) oder eine andere Lösungsmöglichkeit für mein Problem?

          mfg Tobby

          Kommentar


          • #6
            EDIT: sry, wollte auf ändern drücken, hab aber Zitieren erwischt

            Kommentar


            • #7
              Naja Frameworks gibts genug die das MVC wiederspiegeln. Das beste Beispiel das Template umzusetzen wurde dir ja schon bekannt gegeben, weil du so das noch mal extra parsen sparen kannst. Und auch Templateengines können difinitiv Logik nicht vom HTML trennen, nur das es da eben anders aussieht. Meiner Meinung nach ist das Beispiel von haemoglobin noch übersichtlicher als wie das zum Beispiel Smarty handelt.

              Um das MVC wirklich zu verstehen braucht es eh viel Zeit und Lernaufwand.

              DAs was du da ansprichst was du nicht richtig verstanden hast mit Front Controler und Controler, dürfte meines Wissens so ablaufen das du verschiedene Anwendungscontroler hast und diese aber zusätzlich noch durch den Frontcontroler gejagt werden für diverse Prüfungen.

              Ich denke auch wichtiger ANsatzpunkt wäre wenn du z.B. die Autoload nutzen willst dir einen Pathhelper zu schreiben und die Classennamen exakt so zu benennen wie du die php Dateinamen nennst.

              Ich weis nicht ob ich zu 100% mit meinen Aussagen richtig liege, falls nicht dann bitte korrigiert mich, denn auch ich lerne noch.

              Mfg litter
              Aus dem Dynamo Lande kommen wir. Trinken immer reichlich kühles Bier. Und dann sind wir alle voll, die Stimmung ist so toll. Aus dem Dynamo Lande kommen wir.
              [URL]http://www.lit-web.de[/URL]

              Kommentar


              • #8
                ich benutze seit langem meine eigene Engine, html file laden, dann parsen und php dort einfügen wo es bestimmt ist. if-abfragen im HTML a la coldfusion sind nicht so toll.

                HTML und PHP radikal trennen gemäss meinem motto "Code ins Skript, Design ins Template" -> preg_repleace ist hier dein freund.. die logik darf also nicht ins template. denn dort hat sie nix verloren. so bleibt die Engine schnell...

                Layoutänderungen sind so in 2 min gemacht, nicht in stunden. habe früher auch immer z.b. via perl HTML ausgegeben, oder in visual basic (verleitet sehr dazu), gui und programmierun nicht getrennt.. usw. solche Sachen sind einfach fatal.. seit damals zieh ich die trennung radikal durch. egal ob in perl, php, asp. geht bei allen. dein Code, lädt also HTML-files, parst sie und setzt dort wo dus möchtest den Wert, oder das template was du willst am Ende des skripts dann ein(!) echo $html;

                vorteil: meine templates lassen sich so mit jedem WISIGWY-editor verändern, ohne, dass da etwas kaputt geht.
                www.scriptforums.com - Foren für Skripts
                www.ragonvote.net - Kostenlose Umfragen
                www.ragonsoft.com - PHP und Android Apps (z. B. Knoten Video Guide)

                Kommentar


                • #9
                  Zitat von litterauspirna Beitrag anzeigen
                  DAs was du da ansprichst was du nicht richtig verstanden hast mit Front Controler und Controler, dürfte meines Wissens so ablaufen das du verschiedene Anwendungscontroler hast und diese aber zusätzlich noch durch den Frontcontroler gejagt werden für diverse Prüfungen.
                  Naja, ich muss mal schauen, ob ich mir das wirklich so kompliziert machen möchte

                  Zitat von litterauspirna Beitrag anzeigen
                  Ich denke auch wichtiger ANsatzpunkt wäre wenn du z.B. die Autoload nutzen willst dir einen Pathhelper zu schreiben und die Classennamen exakt so zu benennen wie du die php Dateinamen nennst.
                  Die Dateien heißen bei mir so, wie die Klassen. Ich benutze zwar nicht __autoload() aber ich habe eine eigene funktion, die mir das macht.

                  Zitat von advanced_phpler Beitrag anzeigen
                  ich benutze seit langem meine eigene Engine, html file laden, dann parsen und php dort einfügen wo es bestimmt ist. if-abfragen im HTML a la coldfusion sind nicht so toll.
                  Kannst du mir mal ein Beispiel geben, wie so ein Teil deiner HTML-File und des Parsers aussieht? Dann kann ich mir da aweng mehr darunter vorstellen und mal selbst so etwas versuchen. Schonmal danke im Vorraus.

                  Zitat von advanced_phpler Beitrag anzeigen
                  Layoutänderungen sind so in 2 min gemacht, nicht in stunden.
                  Da freu ich mich dann auch schon drauf, wenn ich alles umgebaut habe.

                  mfg Tobby

                  Kommentar


                  • #10
                    Zitat von Tobby Beitrag anzeigen
                    Kannst du mir mal ein Beispiel geben, wie so ein Teil deiner HTML-File und des Parsers aussieht? Dann kann ich mir da aweng mehr darunter vorstellen und mal selbst so etwas versuchen. Schonmal danke im Vorraus.
                    mfg Tobby
                    ok hier ein live-beispiel.... HTML-Template:
                    PHP-Code:
                    <table border="0" cellpadding="2" cellspacing="1" width="540" >
                        <
                    tr>
                          <
                    td bgcolor="#F4F4F4" width="532">
                          <
                    p align="center"><b><font face="Verdana" size="2">Identifikation Ihres 
                          Eintrages 
                          
                    (INC-E_ID)</font></b></td>
                        </
                    tr>
                        <
                    tr>
                          <
                    td valign="top">
                          <
                    p align="center">
                          <
                    font face="Verdana" size="1">Titel:<br>
                            <
                    input type="text" name="Name" size="26" value="INC-Name" maxlength=30 ><br>
                            (
                    wird nicht veröffentlicht)</font></td>
                        </
                    tr>
                      </
                    table


                    PHP-Code:
                    $html join('',file ('name.htm'));
                    $html preg_replace("/INC-E_ID/s"$e_id$html);  // e_id des neuen Eintrags


                    // Daten laden....
                    $result mysql_query("SELECT * FROM guide WHERE id='".mj($e_id)."' AND Kunde_ID='".mj($id)."' Limit 1") or die("Keine Rechte!");
                      while(
                    $row mysql_fetch_array($result))
                        {
                            
                    $html preg_replace("/INC-Name/s"$row['Name'], $html);
                        }

                    return 
                    $html
                    mj ist eine funktion von mir gegen injections. bei return $html könnte auch echo stehen. bei mir ist aber dieser part in einem grössren system integriert. darum ein return fürs include-file ähnlich einer funktion.

                    meine mini-engine ersetzt also ein mit "INC-" gekennzeichneten wert durch den echten. ich kann das aber auch mit HTML-code machen

                    z.b. anstelle eines wertes dort, wo z.b. INC-E_ID steht könnte ich ein 2. template z.b. ("tolles_menu.htm") reinsetzen usw.

                    bei rechenintensiven aufgaben empfiehlt es sich nicht immer über das ganze file zu parsen. also nicht alle templates zusammensetzen und erst am schluss die werte reinparsen, sondern part für part.
                    www.scriptforums.com - Foren für Skripts
                    www.ragonvote.net - Kostenlose Umfragen
                    www.ragonsoft.com - PHP und Android Apps (z. B. Knoten Video Guide)

                    Kommentar


                    • #11
                      Danke für das Codebeispiel!
                      Letztendlich hat es ja viele ähnlichkeiten mit Smarty, außer, dass du eben alle Werte selbst raussuchst und selbst ersetzt... dadurch verliert es aber eben leider wieder an Übersichtlichkeit (meiner Meinung nach).

                      Außerdem frage ich mich, wie du es lösen willst, wenn du z.B. eine Tabelle mit variabler Anzahl an Zeilen hast und diese befüllen möchtest.

                      Du musst verstehen, ich will meinen View so einfach aber auch so kompatibel wie möglich gestalten.

                      mfg Tobby

                      Kommentar


                      • #12
                        Zitat von Tobby Beitrag anzeigen

                        Außerdem frage ich mich, wie du es lösen willst, wenn du z.B. eine Tabelle mit variabler Anzahl an Zeilen hast und diese befüllen möchtest.
                        das kannst du machen indem du eine html datei erstellst , nur mit dem inhalt der tabelle

                        tableContent.html
                        PHP-Code:
                        <td>
                        <
                        tr>{wert}</tr>
                        <
                        tr>{wert2}</tr>
                        </
                        td
                        PHP-Code:
                        $html_template file_get_contents('tableContent.html');

                        while(
                        $row mysql_fetch_object($sql)){
                        $html .= str_replace(array('{wert}','{wert2}'),array('spalte:',$row->spalte),$html_template);
                        }
                        return 
                        $html// und diesen html part im <table>{content}</table> einfügen. also stück für stück zusammensetzen 
                        aber schau dir mal das CakePHP Framework an. dort setzen die das auch ohne Template engine um... nur bin ich noch nicht ganz dahinter gekommen, wie die das machen
                        apt-get install npm -> npm install -g bower -> bower install <package> YOLO [URL]https://www.paypal.me/BlackScorp[/URL] | Mein Youtube PHP Kanal: [url]https://www.youtube.com/c/VitalijMik[/url]

                        Kommentar


                        • #13
                          Wenn ihr in einer Template Engine keine Kontrollstrukuren verwenden möchtet, dann muss die Filterung eben vorher gemacht werden (im PHP) - ihr könnt euch die Arbeit nicht sparen, irgendwo MUSS sie getan werden.
                          Verlagert ihr die Filterung nun aus dem View in den Controller, "vermüllt" das den Controller Code.

                          Code:
                          <td>
                          <tr>{wert}</tr>
                          <tr>{wert2}</tr>
                          </td>
                          Wenn {wert} (oder {wert2}) nicht gesetzt ist, entsteht eine Leerzeile. Ohne eine Kontrollstruktur kann man dies nicht verhindern!
                          Code:
                          <td>
                          {wert}
                          {wert2}
                          </td>
                          {wert} bzw. {wert2} muss nun die Tablerows <tr> und </tr> mitführen - d.h. irgendwer muss den eigentlichen Wert mit diesen Tags anreichern. Der "Wert" ist aber dann nur noch im Kontext einer Tabelle brauchbar, will man den gleichen Wert in einer Liste haben, müsste anstatt <tr> und </tr> ein <li> </li> mitgegeben werden... also muss man den gleichen Wert für einen anderen Kontext vorbereiten - DAS ist Aufgabe des Views (und dafür wird Code benötigt)


                          Die Trennung von Controller und View heisst nicht, das im View nicht ebenfalls Code ausgeführt werden darf - es soll nur keine "business logic" im View implementiert sein (Ausgabelogik ist völlig legitim und anders auch nicht denkbar)
                          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                          Kommentar


                          • #14
                            Zitat von lstegelitz Beitrag anzeigen
                            Verlagert ihr die Filterung nun aus dem View in den Controller, "vermüllt" das den Controller Code.

                            Code:
                            <td>
                            <tr>{wert}</tr>
                            <tr>{wert2}</tr>
                            </td>
                            Wenn {wert} (oder {wert2}) nicht gesetzt ist, entsteht eine Leerzeile. Ohne eine Kontrollstruktur kann man dies nicht verhindern!
                            Das heißt du würdest z.B. eine foreach-Schleife in den View einbauen, der die Zeilen ausgibt. Das finde ich persönlich auch noch übersichtlicher, als das im Controller zu machen.

                            Die einzige Frage die mir noch bleibt wäre, ob ich das Parsen will (siehe Smarty, ebenfalls mit Kontrollstrukturen) oder includen will und die Variablen mittels
                            PHP-Code:
                            <? echo $variable; ?>
                            <table>
                            <?php foreach($array as $key => $val) {
                                echo 
                            "<tr><td>".$value."</td></tr>";
                            ?>
                            </table>
                            ausgeben möchte.

                            Was haltet ihr für sinnvoller und da ich weiß, dass ihr hier unterschiedlicher Meinung seid, wäre es nett, wenn ihr begründen würdet, weil ich kann mich momentan irgendwie noch nicht entscheiden Parsen ist wahrscheinlich kompatibler, Includen hat ne bessere Performance (und das ist bei nem Browsergame ja nicht grad unwichtig)

                            Danke für eure Antworten.
                            mfg Tobby

                            Kommentar


                            • #15
                              Im Prinzip macht beides das gleiche, es ist Geschmackssache was dir besser gefällt. Der Sinn bei Verwendung einer Template Engine ist allerdings, daß man eben nicht neuen Code schreiben will, sondern fertigen verwendet.
                              Smarty bildet eine Schicht "zwischen" PHP und HTML und bringt ein paar Spielereien mit, allerdings nichts, was man nicht in PHP selber nachbauen könnte (faktisch IST Smarty in PHP geschrieben, und lässt sich auch über Plugins erweitern, die ebenfalls in PHP geschrieben sind).

                              PHP-Code:
                              <? echo $variable; ?>
                              <table>
                              <?php foreach($array as $key => $val) {
                                  echo 
                              "<tr><td>".$value."</td></tr>";
                              ?>
                              </table>
                              vs.
                              Code:
                              {$variable}
                              <table>
                              {foreach from=$array item=value}
                                  <tr><td>{$value}</td></tr>
                              {/foreach}
                              </table>
                              Ich persönlich verwende Smarty, habe mich an die Syntax gewöhnt, ich habe einen Editor, der mir alle Smarty-Tags farblich kennzeichnet. Es ist Geschmackssache, jemand anderes wird sagen: "Ich komme besser mit PHP zurecht, dort kenne ich mich aus und kann alles machen, was PHP hergibt, auch brauch ich keine neue Syntax zu lernen"

                              Zitat von Tobby Beitrag anzeigen
                              Parsen ist wahrscheinlich kompatibler, Includen hat ne bessere Performance (und das ist bei nem Browsergame ja nicht grad unwichtig)
                              Das kann nur ein Test zeigen.. ich würde Smarty mal nicht unterschätzen, die Lib ist schon lange unterwegs und hat einiges an Optimierung erfahren, Smarty arbeitet mit einem 2-stufigen Cache, bzw. es "compiliert" ein Template in eine "Vorstufe" und macht daraus eine PHP Datei, die zur weiteren Verwendung herangezogen wird.
                              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                              Kommentar

                              Lädt...
                              X