Het CMS'je waar ik mee bezig ben zet ik graag zo modulair mogelijk op. Op dit moment ben ik bezig met de templates. Het idee is dat de gebruiker (met juiste rechten) in een tekstarea de template kan aanpassen. Om toegang te krijgen tot bepaalde content onderdelen (vast of variabel) heeft hij de beschikking over een aantal macro's. Elke module (bij mij is elke module een apart bestand) kan macro's ter beschikking stellen aan het systeem. Bijvoorbeeld:
Ik haal de template met de {macro's} op uit de database en doorloop deze met de array welke alle gedefinieerde macro's bevat:
In werkelijkheid gaat het wat geavanceerder maar het komt hier wel op neer en het werkt perfect.
Het probleem hierbij was alleen dat als iemand bijvoorbeeld een artikel schreef en in dit artikel een overzicht wilde geven van de laatste 5 forum reakties, dit niet werkte. De {bodytext} macro werd in de template immers vervangen door het artikel en de {forum_last} macro in het artikel werd niet geparsed.
Dus heb ik de parse-functie recursief gemaakt, zodat eerst {bodytext} en daarna {forum_last} vervangen werd door de werkelijke inhoud. Ik zit nu alleen met een nieuw probleem waar ik mijn hoofd al een tijd over breek: als iemand een {bodytext}-macro in een artikel zet, raatk mijn parsertje in een eeuwige loop! Hetzelfde gebeurt als iemand bijvoorbeeld een menu-item aanmaakt met als titel {menu}.
Bepaalde {macro's} leveren dus problemen op als ze binnen bepaalde andere {macro's} worden gebruikt. Mijn vraag is dus hoe ik (binnen mijn PHP) aangeef welke macro's wanneer wel en wanneer niet geparsed mogen worden. En is zo'n systeem uiteindelijk wel te onderhouden als je 30 macro's ofzo hebt?
Hoe lossen jullie dit probleem op? ("Ik laat mijn klanten nooit zelf aan de templates werken" is niet de oplossing die ik zoek
)
[off_topic]p.s - is het niet veel logischer om de textarea van GoT waar je je bericht intikt als lettertype courier mee te geven aangezien veel van ons code intikken? Makkelijker met indenten enzo...[/off_topic]
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| module | macro | callback | output -------+----------------+----------------+------------------------- system | {bodytext} | get_body() | artikel uit de database | {trail} | cookie_trail() | cookie > crumb > trail | {menu,2} | get_menu() | html list met menu items -------+----------------+----------------+------------------------- forum | {forums} | get_forums() | html list met alle fora | {forum_last,5} | forum_last(5) | laatste 5 forum reakties -------+----------------+----------------+------------------------- user | {user_last} | user(lastname) | achternaam van ingelogde | | | gebruiker | {loginbox} | login_form() | login form -------+----------------+----------------+------------------------- etc... | | | | | | |
Ik haal de template met de {macro's} op uit de database en doorloop deze met de array welke alle gedefinieerde macro's bevat:
code:
1
| $template = str_replace('{trail}', cookie_trail(), $template); |
In werkelijkheid gaat het wat geavanceerder maar het komt hier wel op neer en het werkt perfect.
Het probleem hierbij was alleen dat als iemand bijvoorbeeld een artikel schreef en in dit artikel een overzicht wilde geven van de laatste 5 forum reakties, dit niet werkte. De {bodytext} macro werd in de template immers vervangen door het artikel en de {forum_last} macro in het artikel werd niet geparsed.
Dus heb ik de parse-functie recursief gemaakt, zodat eerst {bodytext} en daarna {forum_last} vervangen werd door de werkelijke inhoud. Ik zit nu alleen met een nieuw probleem waar ik mijn hoofd al een tijd over breek: als iemand een {bodytext}-macro in een artikel zet, raatk mijn parsertje in een eeuwige loop! Hetzelfde gebeurt als iemand bijvoorbeeld een menu-item aanmaakt met als titel {menu}.
Bepaalde {macro's} leveren dus problemen op als ze binnen bepaalde andere {macro's} worden gebruikt. Mijn vraag is dus hoe ik (binnen mijn PHP) aangeef welke macro's wanneer wel en wanneer niet geparsed mogen worden. En is zo'n systeem uiteindelijk wel te onderhouden als je 30 macro's ofzo hebt?
Hoe lossen jullie dit probleem op? ("Ik laat mijn klanten nooit zelf aan de templates werken" is niet de oplossing die ik zoek
[off_topic]p.s - is het niet veel logischer om de textarea van GoT waar je je bericht intikt als lettertype courier mee te geven aangezien veel van ons code intikken? Makkelijker met indenten enzo...[/off_topic]
[ Voor 17% gewijzigd door Reveller op 17-05-2005 22:30 ]
"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."