Template parser?
Ik zit met een (voor mij in ieder geval) ingewikkeld probleem.
Ik ben inmiddels vrij gevorderd met php, maar tot nu toe heb ik altijd de html-code ín mijn php-codes staan.
Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$result = mysql_query($sql);
echo '<table><tr><th>Id</th><th>Naam</th></tr>';
while($row = mysql_fetch_array($result))
{
echo '<tr><td>'.$row["id"].'</td><td>'.$row["naam"].'</td></tr>
}
echo '</table>';
?>
$result = mysql_query($sql);
echo '<table><tr><th>Id</th><th>Naam</th></tr>';
while($row = mysql_fetch_array($result))
{
echo '<tr><td>'.$row["id"].'</td><td>'.$row["naam"].'</td></tr>
}
echo '</table>';
?>
Nu wil ik eigenlijk overstappen naar een 'template-parser' waarmee je de html-codes en de php-codes gescheiden kunt houden. Dit zou (en volgens mij is dat ook zeker zo) een stuk overzichtelijker moeten werken.
Dan zou je (html-code) zoiets worden:
Code (php)
1
2
3
4
2
3
4
<table>
<tr><th>Id</th><th>Naam</th></tr>
<tr><td>{id}</td><td>{naam}</td></tr>
</table>
<tr><th>Id</th><th>Naam</th></tr>
<tr><td>{id}</td><td>{naam}</td></tr>
</table>
(Nu is dit in principe een slecht voorbeeld omdat je met een foreach in je html code moet werken die een php array (van te voren gemaakt) moet uitlezen (heb ik gehoord :P). Maar het gaat dus om de { en } waartussen je een 'php-variabele' kunt zetten?
Nu heb ik op het internet al wat gezocht, en daar is inmiddels dit uitgekomen:
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
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
<?php
class templateParser
{
var $output;
function __construct($template, $page)
{
if(file_exists('templates/'.$template))
{
$this->output = file_get_contents('templates/'.$template);
}
else
{
die('The template '.$template.' could not be found...');
}
}
function parseTemplate($tags = array())
{
if(count($tags) > 0)
{
foreach($tags as $tag=>$data)
{
if(file_exists('php/'.$data))
{
$data = $this->parseFile('php/'.$data);
$this->output = str_replace('{'.$tag.'}', $data, $this->output);
}
else
{
$this->output = str_replace('{'.$tag.'}', $data, $this->output);
}
}
}
else
{
die('No tags were provided for replacement...');
}
}
function parseFile($file)
{
ob_start();
include($file);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
function display()
{
return $this->output;
}
}
?>
class templateParser
{
var $output;
function __construct($template, $page)
{
if(file_exists('templates/'.$template))
{
$this->output = file_get_contents('templates/'.$template);
}
else
{
die('The template '.$template.' could not be found...');
}
}
function parseTemplate($tags = array())
{
if(count($tags) > 0)
{
foreach($tags as $tag=>$data)
{
if(file_exists('php/'.$data))
{
$data = $this->parseFile('php/'.$data);
$this->output = str_replace('{'.$tag.'}', $data, $this->output);
}
else
{
$this->output = str_replace('{'.$tag.'}', $data, $this->output);
}
}
}
else
{
die('No tags were provided for replacement...');
}
}
function parseFile($file)
{
ob_start();
include($file);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
function display()
{
return $this->output;
}
}
?>
En dan heb je een 'template.html', waarin alle {var} op de juiste plek in de html staan, en je hebt een php bestand die al die variabelen in gaat vullen m.b.v. die klasse:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
require_once('template-parser.php');
$template = new templateParser('template.php');
$tags = array(
'title' => 'Dit is de titel',
'header' => 'header.php',
'content' => 'content.php'
);
$template->parseTemplate($tags);
echo $template->display();
?>
require_once('template-parser.php');
$template = new templateParser('template.php');
$tags = array(
'title' => 'Dit is de titel',
'header' => 'header.php',
'content' => 'content.php'
);
$template->parseTemplate($tags);
echo $template->display();
?>
Maar, nu heb ik eigenlijk twee vragen:
1. Ik wil dus graag 'losse' templates gebruiken voor bijvoorbeeld een 'profiel' pagina, maar ik wel daarnaast ook nog een LOS 'layout' bestand, waarin de html code staat, die altijd hetzelfde is, zoals een header enzo, maar waar wél php codes in voor komen...
Weet iemand hoe ik dit moet doen?
2. Hoe zit het met een foreach in html codes om de while-lus uit php te vervangen en hoe het zit met die array enzo...?
Alvast heel erg bedankt...
Gewijzigd op 01/01/1970 01:00:00 door Igor
Kan ik met smarty hetgeen wat ik wil bereiken dan? Telkens twee (of eventueel zelfs meerdere) 'template/layout' (html) bestanden en dan met php die {dingen} veranderen?
Ja, op de smarty site staat ook behoorlijke documentatie, moet je maar eens doorlezen.
Ok, ga ik doen. Bedankt :)