Ankündigung

Einklappen
Keine Ankündigung bisher.

Template Klasse

Einklappen

Neue Werbung 2019

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

  • Template Klasse

    Hallo zusammen,
    bin mir nicht sicher ob das hierhin gehört oder doch noch zu anfänger aber ich fang einfach mal an.
    Da ich aber schon seit längeren nicht mehr Programmiert hab dachte ich mir kauf ich mir erst mal nen Buch und lies das, was ich dann auch getahn hab.
    Dann sagte ich mir gut leg ich mal los, da mir nen Templatesystem wie Smarty zu groß war dachte ich schreib ich mir was eigenes.
    Nur hab ich noch nie ne Klasse in PHP geschrieben, deshalb wollte ich doch mal fragen ob ich das so ordentlich gemacht hab oder doch was ändern sollte.

    Hier meine Klasse.

    Gruß Gawin

  • #2
    Hi,
    hab mir deine Klasse mal kurz angesehen. Ich vermisse dort das, was ein Template-Engine auszeichnet:
    Aus Wiki
    Eine Template-Engine (von engl. Vorlage und Maschine) ist eine Software, die eine Datei (das Template) verarbeitet, und bestimmte Platzhalter darin mit jeweils aktuellen Inhalten füllt.
    Vom Outfit her ok, würde ich sagen. Ich bin da aber nicht so der Maßstab, hab so meinen eigenen Stil. Ich selbst vermeide Templates wo es geht. Es gibt aber genug Fälle, da machen Templates Sinn. Da ich auch für Systeme entwickle, die minimale Ressourcen verfügen, war mir so ein Templatesystem wie Smarty auch zu groß. Hab deshalb mich auch an einer Klasse versucht, die ich TinyTemplate genannt habe.

    LG jspit

    Kommentar


    • #3
      Auch ganz net mich stört nur immer das erstetzen deshalb dachte ich, nehm ich einfach kurze PHP Tags.

      Kommentar


      • #4
        PHP-Code:
         // Schaltet Warnungen für nicht existirende Variablen aus
        error_reporting(E_ALL & ~E_NOTICE); 
        das ist wie mit dem code DEFINE TRUE FALSE; //Happy debugging suckers


        1) wieso ist template statisch?
        2) wieso willste in einem tempalte ein tempalte adden über add?

        PHP-Code:
        $layout = new Template('pfad/zur/template.php');
        $layout->styles = array('pfad/zur/style.css');
        $layout->scripts = array('pfad/zur/script.js');
        $layout->title = 'Title';

        $body = new Template('pfad/zum/body.php');
        $body->name = 'John Doe'; //im body steht Hallo <?= $name ?>

        $layout->body = $body->render();

        echo $layout->render();
        wäre das nicht einfacher?

        EDIT: weil aktuell renderst du einfach alles ich kann da keine reihenfolge bestimmen, oder?
        EDIT2: da kannste wunderbar die extract funktion von PHP Vernwende um dein data Array an das template zu übergeben
        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


        • #5
          Zitat von BlackScorp Beitrag anzeigen
          PHP-Code:
           // Schaltet Warnungen für nicht existirende Variablen aus
          error_reporting(E_ALL & ~E_NOTICE); 
          das ist wie mit dem code DEFINE TRUE FALSE; //Happy debugging suckers
          Das ist noch nen überbleibsle den ich vergessen hab zu löschen, danke für die Erinnerung.

          edit: hab Warnungen doch lieber wieder ausgeschaltet falls im Design jemand ne Variable versucht zu benutzen die nicht existiert.

          Zitat von BlackScorp Beitrag anzeigen
          1) wieso ist template statisch?
          2) wieso willste in einem tempalte ein tempalte adden über add?
          Ich will ein template in einem template adden um alles was Html ist auslagern wollte, um nur die template files austauschen zu müssen für ein komplett neues layout. Aus dem grund ist $templates auch statisch um von allen templates aus zugreifen zu können ohne jedes mal neu was zuweisen zu müssen.

          Aber da haste mich zum nachdenken gebracht ich schau nochmal drüber.

          Kommentar


          • #6
            Das hier:
            PHP-Code:
                if(include($this->template_file)){ return true; }
            return 
            false
            wirft dir aber eine Warnung aus deiner Klasse, wenn include fehlschlägt.

            Kommentar


            • #7
              Zitat von jspit Beitrag anzeigen
              Das hier:
              PHP-Code:
                  if(include($this->template_file)){ return true; }
              return 
              false
              wirft dir aber eine Warnung aus deiner Klasse, wenn include fehlschlägt.
              (Ernsthafte) Frage: Wie löst man dieses Problem, so lange manche PHP-Funktionen noch solche Warnungen schmeißen? So?

              PHP-Code:
              // @ is here because include() throws a stupid warning 
              // if the template file doesn't get loaded
              return @include($this->template_file); 
              ... oder gibts da eine elegantere Lösung?

              [OFFTOPIC]
              Der FALSE-Zweig wird übrigens auch beschritten, wenn die "includete" Datei mit einem return false (oder 0, '', e.t.c.) enden sollte.
              [/OFFTOPIC]
              Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

              Kommentar


              • #8
                Wie löst man dieses Problem, so lange manche PHP-Funktionen noch solche Warnungen schmeißen? So?
                Man könnte mit files_exists und is_executable anfangen.
                [COLOR="#F5F5FF"]--[/COLOR]
                [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                [COLOR="#F5F5FF"]
                --[/COLOR]

                Kommentar


                • #9
                  Hab die include fehlermeldung jetzt so gelöst:
                  PHP-Code:
                  if(file_exists($this->template_file)){
                              include(
                  $this->template_file);
                              return 
                  true
                          }
                          echo 
                  'kann ' basename($this->template_file) . ' nicht einbinden.';
                          return 
                  false

                  Kommentar


                  • #10
                    Zitat von nikosch Beitrag anzeigen
                    Man könnte mit files_exists ... anfangen.
                    Das wäre die Methode "Look before you leap". Prinzipiell kann in einer Multitaskingumgebung aber die so untersuchte Datei verschwunden sein, wenn man anschließend include() aufruft (siehe TOCTTOU). Dagegen hilft die "It's easier to ask for forgiveness than permission"-Methode (keine Ahnung, wie das auf deutsch heißt). Die funktioniert überall, nur in PHP gibts ab und zu Probleme, weil da manche Dateisystem-Funktionen diese sinnfreien Warnungen werfen (glücklicherweise werden das in neueren Versionen schrittweise immer weniger).

                    Zitat von nikosch Beitrag anzeigen
                    ... und is_executable ...
                    Ich glaube das disqualifiziert sich von selbst, weil es einerseits nicht portabel ist, und andererseits sowieso nicht prüft, ob die Datei ausführbaren PHP-Code enthält.

                    Zitat von Gawin Beitrag anzeigen
                    Hab die include fehlermeldung jetzt so gelöst:

                    PHP-Code:
                    if(file_exists($this->template_file)){
                    // ... 
                    Include() kann auch fehlschlagen, obwohl die Datei existiert. Bspw. wegen fehlender Benutzerrechte. Wenn du schon so vorgehen willst, wäre es besser is_readable() zu benutzen. Leider liefern file_exists() und is_readable() auch true, wenn sie auf ein Verzeichnis angewendet werden. Deshalb müsstest du, um ganz sicher zu gehen auch noch is_file() abfragen.

                    Und letztendlich wird dir include() auch eine Nase drehen, wenn die Datei erfolgreich eingelesen werden konnte, aber Syntax-Fehler ("parse error" oder so ähnlich) enthält.
                    Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                    Kommentar


                    • #11
                      Zitat von fireweasel Beitrag anzeigen
                      Das wäre die Methode
                      Include() kann auch fehlschlagen, obwohl die Datei existiert. Bspw. wegen fehlender Benutzerrechte. Wenn du schon so vorgehen willst, benutze besser is_readable().

                      Und letztendlich wird dir include() auch eine Nase drehen, wenn die Datei erfolgreich eingelesen werden konnte, aber Syntax-Fehler ("parse error" oder so ähnlich) enthält.
                      Bin gerade am Bücher welzen und überleg doch Marker zu nehmen und die mit str_replace für bekannte und eregi_replace für unbekannte zu ersetzen.
                      Was meint ihr?

                      Kommentar


                      • #12
                        na dann halt is_readable
                        Die funktioniert überall, nur in PHP gibts ab und zu Probleme, weil da manche Dateisystem-Funktionen diese sinnfreien Warnungen werfen
                        Hmm, und das ist auch gut so?! Ein Warning ist der letzte Schritt vorm Fatal error. Gewöhnlich includet man Dateien ja nicht aus Jux und Dollerei, sondern weil man die Sachen braucht und der nachfolgende Programmlauf davon abhängt. Im Zweifel läuft das dann ins Logfile.
                        [COLOR="#F5F5FF"]--[/COLOR]
                        [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
                        „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                        [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
                        [COLOR="#F5F5FF"]
                        --[/COLOR]

                        Kommentar


                        • #13
                          Zitat von Gawin Beitrag anzeigen
                          Bin gerade am Bücher welzen und überleg doch Marker zu nehmen und die mit str_replace für bekannte und eregi_replace für unbekannte zu ersetzen.
                          Was meint ihr?
                          Wenn schon, dann preg_replace(). Eregi_...() ist offiziell für tot erklärt worden. Der Vorteil einer Template-Datei als PHP ist, dass du prinzipiell den Syntax-Check dem PHP-"Interpreter" überlassen kannst. Bei eigenentwickelten Template-Systemen musst du selbst dafür sorgen. Früher hatten wir dafür mal php_check_syntax(). Das gibts leider nicht mehr.

                          Zitat von nikosch Beitrag anzeigen
                          na dann halt is_readable
                          Ich habe auch gerade erst mitbekommen, dass is_readable() das gleiche Problem wie file_exists() hat, weil es auch bei Verzeichnissen anschlägt. Wenigstens hat es nicht "file" im Namen ...

                          Hmm, und das ist auch gut so?! Ein Warning ist der letzte Schritt vorm Fatal error. Gewöhnlich includet man Dateien ja nicht aus Jux und Dollerei, sondern weil man die Sachen braucht und der nachfolgende Programmlauf davon abhängt. Im Zweifel läuft das dann ins Logfile.
                          Kommt darauf an: Wenn ich meinem Script erlauben kann, Quellcode nachzuladen und zu compilieren, muss mir auch die Gelegenheit gegeben werden, auftretende Fehler abzufangen und entsprechend zu reagieren. Für den Fall, dass ich das nicht möchte, haben mir die PHP-Götter ja require_once() geschenkt ...

                          Meine Frage ging auch mehr in die Richtung allgemeine Dateifunktionen (und wo das sonst noch so auftritt). Aber ich will das nicht ausweiten: Wenn du die Lösung mit "vorher prüfen, ob etwas geht" für akzeptabler als die Verwendung von @ hältst, reicht mir das durchaus als Antwort.

                          Zurück zum Template-Basteln ...
                          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

                          Kommentar


                          • #14
                            Ich habe auch eine simple Template klasse mal eben geschrieben

                            https://gist.github.com/BlackScorp/6989268

                            verwendung

                            PHP-Code:

                            require_once 'Template.php';
                            $templatePath __DIR__.DIRECTORY_SEPARATOR.'templates'.DIRECTORY_SEPARATOR;

                            $layout = new Template($templatePath.'layout.php');
                            $home = new Template($templatePath.'home.php');
                            $navi = new Template($templatePath.'navi.php');

                            $layout->navi $navi;
                            $layout->content $home;
                            echo 
                            $layout
                            Ich wundere mich gerade, wieso nikosch hier nicht schließt ? immerhin ist es ja eine 1) Meinungsumfrage und 2) nicht fortgeschritten eher erfahren
                            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


                            • #15
                              Ich hab das Problem mit include zu testen in einer Klasse mit autoload gehabt. Auf Existenz zu testen wurde mir zu aufwendig, auch wurde die Scriptlaufzeit zu hoch. Bei Nutzung vom @ wird ja alles unterdrückt, aber grad Fatal-Error etc. sollten weiter gezeigt werden. Eine weiterere Hürde bestand im include-path, den ich benutze. Kurz und gut, so sieht angedeutet mein Workaround aus:
                              PHP-Code:
                                     :
                                  
                              $err_level error_reporting(E_ALL E_WARNING);
                                  foreach(
                              $maskAutoloadFileNames as $name) {
                                    
                              $filename preg_replace($regExstrtolower($className), $name);
                                    
                              $r = include $filename;
                                    if(
                              $r === 1) break;
                                  }
                                  
                              error_reporting($err_level); 
                              So werden nur die Warnungen für den Teilabschnitt abgeschaltet, Fehler werden weiter gemeldet.
                              Wichtig: nach der Aktion wird der Urzustand wiederhergestellt!

                              LG jspit

                              Kommentar

                              Lädt...
                              X