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.