tutorials.de Buch-Aktion 05/2012
  • [PHP] Templates

    Servus!

    Wäre es nicht schön, wenn wir HTML und PHP Code ganz voneinander trennen könnten? Jo wäre es. Also nutzen wir Templates.

    Wir erstellen eine reine HTML Seite, die unser Layout und sämtliche design-technischen Sachen enthällt.
    An den Stellen im Code, wo dynamisch generierter Inhalt hinsoll, setzen wir Platzhalter, die später mit entsprechenden Informationen ersetzt werden.
    Ein Beispiel:
    layout.html
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    <html>
    <head>
    <title>$title</title>
     
    <script type="text/javascript">
    //<![CDATA[
     
    window.google_analytics_uacct = "UA-1691844-1";
     
     
    //]]>
    </script>
    </head>
     
    <body bgcolor="#FFFFFF" text="#000000">
    <table width="50%" border="1" height="365" align="center">
      <tr>
        <td valign="top">Hier kommt ein nettes Bildchen hin</td>
      </tr>
      <tr>
        <td valign="top">$inhalt</td>
      </tr>
      <tr>
        <td valign="top">Tutorial by TimeFlash</td>
      </tr>
    </table>
    <div class="footer_morecopyright" style="margin-top: 0px;color:#FFFFFF;">Page Time: <b>0,15939</b> seconds Memory: <b>14,023</b> KB Queries: <b>98</b> Templates: <b>41</b> (<b>21</b> uncached)<br />Server Uptime: <b>23 hours 53 mins</b> Server Load: <b>1.35</b> : 1.46 : 1.43<br /><table cellspacing="0" cellpadding="0" border="0" style="margin-left: auto; margin-right: auto;"><tr><td style="color: #cccccc; text-align: left;"><b>editor_clientscript</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_jsoptions_font</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_jsoptions_size</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie</b></td><td style="padding-left: 10px;">(10)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie_category</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie_row</b></td><td style="padding-left: 10px;">(15)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smiliebox</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_colors</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_fontname</b></td><td style="padding-left: 10px;">(21)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_fontsize</b></td><td style="padding-left: 10px;">(7)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>newpost_attachment</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>newpost_disablesmiliesoption</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>tagbit_wrapper</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_article_editor</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_content_article_inline</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_content_edit_editbar</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_block</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_metadataeditor</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_page</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_publisher</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_editor_toolbar_on</b></td><td style="padding-left: 10px;">(1)</td></tr></table></div></body>
    </html>
    Unsere PHP Datei sorgt dann für die jeweiligen Informationen, die aus einer Datenbank oder ähnlichem Stammen.

    index.php
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    function gettemplate($template,$endung="html")
    {
    return str_replace("\"","\\\"",implode("",file($template.".".$endung)));
    }
    function dooutput($template) {
    echo $template;
    }
    Das Board zerstückelt den Code einwenig, also in dieser Form.
    PHP-Code:
    $title "Test";
    //Der Inhalt wird z.B. aus einer Datenbank geholt
    $inhalt $row[inhalt];
    //jetzt der Aufruf, wo das Template geholt wird und die Platzhalter ersetzt werden.
    eval("dooutput(\"".gettemplate("layout")."\");");
    //Bei eval() muss beachtet werden, dass alle Hochkommas und Variablenzeichen ($) durch ein Backslash markiert werden

    ?> 
    Es ist natürlich von Vorteil, wenn wir häufig wiederholten HTML Code in einem Template speichern können und dann einfach nur abrufen können,
    ohne ihn andauernd neu zu schreiben. Ansonsten haben wir PHP und HTML vollständig voneinander getrennt, was bedeutet, dass der Designer und der Programmierer getrennt arbeiten
    können, ohne den anderen zu behindern.

    Das vBulletin arbeitet nach dem gleichen Prinzip.

    Regards
    TimeFlash

    Moin Leute,
    da es anscheind Probleme bereitet ein Template mehrfach aufzurufen, zum Beispiel bei einem Gästebuch, erweitern wir das Tutorial mal ein bisschen.

    Unsere Templatefunktionen vom ersten Thread: templatefunktionen.php
    Code :
    1
    2
    3
    4
    5
    6
    7
    
    function gettemplate($template,$endung="html")
    {
    return str_replace("\"","\\\"",implode("",file($template.".".$endung)));
    }
    function dooutput($template) {
    echo $template;
    }
    Dann unsere beiden HTML Datein:
    Hauptseite: Layout.html
    PHP-Code:
    <html>
    <
    body>
    <
    script type="text/javascript"><!--
    var 
    _gaq _gaq || [];
    _gaq.push(
    [
    '_setAccount''UA-1691844-1'],
    [
    '_trackPageview']
    );
    (function() {
    var 
    ga document.createElement('script'); ga.type 'text/javascript'ga.async true;
    ga.src = ('https:' == document.location.protocol 'https://ssl' 'http://www') + '.google-analytics.com/ga.js';
    var 
    document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(gas);
    })();
    //-->
    </script>

    Also Leute, hier folgt gleich ein Template Test:<br>
    $str
    Hier ist das Ende.<br>
    <div class="footer_morecopyright" style="margin-top: 0px;color:#FFFFFF;">Page Time: <b>0,15939</b> seconds Memory: <b>14,023</b> KB Queries: <b>98</b> Templates: <b>41</b> (<b>21</b> uncached)<br />Server Uptime: <b>23 hours 53 mins</b> Server Load: <b>1.35</b> : 1.46 : 1.43<br /><table cellspacing="0" cellpadding="0" border="0" style="margin-left: auto; margin-right: auto;"><tr><td style="color: #cccccc; text-align: left;"><b>editor_clientscript</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_jsoptions_font</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_jsoptions_size</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie</b></td><td style="padding-left: 10px;">(10)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie_category</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smilie_row</b></td><td style="padding-left: 10px;">(15)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_smiliebox</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_colors</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_fontname</b></td><td style="padding-left: 10px;">(21)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>editor_toolbar_fontsize</b></td><td style="padding-left: 10px;">(7)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>newpost_attachment</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>newpost_disablesmiliesoption</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>tagbit_wrapper</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_article_editor</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_content_article_inline</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_content_edit_editbar</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_block</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_metadataeditor</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_page</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_edit_publisher</b></td><td style="padding-left: 10px;">(1)</td></tr><tr><td style="color: #cccccc; text-align: left;"><b>vbcms_editor_toolbar_on</b></td><td style="padding-left: 10px;">(1)</td></tr></table></div></body>
    </html> 
    HTML Datei, die wir mehrfach aufrufen. wiederholung.html
    PHP-Code:
    Dieser Text wird jetzt oft nacheinander angezeigt<b>$inhalt</b>...........<br
    Jetzt kommen wir zu unserer PHP Datei
    PHP-Code:
    <?PHP
    include("templatefunktionen.php");
    for(
    $inhalt=0;$inhalt<=10;$inhalt++)
    {
    eval (
    "\$str .= \"".gettemplate("wiederholung")."\";");
    }
    eval (
    "dooutput(\"".gettemplate("Layout")."\");");
    ?>
    Wir nutzen die for-Schleife um der Variablen $inhalt gleich einem Wert zu zuweisen. Nun rufen wir 10x das Template wiederholung.html auf, und weisen dem Platzhaltern $inhalt den entsprechenden Wert zu. Nachdem wir die Schleife bis zum Ende durchlaufen haben, geben wir das ganze Template aus.


    Ich denke, dass das Prinzip nun klar ist, wie man ein Template für mehrere Ausgaben benutzt. Viel Spaß damit.
    Fragen einfach per PN

    Caminus
     


    Kommentare Kommentar schreiben

    Klicke hier, um dich anzumelden

    Wie heißt die Hauptstadt der Bundesrepublik Deutschland?