[PHP] Template conditions (if/endif)

Pagina: 1
Acties:

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Middags,

De afgelopen week heb ik in mijn schaarse spare-time een beginnetje gemaakt met mijn eigen template-parser. Ik weet dat er talloze goede produkten verkrijgbaar zijn, maar ik wil het gewoon zelf doen, te meer omdat ik een aantal ideen heb die ik op mijn manier wil doen :)

Nu werkt dat basis perfect en mijn volgende uitdaging is if/then/else/endif blokje in mijn template te kunnen zetten. Na twee dagen speuren zowel hier als daar (lees : google) kom ik wel veel tegen over dit soort dingen, maar niet hoe je zoiets opzet.

Tevens heb ik de source van Smarty uitgeplozen, maar daar blijkt gewoon dat de statements bijna rechtstreeks als PHP code worden gevoerd aan de PHP-parser zelf.

In eerste instantie wil ik dat dus niet. Wat mijn idee is is om in een template file gewoon te kunnen zeggen
code:
1
2
3
4
5
{if $user.logged_in}
<TD>Je bent ingelogd</TD>
{else}
<TD>Je bent niet ingelogd</TD>
{/if}

Waar begin ik ?

[edit] Misschien wel handig om te vermelden dat ik (nog) geen reg-ex held ben, dus wees voorzichtig met me ;)

SIZE does matter.
"You're go at throttle up!"


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
Misschien wel handig om te vermelden dat ik (nog) geen reg-ex held ben, dus wees voorzichtig met me ;)
Misschien wel handig om dan toch reg-exp te gaan leren, want die ga je beslist nodig hebben...

  • Skinny
  • Registratie: Januari 2000
  • Laatst online: 25-07 18:17
Op maandag 22 april 2002 18:00 schreef Limhes het volgende:

[..]

Misschien wel handig om dan toch reg-exp te gaan leren, want die ga je beslist nodig hebben...
Weet ik, de basics snap ik inmiddels ook wel aardig (denk ik) en als ik een bestaande expression zie, dan kan ik die ook nog wel ontleden.

SIZE does matter.
"You're go at throttle up!"


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

Je kunt het beste beginnen een grammatica te bedenken. Bepaal wanneer iets geevalueerd kan worden, en wanneer het nog meer informatie nodig heeft.

Ga aan de slag aan de hand van een stack ipv alleen maar regexen. Je komt er een eind mee maar het is niet toereikend.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 19-08 19:06
code:
1
2
3
4
5
{if $user.logged_in}
<TD>Je bent ingelogd</TD>
{else}
<TD>Je bent niet ingelogd</TD>
{/if}

Nou, dan kun je toch splitten op {} dmv.
code:
1
2
3
4
5
6
7
8
9
10
11
if (eregi("\{if (\$[^\}]+)\}([^\{\}]+)\{else\}([^\{\}]+)\{/if\}", $sHelePaginaInEenVar, $regs))
{
  eval("if (" . $regs[1] . ")");
  {
    echo $regs[2];
  }
  else
  {
    echo regs[3];
  }
}

Naja ik weet niet of ie echt werkt, nl.:
1. weet niet of je accolades moet escapen, maar dat maakt opzich ook niet veel uit
2. ik weet niet of de eval/if combinatie goed werkt, maar anders is er nog een mogelijkheid die hetzelfde doet, iets van ${$var} ofzo maar ken de syntax niet uit me kop

[edit] je moet er sowieso nog een beetje aan sleutelen, aangezien hij bijvoorbeeld nog niet print wat voor en na 't if/else statement staat

  • tomato
  • Registratie: November 1999
  • Niet online
Ik zou het niet helemaal met regexen op gaan lossen, zeker als je meer functionaliteit wilt gaan toevoegen wordt het dan erg ingewikkeld (denk bijvoorbeeld aan geneste constructies ed).

Ik zou de string denk ik echt gaan parsen. Zoiets dus:
code:
1
2
3
4
5
6
7
8
9
10
11
12
$index = 0;

do {

   if ($s[$index]) == '{') {


   } else if ($s[$index]) == '}') {

   }

} while (++$index < strlen($s));

Maar de uitwerking mag je zelf bedenken :)


[edit]
Ik zou geen eval() gebruiken, veiligheid is dan nog ver te zoeken. Het grootste voordeel van een apart template systeem over PHP zelf heen valt dan zo'n beetje weg.
Pagina: 1