Welkom, Gast. Je bent niet ingelogd
Forum indexPHP & MySQL › [script] Saven.nl Template Engine
Pagina: 1
 
Gepost op zaterdag 7 februari 2009, om 02:49
Saven
Beheerder
6316 posts
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:
C o d e
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 
179 
180 
<?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:
C o d e
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
<?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:
C o d e
1 
2 
3 
4 
5 
6 
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:
C o d e
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/');

// 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.

2 x KRK RP8 G2

Botje

Adverteerder
Gepost op zaterdag 7 februari 2009, om 09:24
Bart
Hoeren :'(
HIV Positive
1542 posts
Goedemorgen

> Error: plaatje kon niet worden geladen <


Gepost op zaterdag 7 februari 2009, om 10:01
sandr
aka Chuck Norris

Ultimate
5312 posts
ok, leuk, ga het wss toch niet gebruiken maar wel geinig gemaakt.
Gepost op zaterdag 7 februari 2009, om 15:35
Stijn
<b>Neuker</b>
Saven Player
792 posts
Mooie code .
kzal er weer even in kijken misschien kan ik wel nog iets vinden ofzo voor en leuke toepassing

dsqfqsdf

Gepost op zaterdag 7 februari 2009, om 19:30
Saven
Beheerder
6316 posts
doe dat

2 x KRK RP8 G2

Gepost op zaterdag 7 februari 2009, om 20:08
sandr
aka Chuck Norris

Ultimate
5312 posts
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):
C o d e
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
<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.
Gepost op zaterdag 7 februari 2009, om 22:24
Sander
Special Member
1431 posts
Dan kan je gewoon foreach gebruiken:
C o d e
1 
2 
3 
4 
5 
<? foreach( $posts as $post ): ?>
Titel: <?=$post'titel' ]?>
<? 
endforeach; ?>

Gepost op zondag 8 februari 2009, om 10:47
sandr
aka Chuck Norris

Ultimate
5312 posts
aha, da's wel handig jah .
Gepost op zondag 8 februari 2009, om 13:47
Saven
Beheerder
6316 posts
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

2 x KRK RP8 G2

Gepost op donderdag 7 april 2011, om 16:15
Basjee
Octo

Ultraspammer
2986 posts
Quote: Saven

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

je selecteerde dit

Pagina: 1
 
Online bezoekers (Woensdag 23 mei 2012, om 16:23)
Er zijn 10 bezoekers online, waarvan 0 ingelogd.
Members ingelogd:
Versie: v4.2.3       Parsetime: 0.05689 seconden       ( disclaimer | regels | contact )
Offertezeker.nl Online Offertes Vergelijken