[PHP] template {tokens} vervangen door echte content

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
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:
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."


Acties:
  • 0 Henk 'm!

Verwijderd

Je roept nu dus eigenlijk het volgende aan:

str_replace ( 'piet', 'henk' );

Ok, 'piet' moet dus worden veranderd in 'henk'. Het lijkt me handig als je ook nog even een string als argument meegeeft waarin die verandering moet plaatsvinden. ;)

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
|:( Pas toen ik gisteravond al in bed lag, bedacht ik me hetzelfde. We zullen het maar op verstrooidheid houden B) Dank je!

[ Voor 4% gewijzigd door Reveller op 06-03-2005 14:35 ]

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


Acties:
  • 0 Henk 'm!

  • Taro
  • Registratie: September 2000
  • Niet online

Taro

Moderator General Chat / Wonen & Mobiliteit
Reveller schreef op zondag 06 maart 2005 @ 14:35:
|:( Pas toen ik gisteravond al in bed lag, bedacht ik me hetzelfde. We zullen het maar op verstrooidheid houden B) Dank je!
Ik heb vaak op mijn werk dat ik urenlang naar iets zit te staren, de volgende ochtend onder de douche schiet de oplossing mij ineens te binnen en dan klopt het later ook nog ;)

Replace fear of the unknown with curiosity | 54 kWh thuisaccu's | Tesla Model Y LR & Model 3 SR+ | Totaal 190 kWh opslag | 10.660 Wp zonnepanelen