Templatesystem Eigenbau

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • Templatesystem Eigenbau

    Ich habe mich jetzt nochmal heran gewagt, ein eigenes Templatesystem zu basteln.

    Die PHP-Datein sind so aufgebaut:
    functions.php
    PHP Code:
    <?php

    function get_template($infile)
    {
        
    $tempfile=file($infile.'.tpl');
        
    $loopwhile=0;
        
    $loopfor=0;
        
    $loop=0;
        
    $if=0;
        
    $once=1;

        for(
    $i=0;$i<count($tempfile);$i++)
        {
            
    preg_match_all('/\{([a-zA-Z0-9_]+)\}/',$tempfile[$i],$matches);
            
            for(
    $j=0;$j<count($matches[0]);$j++)
            {
                if(
    $once==1)
                {
                    
    $replacement=$matches[1][$j];
                    global $
    $replacement;
                    
    $tempfile[$i]=str_replace($matches[0][$j],$$replacement,$tempfile[$i]);
                    
    $resulttext[$i]=$tempfile[$i];
                }
            }
            
            
    $results=preg_match_all('/\[(.*)\]/',$tempfile[$i],$matches);
            
            if(
    $results>0)    
            {
                for(
    $j=0;$j<count($matches[0]);$j++)
                {
                    
    $templatefunction=preg_split('/[^a-zA-Z0-9_\/]/',$matches[1][$j]);
                }            
                if(
    $templatefunction[0]=='if')
                {
                    
    $if++;
                }
                
                if(
    $templatefunction[0]=='include')
                {
                    
    $include++;
                    
                    include($
    $templatefunction[1]);
                }
                
                if(
    $templatefunction[0]=='while')
                {
                    
    $once=0;
                    
    $loopwhile++;
                }
                
                if(
    $templatefunction[0]=='/while')
                {
                    
    $loopwhile--;
                    
                    if(
    $loopwhile==0$once=1;
                }
                
                if(
    $templatefunction[0]=='for')
                {
                    
    $once=0;
                    
    $loopfor++;
                }
                
                if(
    $templatefunction[0]=='/for')
                {
                    
    $loopfor--;
                    
                    if(
    $loopfor==0$once=1;
                }
            }
            
    $resulttext[$i]=$tempfile[$i];
        }
        
        if(
    $loopwhile!=|| $loopfor!=0)
        {
            echo 
    "\$loopwhile: $loopwhile und \$loopfor: $loopfor<br/>";
            die(
    'Mit dem Template stimmt irgend etwas nicht. <h1>Abbruch</h1>');
        }
        else
        {
            
    $once=1;
            
    $loop=0;
        }
        
        echo(
    implode('',$resulttext));
    }

    ?>
    index.php
    PHP Code:
    <?php
    include('functions.php');

    $css='css/home.css';
    $artikel=(isset($_GET['artikel']))?$_GET['artikel']:"Kein Artikel vorhanden.";
    $REMOTE_ADDRESS=$_SERVER['REMOTE_ADDR'];
    $HOST_ADDRESS=$_SERVER['HTTP_HOST'];
    $mysql['text']=array("Datensatz1","Datensatz2");
    $text=$mysql['text'][1];
    $image='./bilder/Deutschlandfahne.svg';
    $imagetype='image/svg+xml';
    $imagename='Deutschlandfahne';
    $or_de='oder';
    $or_en='or';
    $lang='de';
    $typeor='or_'.$lang;
    $or=$$typeor;

    get_template('templates/header');
    get_template('templates/index');
    get_template('templates/footer');
    ?>
    Die Templates:
    header.tpl
    PHP Code:
    <link rel="stylesheet" type="text/css" href={css}>
    <
    object data={imagetype={imagetypewidth="100%" height="300px">Image: {imagename}</object>

    <
    font>

    <
    table width="100%">

    <
    tr><td valign="top">

    <
    table>

    <
    tr><td valign="top" class="table menue">

    <
    a href="?artikel=Dies ist meine erste Homepage"><h1>Home</h1></a>

    <
    a href="?artikel=computer">Computer</a><br>

    <
    a href="?artikel=fahnen">Fahnen</a><br>

    <
    a href="?artikel=grafikkarten">Grafikkarten</a>

    <
    hr />

    <
    h1><center>SVG Scripte</center></h1>

    <
    a href="?grafik=Fahne">SVG-Fahne</a>

    <
    a href="?grafik=Liebeserklaerung">Liebeserkl&auml;rung</a>

    </
    td>

    </
    tr>

    </
    table>

    </
    td>> 
    index.php
    PHP Code:
    <td>

    <
    table width="100%">

    <
    tr>

    <
    td><h1><center>{artikel}</center></h1><hr></td>

    </
    tr>

    [while 
    mysql text]

    <
    tr>

    <
    td>{text}</td>

    </
    tr>

    [/while]

    </
    table>

    </
    tr
    footer.tpl
    PHP Code:
    <tr><td colspan="3">

    <
    hr>

    Internet: {HOST_ADDRESS}<br /><br />



    E-Mail: <a href="mailto:quickjoe@web.de">quickjoe@web.de</a> {or} <a href="mailto:aldifahne@freenet.de">aldifahne@freenet.de</a><br /><br />

    <
    hr>

    Ihre IP-Adresse ist: {REMOTE_ADDRESS}

    </
    td></tr>

    </
    table
    So, wie man im Anhang sehen kann, funktioniert das bis auf die Schleifen.
    Das erste Problem ist, dass ich keine Arrays an eine Fuktion übergen kann und
    zweitens kein Array global erklären kann und wenn, dann weiß ich nicht wie.

    Ich hätte sonst die Datensätze aus der Datenbank geholt, in ein Array gepackt, bearbeitet und dann ausgegeben.
    Das Ganze sollte dann auch universell funktionieren.

    Hat noch irgend einer eine Idee?

    Danke schon mal im Voraus.
    Attached Files

  • #2
    Originally posted by uhuwe View Post
    Das erste Problem ist, dass ich keine Arrays an eine Fuktion übergen kann
    Doch, das kann man.
    Originally posted by uhuwe View Post
    und zweitens kein Array global erklären kann und wenn, dann weiß ich nicht wie.
    Mit global. Wie bei ganz normalen Variablen auch. Allerdings halte ich diese Vorgehensweise für absolut tödlich. Daten sollten immer sauber gekapselt werden. Ansonsten hast du einen Design-Fehler.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Comment


    • #3
      Auch wenn ich das Ganze für einen Irrweg halte:
      kein Array global erklären kann und wenn, dann weiß ich nicht wie.
      PHP Code:
      $GLOBALS['deinArray'] = array(1,2,3,4); 
      Wir werden alle sterben

      Comment


      • #4
        Oder
        PHP Code:
        global $array;
        $array = array(1,2,3); 
        Peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Comment


        • #5
          Arrays an funktion übergeben

          Wie muss ich die Funktion deklarieren? mit 'function foo($array[])' geht es schief.

          Comment


          • #6
            Originally posted by uhuwe View Post
            Wie muss ich die Funktion deklarieren? mit 'function foo($array[])' geht es schief.
            PHP Code:
            function bla($blubb)
            {
              
            print_r($blubb);
            }
            $blubber = array(1,2,3);
            bla($blubber); 
            Peter
            EDIT:
            9.999 Posts. Eigentlich sollte ich mich jetzt zur Ruhe setzen
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Comment


            • #7
              EDIT:9.999 Posts. Eigentlich sollte ich mich jetzt zur Ruhe setzen
              Na dann gratulieren wir dir zu 9.999 Beiträgen.

              Comment


              • #8
                Glückwunsch!
                Aber einen wirst du doch noch hin bekomen...
                Wir werden alle sterben

                Comment


                • #9
                  Originally posted by combie View Post
                  Glückwunsch!
                  Aber einen wirst du doch noch hin bekomen...
                  OffTopic:
                  OK, da ist er! Und 10.000!

                  Peter
                  Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                  Meine Seite

                  Comment


                  • #10
                    Ja, das dachte ich auch schon des öfteren.

                    Glückwunsch, vor allem aber zum Beibehalt der Qualität. Da war ich gerade schon wieder kontraproduktiv...

                    Comment


                    • #11
                      Ich lasse in meinem System prüfen, ob es auf Templatefunktionen trifft
                      wenn das der Fall ist wird geprüft, um welche Funktion es dabei handelt.
                      Wenn es auf eine Schleifenfunktion handelt, muss ich mir irgendwie merken, in welcher Zeile das ist. Mit 'static' komme ich da irgendwie nicht weiter.
                      Gibt es da noch eine andere Möglichkeit?

                      Comment


                      • #12
                        Wenn es auf eine Schleifenfunktion handelt,
                        Das ist eine Kontrollstruktur und keine Funktion

                        Da du da gerade eine eigene Sprache erfindest, wirst du wie alle, welche sowas tun, einen Parser schreiben dürfen.
                        Dabei könnte das Stichwort "endlicher Automat" hilfreich sein.
                        Wir werden alle sterben

                        Comment


                        • #13
                          Originally posted by combie View Post
                          Da du da gerade eine eigene Sprache erfindest, wirst du wie alle, welche sowas tun, einen Parser schreiben dürfen.
                          Den schreibe ich doch gerade.

                          Comment


                          • #14
                            muss ich mir irgendwie merken, in welcher Zeile das ist. Mit 'static' komme ich da irgendwie nicht weiter.
                            a) Warum musst du dir das merken? b) welche Rolle soll static dabei erfüllen?

                            Comment


                            • #15
                              Originally posted by TobiaZ View Post
                              a) Warum musst du dir das merken? b) welche Rolle soll static dabei erfüllen?
                              zu a) Dadurch, dass jede Zeile einzeln bearbeitet wird, muss bei einem Auftreffen von '[/while]' in die Zeile von '[while]' zurückgesprungen werden solange wie noch Datensätze offen sind.

                              zu b) Static soll veranlassen, dass der Variablenwert nicht jedes mal überschrieben wird.

                              Comment

                              Working...
                              X