De aanleiding voor dit topic is dat bezig ben met een site in PHP. Hierin wil ik in principe zo flexibel mogelijk zijn in het presenteren van mijn content. De site moet op basis van een gebruikersinstelling iig radicaler kunnen veranderen dan een stylesheet switch. Daarmee kom je al snel uit op een template systeem. Een eerste versie van dat systeem is inmiddels werkzaam, er blijven echter een aantal fundamentele vragen over waarover ik graag jullie mening zou hebben.
1. Op dit moment gaan we voor de stricte scheiding tussen content en logica. In een template kunnen slechts variabelen (al dan niet in een loop) ge-echoed worden. In sommige gevallen zou je echter alleen output willen geven als er daadwerkelijk gegevens zijn. Bijvoorbeeld een menu met submenu items... neem een menu met 2 lagen:
Het eerste hoofditem heeft een aantal subitems, het tweede item niet. Als ik dit in een template wil vangen dan wordt dat iets als:
De problematische regels zijn gemarkeerd met een '#'. Wanneer er geen submenu-items zijn, dan worden deze regels zinloos weergegeven.
Twee oplossingen komen in mij op:
1. Bouw logica in je template systeem om conditioneel blokken code uit te voeren
2. Bouw syntax in het template systeem om regels alleen aan begin / eind van een loop uit te voeren.
>>De vraag is hoe jullie dit zouden oplossen...
2. De tweede vraag heeft minder verhaal nodig. Maar zelfs met louter echo-statements op basis van het template kan je in het template de business-logic van de site verzieken. Formulieren worden immers door het templatesysteem weergegeven. Hoe hard ik ook roep dat $data[target] een specidieke waarde heeft, in een template kan de hele logica van de site overhoop gehaald worden door het formulier naar het verkeerde script te posten en wat waarden te wisselen/hard in te kloppen. Tot zover de scheiding tussen content en logica...
Wederom wat eigen oplossingen...
1. <form> tags in zijn volledigheid genereren in de logica-laag, verdere <form> tags uit templates strippen. Anders zou men door nesting nog wat kunnen zieken. Het risico van het veranderen van velden blijft, maar dat is iets makkelijker te checken...
2. Het hele formulier vanuit de logica-laag genereren en alles tussen <form></form> in een template negeren.
3. Het template valideren alvorens de data erin te sturen.
Vertrouw je je templatebouwers dan niet? Mja, genoeg zelfvertrouwen
. Maar het gaat hier min of meer om het principe...
>>In elk geval wil ik graag weten hoe men hier omgaat met die zaken waar content en logica moeilijk te scheiden zijn...
1. Op dit moment gaan we voor de stricte scheiding tussen content en logica. In een template kunnen slechts variabelen (al dan niet in een loop) ge-echoed worden. In sommige gevallen zou je echter alleen output willen geven als er daadwerkelijk gegevens zijn. Bijvoorbeeld een menu met submenu items... neem een menu met 2 lagen:
HTML:
1
2
3
4
5
6
7
8
9
| <ul id="menu"> <li><a href="foo.html">hoofditem1</a> <ul class="submenu"> <li><a href="foo1.html">subitem1</a></li> <li><a href="foo2.html">subitem2</a></li> </ul> </li> <li><a href="bar.html">hoofditem2</a></li> </ul> |
Het eerste hoofditem heeft een aantal subitems, het tweede item niet. Als ik dit in een template wil vangen dan wordt dat iets als:
code:
1
2
3
4
5
6
7
8
9
10
11
| <ul id="menu"> <!-- tplsyntax, start loop MENU --> <li><a href="{href}">{name}</a> # <ul class="submenu"> <!-- tplsyntax, start loop SUBMENU --> <li><a href="href">{name}</a></li> <!-- tplsyntax, end loop SUBMENU --> # </ul> </li> <!-- tplsyntax, end loop MENU --> </ul> |
De problematische regels zijn gemarkeerd met een '#'. Wanneer er geen submenu-items zijn, dan worden deze regels zinloos weergegeven.
Twee oplossingen komen in mij op:
1. Bouw logica in je template systeem om conditioneel blokken code uit te voeren
2. Bouw syntax in het template systeem om regels alleen aan begin / eind van een loop uit te voeren.
>>De vraag is hoe jullie dit zouden oplossen...
2. De tweede vraag heeft minder verhaal nodig. Maar zelfs met louter echo-statements op basis van het template kan je in het template de business-logic van de site verzieken. Formulieren worden immers door het templatesysteem weergegeven. Hoe hard ik ook roep dat $data[target] een specidieke waarde heeft, in een template kan de hele logica van de site overhoop gehaald worden door het formulier naar het verkeerde script te posten en wat waarden te wisselen/hard in te kloppen. Tot zover de scheiding tussen content en logica...
Wederom wat eigen oplossingen...
1. <form> tags in zijn volledigheid genereren in de logica-laag, verdere <form> tags uit templates strippen. Anders zou men door nesting nog wat kunnen zieken. Het risico van het veranderen van velden blijft, maar dat is iets makkelijker te checken...
2. Het hele formulier vanuit de logica-laag genereren en alles tussen <form></form> in een template negeren.
3. Het template valideren alvorens de data erin te sturen.
Vertrouw je je templatebouwers dan niet? Mja, genoeg zelfvertrouwen
>>In elk geval wil ik graag weten hoe men hier omgaat met die zaken waar content en logica moeilijk te scheiden zijn...
Regeren is vooruitschuiven