Welkom, Gast. Je bent niet ingelogd.

script Saven.nl Template Engine

Saven
admin
Geplaatst op: 07 Feb 2009, 02:49
PimpCoins: 0
💸+
Bewerken Quote

Omdat ik zelf behoefte had aan een hele licht en makkelijk template systeem ben ik er zelf maar eentje gaan maken.
Smarty is te lomp, en Template Lite is ook veel meer en zwaarder dan nodig.

Deze template engine dient zijn doel: applicatie-logica scheiden van de presentatie-logica. Dat is wat volgensmij nog veel mensen niet begrijpen. Een template parser/engine is niet bedoeld om je PHP van HTML te scheiden.

Het template bestand ziet er eigenlijk net zo uit als dat je een template maakt voor je CodeIgniter script.

Als eerst de code (komt uit Saven.nl v5 welke nog in ontwikkeling, heb deze class even speciaal aangepast om hier te posten. Heb hem net aangepast op 02:40 dus niet boos worden als je een parse-error krijgt. Heb hem namelijk nog niet getest )

templatex.php:

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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
<?php

/*
    TEMPLATE X
    
    (C) Copyright Saven.nl
    
    Easy and free to use little template engine
    For non-commercial use only
*/

class Template_X
{
    //-----------------------------------------
    // Store al the assigned vars
    //-----------------------------------------
    private $tpl_dir;
    
    //-----------------------------------------
    // Level of error reporting to do
    //-----------------------------------------
    private $error_level;
    
    //-----------------------------------------
    // Store al the assigned vars
    //-----------------------------------------
    private $vars = array();
    
    //----------------------------------------------------------------
    // Our constructor, jeweetz
    //----------------------------------------------------------------
    public function __construct($tpl_dir, $error_level=E_ALL)
    {
        //-----------------------------------------
        // Check if it's a dir!
        //-----------------------------------------
        if( !is_dir($tpl_dir) )
        {
            trigger_error("Template dir '".$tpl_dir."' does not exist", E_USER_ERROR);
        }
        
        //-----------------------------------------
        // Set the template dit
        //-----------------------------------------
        $this->tpl_dir = $tpl_dir;
        
        //-----------------------------------------
        // Set template error reporting level
        //-----------------------------------------
        $this->error_level = $error_level;
    }
    
    //----------------------------------------------------------------
    // Assign a var
    //----------------------------------------------------------------
    public function assign($var, $value=null)
    {
        if( is_array($var) )
        {
            foreach($var as $key => $value)
            {
                if( isset($this->vars[$key]) )
                {
                    trigger_error("Template assigned variable '".$key."' is already in use", E_USER_WARNING);
                }
                
                $this->vars[$key] = $value;
            }
        }
        else
        {
            if( isset($this->vars[$var]) )
            {
                trigger_error("Template assigned variable '".$var."' is already in use", E_USER_WARNING);
            }
            
            $this->vars[$var] = $value;
        }
    }
    
    //----------------------------------------------------------------
    // Display our template :D
    //----------------------------------------------------------------
    public function display($file, $data=null)
    {
        $file = $this->tpl_dir.$file;
        
        //-----------------------------------------
        // Check if extra vars are added
        //-----------------------------------------
        if( is_array($data) )
        {
            $this->assign($data);
        }
        
        //-----------------------------------------
        // Most important of all, make it work!
        //-----------------------------------------
        if( file_exists($file) )
        {
            //-----------------------------------------
            // Assigned vars to php vars
            //-----------------------------------------
            extract($this->vars);
            
            //-----------------------------------------
            // Temporary disable notice errors
            //-----------------------------------------
            error_reporting(E_ALL ^ E_NOTICE);
            
            //-----------------------------------------
            // Display the file
            //-----------------------------------------
            include_once($file);
            
            //-----------------------------------------
            // Set error reporting back to normal
            //-----------------------------------------
            error_reporting($this->error_level);
        }
        else
        {
            trigger_error("Template file '".$file."' does not exist", E_USER_ERROR);
        }
    }
    
    //----------------------------------------------------------------
    // Fetch a template, return the content. Doesn't print it
    //----------------------------------------------------------------
    public function fetch($file, $data=null)
    {
        $file = $this->tpl_dir.$file;
        
        //-----------------------------------------
        // Check if extra vars are added
        //-----------------------------------------
        if( is_array($data) )
        {
            $this->assign($data);
        }
        
        //-----------------------------------------
        // Most important of all, make it work!
        //-----------------------------------------
        if( file_exists($file) )
        {
            //-----------------------------------------
            // Assigned vars to php vars
            //-----------------------------------------
            extract($this->vars);
            
            //-----------------------------------------
            // Temporary disable notice errors
            //-----------------------------------------
            error_reporting(E_ALL ^ E_NOTICE);
            
            //-----------------------------------------
            // Get the files content
            //-----------------------------------------
            ob_start();
                include_once($file);
                $output = ob_get_contents();
            ob_end_clean();
            
            //-----------------------------------------
            // Set error reporting back to normal
            //-----------------------------------------
            error_reporting($this->error_level);
            
            //-----------------------------------------
            // Spit those rhyms!
            //-----------------------------------------
            return $output;
        }
    }
}

?>

Even het gebruik uitleggen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// template engine starten
require_once('templatex.php');
$tpl = new Template_X('template/tpl/'); //Template_X('template/dir/', ERROR_REPORTING_LEVEL)

// wat data assignen
$assigns = array
(
   'website' => 'Saven.nl',
   'naam'    => 'Jan'
);

// via de extra optionele $data parameter in de functie display() en fetch() kunnen we nog extra data toevoegen vanuit een array
$extra = array();
$extra['taal'] = 'Nederlands';
$extra['dag']  = 'maandag';

// Template weergeven
$tpl->display('layout.php', $extra);

?>

Oke leuk en aardig. Maar een template file kan er dan bijvoorbeeld zo uit zien:

template/tpl/layout.php:

1
2
3
4
Hallo, <?= $naam; ?> en welkom op <?= $website; ?><br /><br />

De taal is: <?= $taal; ?>
En het is vandaag: <?= $dag; ?>

Ook is het mogelijk om bijvoorbeeld de template file niet te laten weergeven, maar de inhoud op te slaan in een var. Dit kan handig zijn voor een email_body ofzo. Dat werkt hetzelfde als een display, maar gebruiken we niet de display() maar de fetch() functie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// template engine starten
require_once('templatex.php');
$tpl = new Template_X('template/tpl/');

// wat data assignen
$assigns = array
(
   'website' => 'Saven.nl',
   'naam'    => 'Jan'
);

// Template ophalen en opslaan in een variable
$content = $tpl->fetch('email_body.php');

// Weergeven, of in een mail() functie oid gebruiken..
echo $content;

?>

Volgensmij heb ik alles wel behandeld maar het is laat en ik ben moe Dus als iemand wat toevoegingen heeft hoor ik het graag!

Ga trouwens niet zeuren of je dit nutteloos vindt of niet. Het werkt perfect en voldoet aan mijn eisen, en is tevens superlicht in gebruik.

Bart
Hoeren :'(
Geplaatst op: 07 Feb 2009, 09:24
PimpCoins: 0
💸+
Bewerken Quote

Goedemorgen

sandr
aka Chuck Norris
Geplaatst op: 07 Feb 2009, 10:01
PimpCoins: 0
💸+
Bewerken Quote

ok, leuk, ga het wss toch niet gebruiken maar wel geinig gemaakt.

Stijn
<b>Neuker</b>
Geplaatst op: 07 Feb 2009, 15:35
PimpCoins: 0
💸+
Bewerken Quote

Mooie code .
kzal er weer even in kijken misschien kan ik wel nog iets vinden ofzo voor en leuke toepassing

Saven
admin
Geplaatst op: 07 Feb 2009, 19:30
PimpCoins: 0
💸+
Bewerken Quote

doe dat

sandr
aka Chuck Norris
Geplaatst op: 07 Feb 2009, 20:08
PimpCoins: 0
💸+
Bewerken Quote

Heb eigenlijk wel 2 dingentjes waar ik wel wat over wil opmerken:
Waarom kan je op 2 manieren data doorgeven, namelijk de array $extra en de array $assigns, zie het voordeel hiervan niet echt in .

En de 2e: stel je hebt een pagina van een topic met daarin 15 posts, dan heb je dus 15 keer grotendeels dezelfde html, maar deze html moet je dan ook 15 keer herhalen in je template bestand, da's natuurlijk niet zo handig. Ik heb wel met systemen gewerkt waarin het ongeveer zo ging (sterk vereenvoudigd):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<table>
    <block post>
    <tr>
        <td>
            <a href="<?= $profielurl; ?>"><?= $nickname; ?></a>
        </td>
        <td>
            <?= $reactie; ?>
            <hr>
            <?= $sig; ?>
        </td>
    </tr>
    </block post>
</table>

en dat je dan dat block post x keer kunt parsen.

Sander
Geplaatst op: 07 Feb 2009, 22:24
PimpCoins: 0
💸+
Bewerken Quote

Dan kan je gewoon foreach gebruiken:

1
2
3
<? foreach( $posts as $post ): ?>
Titel: <?=$post[ 'titel' ]?>
<? endforeach; ?>

sandr
aka Chuck Norris
Geplaatst op: 08 Feb 2009, 10:47
PimpCoins: 0
💸+
Bewerken Quote

aha, da's wel handig jah .

Saven
admin
Geplaatst op: 08 Feb 2009, 13:47
PimpCoins: 0
💸+
Bewerken Quote

En die dubbele assign is een kwestie van voorkeur. zit er meer in voor het gemakt
en als je een array hebt dus, bijv. 15 posts. dan moet je die inderdaad foreachen

Basjee
Octo
Geplaatst op: 07 Apr 2011, 16:15
PimpCoins: 0
💸+
Bewerken Quote

Saven schreef:

En die dubbele assign is een kwestie van voorkeur. zit er meer in voor het gemakt
en als je een array hebt dus, bijv. 15 posts. dan moet je die inderdaad foreachen

ok

📫

Nieuw privébericht

🔥

Registreren


Login