Mijn website draait op een heel simpel template systeempje: ik haal de template op uit de database, en vervang een aantal {tokens} door de echte content:
Omdat dit met meer tokens al snel onduidelijk wordt, heb ik er een array van gemaakt:
Nu ben ik bezig het template systeem wat uitbreiden door meer geavanceerde tokens te ondersteunen, zoals {comments, 5} (>> haalt de laatste 5 comments op uit de database):
Probleem: ik ben op zoek naar een generieke manier om de {tokens} te vervangen door de goede content. In werkelijkheid bestaat mijn website uit verschillende modules. Aan het begin van de applicatie zal ik alle modules aanroepen om te kijken of zij {tokens} willen toevoegen aan de $tokens array. Onderaan de applicatie heb ik de $tokens array gevuld en kan deze loslaten op de template. Dat is in ieder geval de bedoeling. Ik heb nu dit:
Of het mooi is, daar kun je over twister (graag!), maar het gaat mij vooral om de vraag waarom dit niet werkt. Ik krijg telkens de voudtmeldingen "Wrong parameter count for str_replace()" en "Wrong parameter count for preg_replace_callback()". Wie kan mij uitleggen waar het fout gaat?
PHP:
1
2
3
4
5
| $template = '<html><body>{menu}<br>{bodytext}</body></html>'; $template = str_replace('{menu}', get_menu(), $template); $template = str_replace('{bodytext}', 'string!', $template); echo $template; |
Omdat dit met meer tokens al snel onduidelijk wordt, heb ik er een array van gemaakt:
PHP:
1
2
3
4
| $tags = array('{menu}', '{bodytext}'); $repl = array(get_menu(), 'string!'); echo str_replace($tags, $repl, $template); |
Nu ben ik bezig het template systeem wat uitbreiden door meer geavanceerde tokens te ondersteunen, zoals {comments, 5} (>> haalt de laatste 5 comments op uit de database):
PHP:
1
| preg_replace_callback('/{comments\s*,\s*(\d+)\s*}/', 'comments', $template); |
Probleem: ik ben op zoek naar een generieke manier om de {tokens} te vervangen door de goede content. In werkelijkheid bestaat mijn website uit verschillende modules. Aan het begin van de applicatie zal ik alle modules aanroepen om te kijken of zij {tokens} willen toevoegen aan de $tokens array. Onderaan de applicatie heb ik de $tokens array gevuld en kan deze loslaten op de template. Dat is in ieder geval de bedoeling. Ik heb nu dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $tokens[0] = array('method' => 'str_replace', 'token' => '{menu}', 'replace' => get_menu()); $tokens[1] = array('method' => 'str_replace', 'token' => 'bodytext', 'replace' => 'string!'); $tokens[2] = array('method' => 'preg_replace_callback', 'token' => '/{comments\s*,\s*(\d+)\s*}/', 'replace' => 'news'); foreach ($tokens as $token) { $output.= call_user_func_array($token['method'], array($token['token'], $token['replace'])); } echo $output; |
Of het mooi is, daar kun je over twister (graag!), maar het gaat mij vooral om de vraag waarom dit niet werkt. Ik krijg telkens de voudtmeldingen "Wrong parameter count for str_replace()" en "Wrong parameter count for preg_replace_callback()". Wie kan mij uitleggen waar het fout gaat?
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."