|
|
|
Meine Template klasse: Klein aber Oho
Zurück zur Übersicht Das ist sie Meine Template Klasse:
| 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:
|
<?php
/**
* @author Mogria <m0gr14@gmail.com>
* @version 0.2
*
*/
class mtpl {
/**
* Der Pfad zur Template Datei
* @var <string> $file
*/
private $file;
/**
* Enthält alle Variablen die ersetzt werden.
* Im Index befindet sich der Variabelnname
* und der dazugehörige Wert ist der Wert der Variable
* @var <array> $vars
*/
private $vars = Array();
/**
* Konstrucktor
* Hier wird geprüft ob die angegebene Datei existiert.
* Wenn nicht wird eine Fehlermeldung ausgegeben.
* @param <string> $file der Pfad zur Templatedatei
*/
public function __construct ($file) {
if( is_file ($file) ) {
$this->file = $file;
} else {
die ( "<strong>FEHLER: </strong>Die angebene Template-Datei \"$file\" existiert nicht!");
}
}
/**
* Hier werden Variablen gesammelt die später im Template File eingesetzt werden
* @param <string> $var Name der Variable
* @param <string> $value Inhalt der Variable
*/
public function setvar($var, $value) {
$this->vars[$var] = $value;
}
/**
* Gibt die angegebene Variable zurück die mit setvar() definiert hat.
* Falls sie nicht existiert wird false zurückgegeben.
*
* @param <string> Variablenname
* @return <mixed> inhalt der Variable on success, <bool> false on failure.
*/
public function getvar($var) {
if ($this->varexists($var)) {
return $var;
} else {
return false;
}
}
/**
* Prüft ob eine Variable bereits mit setvar gesetzt wurde
*
* @param <string> Variabelnname
* @return <bool> true on success, false on failure
*/
public function varexists($var) {
return isset($this->vars[$var]);
}
/**
* Hier kann man mehrere Variabeln auf einmal angeben.
* Im index den Variablenamen und der dazugehörige wert ist der Inhalt der Variable
*
* @param <array> $array
*/
public function array_setvar($array) {
$keys = array_keys($array);
$value = array_values($array);
foreach( $keys as $k => $key){
if(!ctype_digit($key))
$this->setvar($key, $value[$k]);
}
}
/**
* Der Inhalt der Template Datei wird umgeformt, damit es eval ausführen kann.
* @return <string> Der geparste inhalt von der Datei dessen Pfad in der Eigenschaft $file festgelegt ist
*/
private function parse() {
//Die Template Datei wird ausgelesen
$var = file_get_contents($this->file);
//alle " werden escaped
$var = str_replace('"','\\"', $var);
$var = str_replace( '?}', ' echo "', str_replace('{?', '"; ', $var ));
$var = str_replace( '.}', ' . "', str_replace('{.', '" . ', $var ));
$var = preg_replace_callback('`"; (.*?) echo "`si', create_function( '$treffer', 'return str_replace(\'\\"\', \'"\',$treffer[0]);') , $var);
$var = preg_replace_callback('`" \. (.*?) \. "`si', create_function( '$treffer', 'return str_replace(\'\\"\', \'"\',$treffer[0]);') , $var);
return $var;
}
/**
* Gibt den Geparsten Inhalt der Template Datei aus
* @return <string>
*/
public function output() {
//Die Ausgabe wird angehalten
ob_start();
//Alle Variablen werden extrahiert
extract($this->vars, EXTR_SKIP);
//Die Ausgabe wird kommt in den Ausgabepuffer
eval('echo "' . $this->parse() . '";');
//Der Ausgabepuffer wird der variable ausgabe zugewiesen
$ausgabe = ob_get_contents();
//Der Ausgabepuffer wird geleert
ob_end_clean();
//Der Inhalt des Ausgabepuffers wird zurückgegeben
return $ausgabe;
}
}
?>
|
|
Da ihr jetzt sehrwahrscheindlich eh nur drübergeflogen seid, und nicht wisst um was es geht, mach ich euch ein Anwendungs Beispiel.
Das ist unsere Template Datei 'test.tpl':
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>$titel</title>
</head>
<body>
<h1>$heading</h1>
<p>$text</p>
<table border="1" cellpadding="2">
{? foreach($chars as $k => $char) { ?}
<tr>
<td>{. ($k + 1 ) .}</td>
<td>{. $char .}</td>
</tr>
{? } ?}
</table>
<p>Heute ist der {. date('d.m') .} im Jahre {. date("Y") .}</p>
</body>
</html>
|
|
Und das ist unsere php Datei 'test.php':
| 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:
|
<?php
//Die Klasse wird eingebunden
require_once("mtpl.class.php");
//Das Objekt wird erstellt
$tpl = new mtpl("test.tpl");
//Drei Variabeln werden auf einmal gesetzt
$tpl->array_setvar(
Array(
'titel' => "Alphabet",
'heading' => "Die Buchstaben des Alphabet's",
'text' => "Hier sehen sie Alle 26 Buchstaben des Alphabets"
)
);
//Es werden alle Buchstaben des Alphabets geholt
$buchstaben = Array();
for($i = 0; $i<26; $i++){
$buchstaben[] = chr($i + 97);
}
//Die Variable "chars" wird gesetzt
$tpl->setvar('chars', $buchstaben);
//Das Template Wird geparst & ausgegeben
echo $tpl->output();
?>
|
|
Und das ist der Quellcode der in den Browser kommt:
| 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:
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Alphabet</title>
</head>
<body>
<h1>Die Buchstaben des Alphabet's</h1>
<p>Hier sehen sie Alle 26 Buchstaben des Alphabets</p>
<table border="1" cellpadding="2">
<tr>
<td>1</td>
<td>a</td>
</tr>
<tr>
<td>2</td>
<td>b</td>
</tr>
<tr>
<td>3</td>
<td>c</td>
</tr>
<tr>
<td>4</td>
<td>d</td>
</tr>
<tr>
<td>5</td>
<td>e</td>
</tr>
<tr>
<td>6</td>
<td>f</td>
</tr>
<tr>
<td>7</td>
<td>g</td>
</tr>
<tr>
<td>8</td>
<td>h</td>
</tr>
<tr>
<td>9</td>
<td>i</td>
</tr>
<tr>
<td>10</td>
<td>j</td>
</tr>
<tr>
<td>11</td>
<td>k</td>
</tr>
<tr>
<td>12</td>
<td>l</td>
</tr>
<tr>
<td>13</td>
<td>m</td>
</tr>
<tr>
<td>14</td>
<td>n</td>
</tr>
<tr>
<td>15</td>
<td>o</td>
</tr>
<tr>
<td>16</td>
<td>p</td>
</tr>
<tr>
<td>17</td>
<td>q</td>
</tr>
<tr>
<td>18</td>
<td>r</td>
</tr>
<tr>
<td>19</td>
<td>s</td>
</tr>
<tr>
<td>20</td>
<td>t</td>
</tr>
<tr>
<td>21</td>
<td>u</td>
</tr>
<tr>
<td>22</td>
<td>v</td>
</tr>
<tr>
<td>23</td>
<td>w</td>
</tr>
<tr>
<td>24</td>
<td>x</td>
</tr>
<tr>
<td>25</td>
<td>y</td>
</tr>
<tr>
<td>26</td>
<td>z</td>
</tr>
</table>
<p>Heute ist der 26.07 im Jahre 2010</p>
</body>
</html>
|
|
Erklärung des Output Vorgangs: In der Funktion output() wird die Ausgabepufferung aktiviert. Alles was jetzt Ausgegeben wird z.B. mit echo, kommt in den Ausgabepuffer. Nun werden alle Variabeln die Vorher gesetzt wurden extrahiert. d.h. ein $array['index'] = "inhalt" wird zu $index = "inhalt".
Danach wird die Parse Funktion aufgerufen, und die Am anfang angegebene Datei wird ausgelesen. Es werden alle " escaped & alle {. werden zu " . , .} wird zu . " , {? wird zu "; , ?} wird zu echo " . Mit den 2 preg_replace_callback werden die slashes vor " entfernt die sich in einen von den bereichen {? ?} oder {. .} befinden, damit keine Fehler aufstreten, wenn man darin strings schreibt mit dem Double Qout.
Das Ergebnis wird zurückgegeben und per eval & echo ausgegeben, damit die Variablen die wir aus den Array geholt haben ihre Wirkung nehmen.
Eval führt Folgenden PHP code aus:
| PHP |
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
|
<?
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\"
\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">
<html xmlns=\"http://www.w3.org/1999/xhtml\">
<head>
<title>$titel</title>
</head>
<body>
<h1>$heading</h1>
<p>$text</p>
<table border=\"1\" cellpadding=\"2\">
"; foreach($chars as $k => $char) { echo "
<tr>
<td>" . ($k + 1 ) . "</td>
<td>" . $char . "</td>
</tr>
"; } echo "
</table>
<p>Heute ist der " . date('d.m') . " im Jahre " . date("Y") . "</p>
</body>
</html>";
|
|
Das ganze geht so in den Ausgabepuffer. Der Ausgabepuffer wird der Variable $ausgabe zugewiesen. Der Ausgabepuffer wird geleert, und die Ausgabepufferung wird abgeschalten.
$ausgabe wird zurückgegeben. Und schliesslich dann in test.php mit echo ausgegeben...
mfg
Mogria
Kommentare
Zurück zur Übersicht
Autor Mogria
|
|
|
|