Volt már olyan, mikor rácsaptatok a fejetekre, hogy „anemjóját, ezen törtem a fejem, miért nem én csináltam meg előbb”? Velem pont ez történt, mikor a PHP | Architect egyik cikkét olvastam.
Írtam én már sablonrendszert PHP-ben (ld. Prím.hu, de egy sokkal jobb rendszert használok a fizetős munkáimban), és mostanság azon törtem a fejemet, miként lehetne magát a PHP-t felhasználni erre.
Pedig az egész bámulatosan egyszerű. Csak néhány alapszabályt (peremfeltételt) határozzunk meg, és máris rájöhetünk a dolog nyitjára:
- Rendszerint HTML-t akarunk használni, tehát férjen be a HTML szabványba. Vagy akármilyen más szövegszabványba.
- Legyenek benne változóbehelyettesítések, de ne legyen túl bonyolult a beszúrásuk.
- Ismerjen vezérlő szerkezeteket is (feltétel, ciklus), de ne legyen túl bonyolult (több soros, kapcsos zárójelek, miegymás).
- Tudjon makrókat, hogy alapvető HTML darabokat be lehessen illeszteni (például csak egy makró hívás legyen a beírómező készítése).
- Lehessen al-sablont beilleszteni.
Az okosabbak máris rávághatják, hogy „de hisz’ ezt mind tudja a PHP”! Mert hogy:
- A PHP alapesetben HTML módban fut, és csak akkor értelmezi a kódot, ha
<?php…?> között van. Ha a program futása közben egyszer csak nem kiíratni akarjuk a kimenetet, hanem pufferbe rakni, azt az ob_start() remekül elkezdi. Mikor a végén pedig meg akarjuk kapni az eredményt (mondjuk egy változóba), akkor az ob_get_contents()-el elmenthetjük, majd törölhetjük is a puffert az ob_end_clean() függvénnyel. Az egészben az a szép, hogy egymásba ágyazva is használhatjuk ezeket a függvényeket, amik majd az al-sablon kezelésekor jól fognak jönni.
- A változóhelyettesítések végtelenül egyszerűek, hiszen a PHP ismeri a rövidített formát.
- A PHP kétféleképpen is ismeri a vezérlési utasításokat. Nézzük meg a nem annyira gyakori formát:
- feltétel:
-
<?if (feltétel):?>
HTML kód
<?elseif (feltétel):?>
HTML kód
<?else:?>
HTML kód
<?endif?>
- ciklus:
-
<?foreach ((array)$tömb as $ciklusváltozó):?>--M;
HTML kód
<?endforeach?>
Ez mind csak ízelítő, a PHP kézikönyv Vezérlési szerkezetek alternatív szintaxisa fejezetében részletesen le van írva a dolog.
- Makrókat kétféleképpen lehet csinálni: vezérlés felől, vagy a sablon felől. A vezérlés felőli makrókat legegyszerűbben plug-in-ként lehet elképzelni (egy megadott interfészt implementáló osztály példányosításával, változóként átadva a sablonkezelőnek), míg a sablon felőliek lehetőségei kissé be vannak korlátozva. Nem lehet osztálymetódus, hiszen osztálydefinícióban nem lehet megszakítani a PHP-t (
?>HTML kód), ráadásul függvénydefiníciót nem lehet alternatív jelöléssel írni, így meg kell maradnunk a kapcsos zárójeleknél.
- Ez sem nagy ördöngösség, ha nem használunk függvényeket a sablonokban, hiszen akkor elég az
include. Persze, itt a legnagyobb baj az, hogy az al-sablont nem lehet a fősablonhoz képest relatíven megcímezni, hiszen minden relatív fájlművelet a meghívott PHP programhoz képest relatív. Így hát legjobb ugyanazt a függvényt meghívni alsablon betöltésekor, mint amit a fősablonnál is meghívtunk.
Most ez lehet, hogy bonyolultnak hangzik, de ebből egy egész remek sablonfeldolgozót lehet összehozni. Én már neki is álltam a saját kódomat megírni. Ha van valami használható, elmesélem a tapasztalataimat.