Met de bouw van mijn eigen cms stuit ik op een probleem. In de basis werkt mijn (zeer eenvoudige) template systeempje als volgt:
De pagina wordt van boven naar beneden ingelezen, en bij elke [token] wordt een callback functie aangeroepen. Zo pakt token_css() alle relevante stylesheets bij elkaar, maakt er een goede html-string van en retourneert deze naar de template:
Dit gaat goed zolang er geen afhankelijkheid tussen de [tokens] is. Bij [admin_toolbar] komt er een probleem: de token_admin_toolbar() functie retourneert een fixed div bovenaan het scherm met daarin alle administratieve functies die op die pagina van belang zijn, bijvoorbeeld:
Welke knoppen er allemaal in de toolbar moeten komen, gebeurt door de global $buttons te imploderen, zie het volgende vereenvoudigde voorbeeld:
En zie hier het probleem. "Sidecontent" zijn extra stukjes informatie in de zijkolom van de pagina, zoals de productreviews en jobs op deze tweakers pagina.
Dit probleem openbaart zich op veel meer plekken in mijn code. Naarmate ik het aantal [tokens] uitbreid, komt het vaker voor dat er afhankelijkheden tussen de tokens bestaan. Ik zou dus eigenlijk moeten kunnen definieren dat token_toolbar() pas als laatste gaat lopen, of in ieder geval pas na token_sidecontent(). Ik ben bang dat ik het hele systeem van [tokens] van boven naar beneden uitlezen zal moeten omgooien, maar ik snap niet goed hoe.
Mijn vraag aan jullie is dus: hoe worden dit soort "volgorde problemen" van uitvoeren van callback functies in zijn algemeenheid opgelost? En is dat ueberhaupt op te lossen? Want ik kan wel leuk definieren dat token_toolbar() pas na token_sidecontent() moet worden uitgevoerd, maar wat als er een pagina is die NA token_sidecontent() nog een andere token heeft staan die van belang is (bijvoorbeeld [footer])? Want dan wordt de knop 'add/edit footer' weer niet op tijd aan $buttons toegevoegd.
Ik hoop dat ik mijn probleem duidelijk heb uitgelegd.
HTML:
1
2
3
4
5
6
7
8
9
10
11
| <html> <head> <title>[title]</title> [css] </head> <body> [admin_toolbar] [bodytext] [sideboxes] </body> </html> |
De pagina wordt van boven naar beneden ingelezen, en bij elke [token] wordt een callback functie aangeroepen. Zo pakt token_css() alle relevante stylesheets bij elkaar, maakt er een goede html-string van en retourneert deze naar de template:
HTML:
1
2
| <link rel="stylesheet" href="files/style.css" type="text/css" media="screen"> <link rel="stylesheet" href="files/jquery.lightbox.css" type="text/css" media="screen"> |
Dit gaat goed zolang er geen afhankelijkheid tussen de [tokens] is. Bij [admin_toolbar] komt er een probleem: de token_admin_toolbar() functie retourneert een fixed div bovenaan het scherm met daarin alle administratieve functies die op die pagina van belang zijn, bijvoorbeeld:
code:
1
2
3
| +-----------------------------------------------------------+ | edit page | edit sidecontent | edit css | change template | +-----------------------------------------------------------+ |
Welke knoppen er allemaal in de toolbar moeten komen, gebeurt door de global $buttons te imploderen, zie het volgende vereenvoudigde voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
| function token_css($page_id) { global $buttons; $css = invoke_all_content('css', $page_id) // grab all css for this page $buttons[] = (isset($css)) ? 'edit css' : 'add css'; } function token_toolbar() { global $buttons; return implode($buttons); } |
En zie hier het probleem. "Sidecontent" zijn extra stukjes informatie in de zijkolom van de pagina, zoals de productreviews en jobs op deze tweakers pagina.
- Op sommige pagina's is nog geen sidecontent ingevuld. De functie token_sidecontent() zal dan null retourneren. In dat geval moet $buttons worden uitgebreid met een knop 'add sidecontent'
- In het geval er wel sidecontent is gedefinieerd voor deze pagina (bijvoorbeeld: <div>kijk voor meer info op <a href="nu.nl">nu.nl</a></div>), wordt dit geretourneerd. In dat geval moet $buttons worden uitgebreid met een knop 'edit sidecontent'
Dit probleem openbaart zich op veel meer plekken in mijn code. Naarmate ik het aantal [tokens] uitbreid, komt het vaker voor dat er afhankelijkheden tussen de tokens bestaan. Ik zou dus eigenlijk moeten kunnen definieren dat token_toolbar() pas als laatste gaat lopen, of in ieder geval pas na token_sidecontent(). Ik ben bang dat ik het hele systeem van [tokens] van boven naar beneden uitlezen zal moeten omgooien, maar ik snap niet goed hoe.
Mijn vraag aan jullie is dus: hoe worden dit soort "volgorde problemen" van uitvoeren van callback functies in zijn algemeenheid opgelost? En is dat ueberhaupt op te lossen? Want ik kan wel leuk definieren dat token_toolbar() pas na token_sidecontent() moet worden uitgevoerd, maar wat als er een pagina is die NA token_sidecontent() nog een andere token heeft staan die van belang is (bijvoorbeeld [footer])? Want dan wordt de knop 'add/edit footer' weer niet op tijd aan $buttons toegevoegd.
Ik hoop dat ik mijn probleem duidelijk heb uitgelegd.