Template
Kan iemand mij helpen?? Alvast bedankt!!!
http://smarty.php.net/
manual: http://smarty.php.net/manual/en/
voorbeelden: http://smarty.php.net/sampleapp/sampleapp_p1.php
manual: http://smarty.php.net/manual/en/
voorbeelden: http://smarty.php.net/sampleapp/sampleapp_p1.php
Ik heb al de volgende functies:
- Template zetten
- Bestanden includen
- Vervangen van {NAAM}, enz.
- Error
- ...
Maar ik wil dus ook met blocks werken. Alleen snap ik niet hoe dat werkt. Ik heb wel een variabel ($this->pagina) met de hele pagina.
edit: Ik maak mijn eigen template parser, had ik er misschien even bij moeten zetten :D
Gewijzigd op 22/04/2005 17:04:00 door Willem
voorbeeldje:
template bestand:
php bestand
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
if( isset($v['lijstje']) && is_array($v['lijstje']) ){
$r = '';
reset($v['lijstje']);
while(list($k,$a) = each($v['$k']))
$r .= 'naam:'.( isset($a['naam']) ? $a['naam'] : '' ).' achternaam: '.( isset($a['achternaam']) ? $a['achternaam'] : '' );
$v['lijstje'] = $r;
}else
$v['lijstje'] = 'naam:{.naam} achternaam: {.achternaam}';
return ( isset($v['titel']) ? $v['titel'] : '' ).'bladiebla'.( isset($v['lijstje']) ? $v['lijstje'] : '' );
?>
if( isset($v['lijstje']) && is_array($v['lijstje']) ){
$r = '';
reset($v['lijstje']);
while(list($k,$a) = each($v['$k']))
$r .= 'naam:'.( isset($a['naam']) ? $a['naam'] : '' ).' achternaam: '.( isset($a['achternaam']) ? $a['achternaam'] : '' );
$v['lijstje'] = $r;
}else
$v['lijstje'] = 'naam:{.naam} achternaam: {.achternaam}';
return ( isset($v['titel']) ? $v['titel'] : '' ).'bladiebla'.( isset($v['lijstje']) ? $v['lijstje'] : '' );
?>
Ik kan de nieuwste versie van dit script (http://www.phphulp.nl/php/scripts/5/320/) binnenkort hier wel even neerzetten. Dan kun je zien hoe ik dit probleem heb opgelost.
Gewijzigd op 22/04/2005 19:50:00 door Martijn B
<!-- START : blok_naam -->
<p>Hier de inhoud van het blok, bijvoorbeeld een formulier of foutmelding.</p>
<!-- EINDE : blok_naam -->
Zo'n blok staat dan gewoon in de template. Alleen kun je aangeven of het moet worden weergegeven, anders wordt het verwijderd.
Ik heb ondertussen al wat geprobeerd en ik heb het volgende:
> Functie om de comment-tags om een blok te verwijderen.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->(.+?)<!-- EINDE : ".$blok_naam." -->/si", "\\1", $this->pagina);
}
?>
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->(.+?)<!-- EINDE : ".$blok_naam." -->/si", "\\1", $this->pagina);
}
?>
> In de functie waar de pagina wordt gemaakt worden alle bloks verwijderd waar de comment-tags nog omstaan.
Code (php)
1
2
3
2
3
<?php
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->/si", "", $this->pagina);
?>
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->/si", "", $this->pagina);
?>
Dit werkt! Alleen heb ik een probleem. Als een blok wordt verwijderd blijft er een witregel in de bron-code. Ook als de comment-tags worden verwijderd krijg je een witregel. De content ziet er dan bijvoorbeeld zo uit:
<div id="content">
Dit is de content!
<br /> Blok 1
</div>
Onder <br /> Blok 1 stond eerst blok 2. Maar omdat die is verwijderd komen er witregels.
Ik hoop dat dit een beetje duidelijk is :P
Hoe kun je dus voorkomen dat er witregels komen?
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$this->pagina = preg_replace"/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);
?>
$this->pagina = preg_replace"/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);
?>
Gewijzigd op 22/04/2005 22:46:00 door Martijn B
Hier is de hele code van de template parser. In de error functie zit volgens mij nog een foutje. Als de hoofd-template niet kan worden geopend krijg je geen foutmelding. Misschien weet je hoe dat komt? Verder werkt het goed. Als je verder nog fouten ziet...
Code (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
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
<?php
class template
{
var $pagina = "";
var $error = array();
// De template zetten
function template($bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!$lees_template = fopen($bestand, "r"))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> kon niet worden gelezen!";
}
// De template openen en de inhoud in $this->pagina zetten
else
{
$this->pagina = fread($lees_template, filesize($bestand));
fclose($lees_template);
}
}
// Een sub-template invoegen
function invoegen($invoeg_naam, $bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Sub-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!fopen($bestand, "r"))
{
$this->error[] = "Sub-template <b>".$bestand."</b> kon niet worden gelezen!";
}
else
{
// De sub-template openen en de invoeg naam in $this->pagina met de inhoud vervangen
ob_start();
include($bestand);
$this->pagina = str_replace("<!-- INVOEGEN : ".$invoeg_naam." -->", ob_get_contents(), $this->pagina);
ob_end_clean();
}
}
// Plaatshouders vervangen
function vervang($plaatshouder, $vervangingswaarde)
{
$this->pagina = str_replace("{".$plaatshouder."}", $vervangingswaarde, $this->pagina);
}
// Blokken zetten
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->[\r\n]*(.+?)<!-- EINDE : ".$blok_naam." -->[\r\n]*/si", "\\1", $this->pagina);
}
// Geef de inhoud van de pagina
function maak_pagina()
{
// Kijken of $this->pagina is gevuld
if($this->pagina == "")
{
$this->error[] = "Er is een lege hoofd-template opgegeven!";
}
// Als er errors zijn
elseif(count($this->error) != 0)
{
echo "<h1>Fout</h1>\n<ul>\n";
foreach($this->error as $error)
{
echo "<li>".$error."</li>\n";
}
echo "</ul>";
}
// Als alles goed is
else
{
// Blokken verwijderen met comment-tags erom
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);
// Niet vervangde plaatshouders verwijderen
$this->pagina = preg_replace("/\{(.*)\}/", "", $this->pagina);
// De pagina weergegeven
echo $this->pagina;
}
}
}
?>
class template
{
var $pagina = "";
var $error = array();
// De template zetten
function template($bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!$lees_template = fopen($bestand, "r"))
{
$this->error[] = "Hoofd-template <b>".$bestand."</b> kon niet worden gelezen!";
}
// De template openen en de inhoud in $this->pagina zetten
else
{
$this->pagina = fread($lees_template, filesize($bestand));
fclose($lees_template);
}
}
// Een sub-template invoegen
function invoegen($invoeg_naam, $bestand)
{
// Kijken of het bestand bestaat
if(!file_exists($bestand))
{
$this->error[] = "Sub-template <b>".$bestand."</b> bestaat niet!";
}
// Kijken of het bestand kan worden gelezen
elseif(!fopen($bestand, "r"))
{
$this->error[] = "Sub-template <b>".$bestand."</b> kon niet worden gelezen!";
}
else
{
// De sub-template openen en de invoeg naam in $this->pagina met de inhoud vervangen
ob_start();
include($bestand);
$this->pagina = str_replace("<!-- INVOEGEN : ".$invoeg_naam." -->", ob_get_contents(), $this->pagina);
ob_end_clean();
}
}
// Plaatshouders vervangen
function vervang($plaatshouder, $vervangingswaarde)
{
$this->pagina = str_replace("{".$plaatshouder."}", $vervangingswaarde, $this->pagina);
}
// Blokken zetten
function blok($blok_naam)
{
$this->pagina = preg_replace("/<!-- START : ".$blok_naam." -->[\r\n]*(.+?)<!-- EINDE : ".$blok_naam." -->[\r\n]*/si", "\\1", $this->pagina);
}
// Geef de inhoud van de pagina
function maak_pagina()
{
// Kijken of $this->pagina is gevuld
if($this->pagina == "")
{
$this->error[] = "Er is een lege hoofd-template opgegeven!";
}
// Als er errors zijn
elseif(count($this->error) != 0)
{
echo "<h1>Fout</h1>\n<ul>\n";
foreach($this->error as $error)
{
echo "<li>".$error."</li>\n";
}
echo "</ul>";
}
// Als alles goed is
else
{
// Blokken verwijderen met comment-tags erom
$this->pagina = preg_replace("/<!-- START : (.+?) -->(.+?)<!-- EINDE : (.+?) -->[\r\n]*/si", "", $this->pagina);
// Niet vervangde plaatshouders verwijderen
$this->pagina = preg_replace("/\{(.*)\}/", "", $this->pagina);
// De pagina weergegeven
echo $this->pagina;
}
}
}
?>
Weet iemand hoe blocks werken in bijvoorbeeld Template Power?? Daar kun je een block wel 2 keer weergeven.
Alvast bedankt!!