Gebruik van template
Ik heb een template class gemaakt. Daarin zit een functie waarin de inhoud van een html bestand wordt opgehaald, en alle tags (voorbeeld in html tekst: {tag}) worden vervangen door de waardes van variabelen $value.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
foreach ($this->vars as $varname => $value) {
$data = preg_replace("/\{". $varname ."\}/", $value, $data);
}
?>
foreach ($this->vars as $varname => $value) {
$data = preg_replace("/\{". $varname ."\}/", $value, $data);
}
?>
Nu gaat dit goed zolang je elke keer maar 1 variabele hoeft te plaatsen. Maar hoe gaat dit in zijn werk met tabellen of lijsten e.d.? Ik wil het liefst geen keiharde html code (zoals <td> of <option>) in m'n template class hebben.
Heeft iemand tips?
Gewijzigd op 01/01/1970 01:00:00 door Onbekend onbekend
Ik begrijp je niet helemaal, of dat moet aan mij liggen?
... edit
Wellicht dat dit helpt;
Bovenstaande script vervangt elke keer een tag door de waarde van een variabele. Das goed.
Stel het volgende html template voor:
<h2>{PAGE_TITLE}</h2>
<p>Welkom op deze website {USER_NAME}!</p>
<table border=1>
<tr>
<td>{naam}</td>
<td>{adres}</td>
<td>{aantalbewoners}</td>
</tr>
</table>
page_title en user_name worden goed vervangen. Maar de tabel, die bestaat uit meerdere rijen. En het aantal kolommen kan natuurlijk ook variabel zijn.
Ik wil graag weten hoe je kan zorgen dat je in een html template ook tabellen kan vullen.
Gewijzigd op 01/01/1970 01:00:00 door onbekend onbekend
Ik ga wel even kijken...
Edit: zoiets?
In vars heb je dan zoiets $array = array(array('peer'=>'groen', 'citroen'=>'geel'), array('peer'=>'paars', 'citroen'=>'turkoise'));
$template->assign('appel', $array);
en dan in je template {foreach appel}Een peer = {peer} en een citroen = {citroen}{/foreach}
Let wel op dat je zo maar in 1 dimensie een foreach kan doen, dus geen 2 binnen elkaar, maar dit kan zelfs bij smarty volgens mij niet.
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
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
<?php
public function display($data)
{
if(preg_match_all('/\{foreach [a-zA-Z\_]+\}.*\{\/foreach\}/s',$data, $results))
{
foreach($results[0] as $result)
{
$arrayname = substr($result, strpos($result, ' ')+1, strpos($result, '}')-strpos($result, ' ')-1);
if(!isset($this->vars[$arrayname]) || !is_array($this->vars[$arrayname]))
continue;
$inner = substr($result, 14+count($arrayname), strpos($result, '{/foreach}')-14-count($arrayname));
$together = '';
foreach ($this->vars[$arrayname] as $temparray)
{
$tempstr = $inner;
foreach ($temparray as $varname => $value)
$tempstr = preg_replace("/\{". $varname ."\}/", $value, $tempstr);
$together .= $tempstr;
}
$data = str_replace($result, $together, $data);
}
}
foreach ($this->vars as $varname => $value) {
if(is_array($value))
continue;
$data = preg_replace("/\{". $varname ."\}/", $value, $data);
}
echo $data;
}
?>
public function display($data)
{
if(preg_match_all('/\{foreach [a-zA-Z\_]+\}.*\{\/foreach\}/s',$data, $results))
{
foreach($results[0] as $result)
{
$arrayname = substr($result, strpos($result, ' ')+1, strpos($result, '}')-strpos($result, ' ')-1);
if(!isset($this->vars[$arrayname]) || !is_array($this->vars[$arrayname]))
continue;
$inner = substr($result, 14+count($arrayname), strpos($result, '{/foreach}')-14-count($arrayname));
$together = '';
foreach ($this->vars[$arrayname] as $temparray)
{
$tempstr = $inner;
foreach ($temparray as $varname => $value)
$tempstr = preg_replace("/\{". $varname ."\}/", $value, $tempstr);
$together .= $tempstr;
}
$data = str_replace($result, $together, $data);
}
}
foreach ($this->vars as $varname => $value) {
if(is_array($value))
continue;
$data = preg_replace("/\{". $varname ."\}/", $value, $data);
}
echo $data;
}
?>
Gewijzigd op 01/01/1970 01:00:00 door Pim -
Alleen hoe zit dat met deze regex?
Code (php)
1
2
3
2
3
<?php
if(preg_match_all('/\{foreach [a-zA-Z\_]+\}.*\{\/foreach\}/s',$data, $results))
?>
if(preg_match_all('/\{foreach [a-zA-Z\_]+\}.*\{\/foreach\}/s',$data, $results))
?>
Dat stukje in het midden .* kijkt toch naar alle karakters, behalve nieuwe regels enzo? Welk teken kan ik gebruiken zodat ook nieuwe regels zijn toegestaan?
Gewijzigd op 01/01/1970 01:00:00 door onbekend onbekend
Dat is al zo, de s aan het eind van de regex geeft aan dat de punt ook newlines bevat.