Klassen und Templates

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

  • Klassen und Templates

    Hallo!

    Ich versuche mich jetzt doch endlich in OOP einzuarbeiten. Vieles hilft im Web, wie Tutorials auf YT oder auch schriftliches in Blogs. Foren und Büchern.
    Dennoch hab ich das eine oder andere Problem und frage dann jetzt einmal gezielt hier in einem Forum nach. Vielleicht kann mir der eine oder andere ein paar Hinweise geben?

    Um mit der OOP einigermaßen klar zu kommen, versuche ich das anhand eines kleinen CMS. So habe ich auch mit 'normalen' PHP lernen angefangen, was so ganz gut klappte. Bin aber überhaupt kein Profi, um das noch zu erwähnen.

    Was ich bisher gemacht habe ist folgendes: Ich habe eine Klasse (pages) erstellt, die mir die Inhalte von den einzelnen Seiten zusammenbaut. Später kommt das dann auch einer Datenbank.
    Diese Inhalte übergeben ich an ein Template, was mir die HTML-Seite aufbaut. Ja und das klappt eigentlich auch ganz gut bisher.
    Aber... für diverse Kontentelemente möchte ich eigene Klassen haben und dieses dann in die Pages-Klasse einbinden und entsprechend mit an das Template senden. Da habe ich schon ein erstes Problem. Zusätzlich würde ich gerne noch zu jeder eigenen Kontent-Klasse ein seperates Template erstellen, was auch nur den Inhalt dieses Kontentelementes ausgibt. Ich bekomme das zwar hin, aber leider auch mit einem Problem.

    Hier mal die pages-Klasse:
    PHP-Code:
    class Pages {

        public 
    $template;
        public 
    $header;
        public 
    $footer;
        public 
    $content;
        public 
    $navi;


        public function 
    __construct () {

            
    $this->header "HEADER";
            
    $this->footer "FOOTER";
            
    $this->template $GLOBALS['CONFIG']['TMP_FILE'];

        }

        public function 
    getTemplate () {

            (isset(
    $_GET['pageID'])) ? $pageID $_GET['pageID'] : $pageID 1;

            switch (
    $pageID) {
                case 
    1:
                    
    $hx 1;
                    
    $class "home";
                    
    $headline "Home";
                    
    $page_content 'Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                    feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                    augue. Curabitur ullamcorper ultricies nisi.'
    ;
                    break;

                case 
    2:
                    
    $hx 1;
                    
    $class "about";
                    
    $headline "About";
                    
    $page_content 'Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                    augue. Curabitur ullamcorper ultricies nisi.'
    ;
                    break;

                case 
    3:
                    
    $hx 1;
                    
    $class "contact";
                    
    $headline "Contact";
                    
    $page_content 'Porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                    feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                    augue. Curabitur ullamcorper ultricies nisi.'
    ;
                    break;
            }

            
    $content '<h' $hx ' class="' $class '">' $headline '</h' $hx '>';
            
    $content .= $page_content;

            
    $this->content $content;

            
    /**
             * Methode 1
             */
            
    $navi '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';
            
    $this->navi $navi;

            
    /**
             * Methode 2
             */
            
    $navigation = new navigation();
            
    $this->navi $navigation->getNavi($pageID);

            require_once 
    'templates/' $this->template '.php';

        }


    Wie man sieht noch ohne Datenbank, aber zum ersten testen geht das auch so.
    Ich habe hier zwei Methoden die zwar beide funktionieren, aber nur die ertse so wie es sein sollte. Der Grund ist, daß ich die Navigation hier direkt einbinde und nicht wie in der zweiten Methode über eine andere Klasse.
    Diese sieht so aus:

    PHP-Code:
    class navigation {

        public function 
    getNavi ($pageID) {

    //        require_once 'templates/tmp_navigation.php';
            
    echo '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';

        }


    zusätzlich noch das Navigations-Templates, was aber bei Methode 2 den selben Effekt hat, als wenn ich es ohne mache. Ich dachte ja erst, daß es am Template liegt, doch dem ist nicht so.

    Das Haupttemplate schaut bisher ganz einfach so aus:
    HTML-Code:
    <!DOCTYPE html>
    <html lang="de">
    
    <head>
        <title><?php echo $GLOBALS['CONFIG']['PROJECT_NAME']; ?></title>
        <meta charset="<?php echo $GLOBALS['CONFIG']['CHARSET']; ?>">
    </head>
    <body>
    
    <div style="border: 1px green solid; padding: 10px;"><?php echo $this->header; ?></div><br>
    <div style="border: 1px gold solid; padding: 10px;"><?php echo $this->navi; ?></div><br>
    <div style="border: 1px red solid; padding: 10px;"><?php echo $this->content; ?></div><br>
    <div style="border: 1px blue solid; padding: 10px;"><?php echo $this->footer; ?></div>
    
    </body>
    </html>
    Wie man erkennen kann, werden dann später auch noch der Header, der Footer und auch noch linke und rechte Spalten erstellt.

    Hier habe ich jetzt erstmal zwei Fragen dazu:
    1. Ist der komplette Ansatz schon einmal so brauchbar? Baut man so, oder so ähnlich, ein kleines CMS mit Templates auf?
    2. Wie kann ich erreichen, daß in der Pages-Klasse die zweite Methode so funktioniert, wie es sein soll. Die Navigation wird nicht da ausgegeben, wo sie im Template ausgegeben werden sollte. Sie wird nach ganz oben gesetzt, über den <head>-Bereich. Funktionieren tut sie aber.

    Ich habe zwar schon auf ein paar Seiten etwas über Vererbung gelesen, aber leider bin ich da noch nicht so richtig draus schlau geworden.

    Ich hoffe ich konnte mein Problem halbwegs gut erläutern und freue mich auf den einen oder anderen Tipp von euch!


    Danke und Gruss
    Fransisco
    Zuletzt geändert von Fransisco; 11.04.2013, 14:58.

  • #2
    ich nutze seit langem diese variante, ist definitiv nicht die beste aber liefert dir vielleicht ein paar ansätze wie man es umsetzen kann.

    template klasse
    PHP-Code:
    /**
     * Template-Engine
     */
    class template {
       var 
    $path;
       var 
    $content;

       
    /**
        * open the file if exists
        * @param String $file
        */
       
    public function __construct($file) {
           
    $this->path $file;
          if (
    file_exists($this->path)) {
             
    $file = @fopen($this->path"r");
          } else {
             die (
    $this->path." not found");
          }
          while(!
    feof($file)) {
             
    $temp fgets($file4096);
             
    $this->content .= $temp;
          }
       }

       
    /**
        * replace the placeholder with the right content
        * @param String $placeholder
        * @param Strng $value
        */
       
    function replace($placeholder$value) {
          
    $this->content str_replace("{" $placeholder "}"$value$this->content);
       }

       
    /**
        * @return the template
        */
        
    function echo_template() {
            return 
    $this->content;
        }

    aufruf der Klasse um das Template zu füllen
    PHP-Code:
    $template_design = new template('design.html');
    $template_design->replace("title",            $this->title);
    $template_design->replace("head",             $this->header);
    $template_design->replace("navi",             $this->navi);
    $template_design->replace("cont",             $this->content);
    $template_design->replace("foot",             $this->footer);
    return 
    $template_design->echo_template(); 
    design.html
    HTML-Code:
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    	<title>{title}</title>
    </head>
    <body>
    	<div id="rahmen">
    		<div id="head">{head}</div>
    		<div id="navi">{navi}</div>      
    		<div id="cont">{cont}</div>
    		<div id="foot">{foot}</div>
    	</div>
    </body>
    </html>
    Gruß
    Uzu

    private Homepage

    Kommentar


    • #3
      Zitat von UzumakiNaruto Beitrag anzeigen
      ich nutze seit langem diese variante
      Merkt man. "var" stammt noch aus PHP 4, das schon über 10 Jahre auf dem Buckel hat

      Kommentar


      • #4
        Danke erstmal, aber ich muß dich noch fragen, von wo aus du die Klasse aufrufst? Ich hab das bei mir (erstmal) in meiner index.php eingebunden, bekomme aber einen
        Code:
        [B]Fatal error[/B]:  Using $this when not in object context in
        PHP-Code:
        $template_design = new Pages("templates/html.php");
        $template_design->replace("cont"$this->content);
        return 
        $template_design->echo_template(); 
        Ich verstehe wie du das machst, aber ein require sollte es doch auch tun. Oder?
        Auch habe ich selbst die 'normalen' PHP-Tags im Template lieber, weil ich denke, später, wenn noch andere Templates gefüllt werden sollen, es mit Platzhaltern Probleme geben könnte. Ich denke da nur an eine Foreach-Schleife...

        Dennoch würde ich deinen Vorschlag genauer unter die Lupe nehmen, doch der Fehler erlaubt es noch nicht.

        $this->content kann ich ja auch nicht so von ausserhalb aufrufen, das bezieht sich ja nur direkt auf die Klasse. ...wenn ich das alles bisher so richtig verstanden habe.


        Gruss, Fransisco

        Kommentar


        • #5
          ich habe die template klasse mit einer anderen klasse aufgerufen und da war die variable $content die ich natürlich mit $this->content ansprechen musste.

          PHP-Code:
          include "template.php";

          $content "das ist mein test content";

          $template_design = new Pages("templates/html.php");
          $template_design->replace("cont"$content);
          $temp_content $template_design->echo_template(); 

          echo 
          $temp_content
          wieso sollte es mit anderen templates probleme geben?

          PHP-Code:
          include "template.php";

          # kann man auch über eine funktion/methode mit links befüllen, soll das hier aber nur veranschaulichen
          # kannst auch aus einer config tabelle der DB holen
          $header "meine webseiten header";
          $footer " copyright &copy; mein_name ";

          $navi '<a href="link_1.html">link 1</a><br /><a href="link_2.html">link 2</a><br />';
          $content 'test content';

          #navi template laden, mit den links füllen und "speichern"
          $template_navi = new Pages("templates/navi.html");
          $template_navi->replace("navi"$navi);
          $temp_navi $template_navi->echo_template(); 

          $template_design = new Pages("templates/design.html");
          $template_design->replace("head"$header);
          $template_design->replace("navi"$temp_navi);
          $template_design->replace("cont"$content);
          $template_design->replace("foot"$footer); 
          $temp_design $template_design->echo_template(); 

          echo 
          $temp_design 
          navi.html
          HTML-Code:
          <div id="navi">
             <h2>navigation</h2>
             <p>{navi}</p>
          </div>
          design.html
          HTML-Code:
          ...
          <body>
          	<div id="rahmen">
          		<div id="head">{head}</div>
          		<div id="navi">{navi}</div>      
          		<div id="cont">{cont}</div>
          		<div id="foot">{foot}</div>
          	</div>
          ...
          wie die ausgabe am ende aussiehst kannst du dir selber ausmalen/testen.

          und es macht schon sinn bei templates auf php code zu verzichten, so trennst du das ganze viel besser.

          html kümmert sich um die darstellung
          css (was du ja sicherlich einbindest) kümmert sich um farben und aussehen/positionierung, usw
          php um die eigentliche programmierung ... daten aus der db holen und reinschreiben, usereingaben überprüfen ... daten zum template-system zu senden.

          Zitat von h3ll Beitrag anzeigen
          Merkt man. "var" stammt noch aus PHP 4, das schon über 10 Jahre auf dem Buckel hat
          ist halt in die jahre gekommen und hatte keine lust es zu ändern.
          als var deklarierte variablen werden ja automatisch als public angesehen.
          natürlich sollte man es ändern damit es einheitlich ist wenn man schon mit php5+ oop bestreiten will.
          Gruß
          Uzu

          private Homepage

          Kommentar


          • #6
            Also erstmal großer Dank an dich. Hat mir in vielerlei Hinsicht etwas gebracht.
            Entsprechend sieht meine Klasse pages jetzt so aus:
            PHP-Code:
            <?php

            class Pages {

                public 
            $header;
                public 
            $navigation;
                public 
            $content;
                public 
            $footer;


                public function 
            createTemplates () {

                    
            /**
                     * Header
                     */
                    
            $template_header = new Templates("templates/tmp_header.php");
                    
            $template_header->replace("header"$this->getHeader());
                    
            $temp_header $template_header->echo_template();

                    
            /**
                     * Navigation
                     */
                    
            $template_navi = new Templates("templates/tmp_navigation.php");
                    
            $template_navi->replace("navigation"$this->getNavigation());
                    
            $temp_navi $template_navi->echo_template();

                    
            /**
                     * Content
                     */
                    
            $template_content = new Templates("templates/tmp_content.php");
                    
            $template_content->replace("content"$this->getContent());
                    
            $temp_content $template_content->echo_template();

                    
            /**
                     * Footer
                     */
                    
            $template_footer = new Templates("templates/tmp_footer.php");
                    
            $template_footer->replace("footer"$this->getFooter());
                    
            $temp_footer $template_footer->echo_template();


                    
            $template_design = new Templates("templates/html5.php");
                    
            $template_design->replace("project_title"$GLOBALS['CONFIG']['PROJECT_NAME']);
                    
            $template_design->replace("charset"$GLOBALS['CONFIG']['CHARSET']);
                    
            $template_design->replace("header"$temp_header);
                    
            $template_design->replace("navigation"$temp_navi);
                    
            $template_design->replace("content"$temp_content);
                    
            $template_design->replace("footer"$temp_footer);
                    
            $temp_content $template_design->echo_template();

                    echo 
            $temp_content;

                }


                public function 
            getHeader() {

                    
            $header '<h1>HEADER</h1>';
                    return 
            $header;

                }


                public function 
            getNavigation() {

                    
            $navigation '<a href="index.php?pageID=1">Home</a> | <a href="index.php?pageID=2">About</a> | <a href="index.php?pageID=3">Contact</a>';
                    return 
            $navigation;

                }


                public function 
            getContent() {

                    (isset(
            $_GET['pageID'])) ? $pageID $_GET['pageID'] : $pageID 1;

                    switch (
            $pageID) {
                        case 
            1:
                            
            $hx 3;
                            
            $class "home";
                            
            $headline "Home";
                            
            $page_content 'Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                            feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                            augue. Curabitur ullamcorper ultricies nisi.'
            ;
                            break;

                        case 
            2:
                            
            $hx 3;
                            
            $class "about";
                            
            $headline "About";
                            
            $page_content 'Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                            augue. Curabitur ullamcorper ultricies nisi.'
            ;
                            break;

                        case 
            3:
                            
            $hx 3;
                            
            $class "contact";
                            
            $headline "Contact";
                            
            $page_content 'Porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis,
                                            feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel
                                            augue. Curabitur ullamcorper ultricies nisi.'
            ;
                            break;
                    }

                    
            $content '<h' $hx ' class="' $class '">' $headline '</h' $hx '>';
                    
            $content .= $page_content;

                    return 
            $content;

                }


                public function 
            getFooter() {

                    
            $footer '<span style="font-size: smaller;">FOOTER</span>';
                    return 
            $footer;

                }

            }
            Wie du siehst, habe ich einzelnen Bereiche in eigene Funktionen gelegt. Dank deines Beispiels klappt das auch so sehr gut.

            Aufgerufen werden die Klassen in meiner index.php.
            PHP-Code:
            require_once 'system/core/classes/templates.php';
            require_once 
            'system/core/classes/pages.php';
            $pages = new Pages();
            $pages->createTemplates(); 
            Zum Schluß noch die Klasse template, die jetzt so ausschaut:
            PHP-Code:
            <?php

            class Templates {

                public 
            $path;
                public 
            $content;

                
                public function 
            __construct ($file) {

                    
            $this->path $file;

                    if (
            file_exists($this->path))
                    {
                        
            $file = @fopen($this->path"r");
                    }
                    else
                    {
                        die (
            $this->path." not found");
                    }

                    while(!
            feof($file))
                    {
                        
            $temp fgets($file4096);
                        
            $this->content .= $temp;
                    }

                }


                public function 
            replace($placeholder$value) {

                    
            $this->content str_replace("{" $placeholder "}"$value$this->content);

                }


                public function 
            echo_template() {

                    return 
            $this->content;

                }

            }
            Alles wunderbar!

            Das dein Code älter ist habe ich auch gesehen. Aber macht ja nichts, daß kann man ja anpassen, was ich ja auch gemacht habe.


            und es macht schon sinn bei templates auf php code zu verzichten, so trennst du das ganze viel besser.

            html kümmert sich um die darstellung
            css (was du ja sicherlich einbindest) kümmert sich um farben und aussehen/positionierung, usw
            php um die eigentliche programmierung ... daten aus der db holen und reinschreiben, usereingaben überprüfen ... daten zum template-system zu senden.
            Naja, meiner Meinung nach kann man PHP auch direkt als Template-System nutzen. Ein <?php echo $this->content; ?> ist auch nicht schlimmer als ein {content}.
            Aber wie ich oben schon erwähnte, denke ich, daß es mit Schleifen und Abfragen schwierig werden könnte. Ok, ich hab mich damit noch nicht weiter beschäftigt, aber If-Anweisungen in einem Template können auch manchmal sinnvoll sein. Oder eben eine foreach-Schleife. So habe ich das zum Bsp. bisher:
            PHP-Code:
            <?php foreach ($arrNewslist as $news): ?>
                <h1 class="articlename"><?php echo $news['headline']; ?></h1>
                <div class="">Autor: <?php echo $news['author']; ?> | <?php echo $news['tstamp']; ?></div>
                <div class=""><?php echo $news['teaser']; ?></div>
                <?php if ($news['link_more'] == 1): ?>
                    <p><a href="#">Weiter...</a></p>
                <?php endif; ?>
            <?php 
            endforeach; ?>
            Wie könnte ich diesen Code über dein Template-System einbinden?


            Gruss, Fransisco

            Kommentar


            • #7
              Ich zitiere mich mal selber...

              Wie könnte ich diesen Code über dein Template-System einbinden?
              Was mir so die Recherchen der letzten Stunden gebracht haben, war nur eine Bestätigung, wie ich es anfangs schon erwähnte. Es wird wohl keine Möglichkeit geben, so das Template-System zu nutzen, daß man auch Array im Template ausgegen kann. Selbst bei Smarty wird in den Templates mit foreach-Schleifen hantiert.

              Jetzt habe ich dieses Script im Netz gefunden, was zwar auch schon alt ist, aber wahrscheinlich funktionieren wird, um Array zu übergeben.

              Tutorials | PHP : Fortgeschrittene | eigenes Template-System

              Das wird wohl meine Nachtschicht werden, dieses in mein System einzubinden. ;-)
              Nebenbei wird da auch noch genau das wieder gegeben, was ich selbst zu Templatesystemen denke und hier auch schon geschrieben habe. PHP kann das alles selbst und das bestimmt auch noch besser und ressourcenschonender.

              Allerdings hätte es am allerliebsten, wenn ich gar nicht eine neue Klasse einbinden müsste, um Arrays auszugeben.
              So wie die Klasse noch in meinem ersten Posting funktionierte, konnte ich ja mit require auf mein Template zugreifen. Nur wenn ein anderes Template über eine andere Klasse eingebunden wird, wird die HTML-Struktur zurschossen. Leider weiß ich nicht warum?! Daher versuche ich mal den Thread hier am Leben zu erhalten und würde mir noch mehr Anregungen und Tipps wünschen.

              @UzumakiNaruto: Dennoch finde ich dein 'altes' System hier gut und es hat mir auch grundsätzlich weitergeholfen, noch mehr die OOP zu kapieren. Ist zwar dennoch ein weiter Weg für mich, aber jetzt will ich es einfach wissen!


              Gruss, Fransisco

              Kommentar


              • #8
                wenn du jetzt aber weiter denkst und du nicht mehr alleine was machst sondern in einem team könnte es schwierig werden ;-)

                da hast du den typen der super html, css und js kann .. aber von php keine ahnung hat ... aber DU.

                er gibt dir einfach html templates mit variablen a'la {content} und DU füllst die nur noch.

                ich habe mit dem template system schon so einiges angestellt (z.B. news modul).

                und was macht es für einen unterschied ob die php datei die das template system befüllt dein array verarbeitet oder ob es deine template datei selber ist?
                du könntest auch die template klasse erweitern um eine methode die sich um arrays kümmert (auch wenn ich arrays einfach in der datei abarbeiten würde die auch das template lädt, füllt und speichert/ausgibt.

                module_news.html
                HTML-Code:
                <div id="news"> <!-- in html5 könnt das auch <section> sein-->
                   <h2>{news_title}</h2>
                   <p>{news_content}</p>
                   <p>von: {news_author} am {news_date} {news_comments} {news_readmore}</p>
                </div>
                PHP-Code:
                # includes der module, db connect usw

                $sql "SELECT * FROM news"#vllt mit WHERE news_date > $time -  (vor 7 tagen)
                $result mysql_query($sql);

                $while ($row mysql_fetch_assoc($result)) {

                   if (
                strlen($row['content']) > 200) { #mehr als 200 zeichen im content
                      
                $news_content substr($row['news_content'],0,199); #speicher 200 zeichen in $news_content
                      
                $news_readmore '<a href="news.php?id='.$row['news_id'].'">... mehr</a>'# erstelle einen link um alles zu lesen
                   
                } else {
                      
                $news_content $row['news_content'];
                      
                $news_readmore '';
                   }

                   
                $template_news = new Templates("module_news.html");
                   
                $template_news->replace("news_title"$row['news_title']);
                   
                $template_news->replace("news_content"$news_content);
                   
                $template_news->replace("news_author"$row['news_author']);
                   
                $template_news->replace("news_date"$row['news_date']);
                   
                $template_news->replace("news_readmore"$news_readmore);
                   
                $temp_news .= $template_news->echo_template();

                das script rattert durch und baut dir dein template system news für news ... und je nachdem ob die news 201 zeichen hat oder nur 100 .. sie sieht anders aus.

                da kannst du auch locker noch kommentare einbauen

                PHP-Code:
                # sql abfrage nach den comments für die $row['news_id']
                # while schleife, template laden und variablen ersetzen
                # in $temp_comments speichern und der news seite mitgeben
                # {news_comments} kann in module_news.html einfach ein <div class="comments">{news_comments}</div> sein und du baut da mit dem template system den richtigen inhalt rein.
                $template_news->replace("news_comments"$temp_comments); 
                du siehst, deine "html dateien" können ruhig strohdumm sein und sich wirklich NUR um die positionierung und das aussehen kümmern ohne das dort eine zeile php code drin ist.
                Zuletzt geändert von UzumakiNaruto; 12.04.2013, 10:03.
                Gruß
                Uzu

                private Homepage

                Kommentar


                • #9
                  Zitat von Fransisco Beitrag anzeigen
                  Was mir so die Recherchen der letzten Stunden gebracht haben, war nur eine Bestätigung, wie ich es anfangs schon erwähnte. Es wird wohl keine Möglichkeit geben, so das Template-System zu nutzen, daß man auch Array im Template ausgegen kann. Selbst bei Smarty wird in den Templates mit foreach-Schleifen hantiert.
                  Smarty ist ja auch kein ordentliches Template-System sondern (IMHO) Müll.

                  Mann kann Arrays auch "in HTML" ausgeben, ohne Schleifen basteln zu müssen.

                  Beispiel:
                  HTML-Code:
                  <table>
                    <thead>
                      <tr>
                        <th>Position</th>
                        <th>Player</th>
                        <th>Score</th>
                      </tr>
                    </thead>
                    <tbody>
                      <tr tal:repeat="ranking playersRanking">
                        <td tal:content="ranking/position"/>
                        <td tal:content="ranking/player"/>
                        <td tal:content="ranking/score"/>
                      </tr>
                    </tbody>
                  </table>
                  tal:repeat
                  Zuletzt geändert von h3ll; 12.04.2013, 13:31.

                  Kommentar


                  • #10
                    PHPTAL ist aber auch eine ex. Erweiterung. Auf sowas möchte ich eigentlich verzichten.
                    Grundsätzlich baue ich mir hier schon eine Art CMS auf, das aber nur für mich alleine, ohne Team, nur zum lernen. Normal brauche ich das ja nicht, gibt ja schon genug.
                    Ich finde es schon gut, daß man sich selber sein eigenen Template-System erstellen kann, doch wie gesagt, finde ich es es eigentlich überflüssig, daß ich dies alles schon direkt mit PHP machen kann.
                    So habe ich auch weiter an meiner ersten Klasse gehalten und doch eine Lösung gefunden, meine Template-Dateien mit require einzubinden. Ich mußte nur ein paar mehr Funktionen erstellen. Also für jedes Template eine. Da finde ich so in Ordnung, denn dann kann ich da auch gleich die Datenbank-Abfragen mit einbinden und diese werden dann ja auch sofort ans Template übergeben.

                    Im Groben sieht das Haupttemplate jetzt so aus:
                    PHP-Code:
                    <body>
                    <header style="border: 1px red solid; padding: 10px; margin-bottom: 5px;"><?php $this->getHeader(); ?></header>
                    <nav style="border: 1px green solid; padding: 10px; margin-bottom: 5px;"><?php $this->getNavigation(); ?></nav>
                    <div id="content" style="border: 1px blue solid; padding: 10px; margin-bottom: 5px;"><?php $this->getContent(); ?></div>
                    <footer style="border: 1px orange solid; padding: 10px;"><?php $this->getFooter(); ?></footer>
                    </body>
                    Aufruf des Haupttemplates und der Navigation:
                    PHP-Code:
                        public function getTemplate()
                        {
                            require 
                    'templates/frontend.php';
                            return;
                        }


                        public function 
                    getNavigation()
                        {

                            
                    $mysqli = new mysqli ($this->db_host$this->db_user$this->db_pass$this->db_base);
                            
                    $query "SELECT * FROM pages WHERE menu = 1 AND lang = '" $GLOBALS['CONFIG']['lang'] . "' AND activ = 1";
                            
                    $result $mysqli->query($query);

                            
                    $navigation = array();
                            while(
                    $row $result->fetch_array(MYSQLI_ASSOC))
                            {

                                
                    $navi = array
                                (
                                    
                    'id'  => $row['id'],
                                    
                    'name' => $row['name']
                                );

                                
                    $navigation[] = $navi;

                            }

                            
                    $result->free();
                            
                    $mysqli->close();

                            
                    $this->navigation $navigation;

                            require 
                    'templates/navigation.php';
                            return;
                        } 
                    Und das Navi-Template selbst so:
                    PHP-Code:
                    <div class="navigation inside">
                        <ul>
                        <?php foreach ($this->navigation as $navi): ?>
                            <li><a href="index.php?pageID=<?php echo $navi['id']; ?>"><?php echo $navi['name']; ?></a></li>
                        <?php endforeach; ?>
                        </ul>
                    </div>
                    Wie ich als Leie finde, auch eine saubere Lösung.


                    Gruss, Fransisco

                    Kommentar


                    • #11
                      man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)

                      auch solltest du lieber mit externen css dateien arbeiten und die im html head einbinden und dafür dein html code css frei halten.

                      CSS - Überblick
                      Gruß
                      Uzu

                      private Homepage

                      Kommentar


                      • #12
                        Zitat von UzumakiNaruto Beitrag anzeigen
                        man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)
                        Da bin ich so nicht mit einverstanden.
                        Man benutzt Templatesysteme um Verarbeitung und Präsentation zu trennen.

                        Um Templates frei von Code zu halten müssen fürchterliche Verrenkungen vorgenommen werden.

                        Die Trennung von PHP und HTML zwingt zur Einführung einer Zwischensprache.
                        Zum Beispiel ist das bei der Template Engine Fluid ganz gut gemacht. Bei Smarty eher weniger schön.

                        Auch sehr konsequent: XSL Transformation ? Wikipedia
                        Wir werden alle sterben

                        Kommentar


                        • #13
                          Zitat von UzumakiNaruto Beitrag anzeigen
                          man nutzt aber template-systeme um gerade code und darstellung zu trennen. du bringst es wieder zusammen ;-)
                          Naja, ein echo als Ausgabe in einem Template sehe ich jetzt nicht im Sinne von Code. Aber wie vieles auch: Ansichtssache. Ich denke, beide Systeme haben ihre Vor- und Nachteile. Für eines muß man sich aber nunmal entscheiden.

                          auch solltest du lieber mit externen css dateien arbeiten und die im html head einbinden und dafür dein html code css frei halten.
                          Das ist schon klar und dient ja auch erstmal nur für die schnelle Optik. Im Code vom Navi-Template siehst du ja auch, daß ich mir schon DIVs und Klassen erstelle.


                          Gruss, Fransisco
                          Zuletzt geändert von Fransisco; 13.04.2013, 14:34.

                          Kommentar


                          • #14
                            Zitat von combie Beitrag anzeigen
                            Die Trennung von PHP und HTML zwingt zur Einführung einer Zwischensprache.
                            Genau das meine ich ja auch. Gut und danke, ich fühle mich etwas mehr bestätigt. ;-)


                            Gruss, Fransisco

                            Kommentar

                            Lädt...
                            X