Templatesystem Eigenbau

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

  • 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.
    Angehängte Dateien

  • #2
    Zitat von uhuwe Beitrag anzeigen
    Das erste Problem ist, dass ich keine Arrays an eine Fuktion übergen kann
    Doch, das kann man.
    Zitat von uhuwe Beitrag anzeigen
    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

    Kommentar


    • #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

      Kommentar


      • #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

        Kommentar


        • #5
          Arrays an funktion übergeben

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

          Kommentar


          • #6
            Zitat von uhuwe Beitrag anzeigen
            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

            Kommentar


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

              Kommentar


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

                Kommentar


                • #9
                  Zitat von combie Beitrag anzeigen
                  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

                  Kommentar


                  • #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...

                    Kommentar


                    • #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?

                      Kommentar


                      • #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

                        Kommentar


                        • #13
                          Zitat von combie Beitrag anzeigen
                          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.

                          Kommentar


                          • #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?

                            Kommentar


                            • #15
                              Zitat von TobiaZ Beitrag anzeigen
                              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.

                              Kommentar

                              Lädt...
                              X