Extending Latte
A Latte nagyon rugalmas, és sokféleképpen bővíthető: hozzáadhatsz egyéni szűrőket, funkciókat, címkéket, betöltőket stb. Megmutatjuk, hogyan kell ezt megtenni.
Ez a fejezet a Latte bővítésének különböző módjait ismerteti. Ha a változtatásait különböző projektekben szeretné újra felhasználni, vagy ha meg akarja osztani másokkal, akkor ún. kiterjesztést kell létrehoznia.
Hány út vezet Rómába?
Mivel a Latte kiterjesztésének néhány módja keveredhet, először próbáljuk meg elmagyarázni a köztük lévő különbségeket. Példaként próbáljunk meg egy Lorem ipsum generátort implementálni, amelynek átadjuk a generálandó szavak számát.
A Latte nyelv fő konstrukciója a tag. Egy generátort úgy tudunk megvalósítani, hogy a Latte-t egy új címkével bővítjük:
A tag nagyszerűen fog működni. A generátor tag formájában azonban nem biztos, hogy elég rugalmas, mert nem lehet kifejezésben használni. Egyébként a gyakorlatban ritkán van szükség címkék generálására; és ez jó hír, mert a címkék bonyolultabb módja a bővítésnek.
Oké, próbáljunk meg címke helyett szűrőt létrehozni:
Ismét egy érvényes lehetőség. De a szűrőnek az átadott értéket valami mássá kell átalakítania. Itt a
40
értéket, amely a generált szavak számát jelzi, használjuk a szűrő argumentumaként, nem pedig az
átalakítandó értékként.
Próbáljuk meg tehát a függvényt használni:
Ez az! Ehhez a konkrét példához a függvény létrehozása az ideális kiterjesztési pont. Bárhol meghívhatja, ahol például egy kifejezést elfogadnak:
Szűrők
Hozzon létre egy szűrőt a nevének és bármely PHP-meghívható elemnek, például függvénynek a regisztrálásával:
Ebben az esetben jobb lenne, ha a szűrő kapna egy további paramétert:
A sablonban így használjuk:
Mint látható, a függvény a következő argumentumként a szűrő bal oldalát kapja a pipe |
as the first
argument and the arguments passed to the filter after :
előtt.
Természetesen a szűrőt reprezentáló függvény tetszőleges számú paramétert fogadhat el, és a változó paraméterek is támogatottak.
Ha a szűrő egy karakterláncot ad vissza HTML-ben, akkor megjelölheted, hogy a Latte ne automatikusan (és ezért duplán)
szedje ki. Így elkerülhető a |noescape
megadása a sablonban. A legegyszerűbb, ha a sztringet egy
Latte\Runtime\Html
objektumba csomagoljuk, a másik lehetőség a Contextual
Filters.
Ebben az esetben a szűrőnek biztosítania kell az adatok helyes kikerülését.
Az osztályt használó szűrők
A szűrő definiálásának második módja az osztály használata.
Létrehozunk egy metódust a TemplateFilter
attribútummal:
Szűrő betöltő
Az egyedi szűrők regisztrálása helyett létrehozhat egy úgynevezett betöltőt, amely egy olyan függvény, amelyet a szűrő nevével mint argumentummal hívunk meg, és amely visszaadja a PHP hívhatóságát, vagy nullát.
Kontextuális szűrők
A kontextuális szűrő olyan szűrő, amely az első paraméterként egy objektumot fogad el: Latte\Runtime\FilterInfo, amelyet a klasszikus szűrőkhöz hasonlóan további paraméterek követnek. Ugyanúgy regisztrálódik, maga a Latte ismeri fel, hogy a szűrő kontextuális:
A kontextusszűrők képesek felismerni és megváltoztatni a $info->contentType
változóban kapott
tartalomtípust. Ha a szűrőt klasszikusan egy változó (pl. {$var|foo}
) felett hívjuk meg, a
$info->contentType
nullát fog tartalmazni.
A szűrőnek először azt kell ellenőriznie, hogy a bemeneti karakterlánc tartalomtípusa támogatott-e. Meg is változtathatja azt. Példa egy olyan szűrőre, amely szöveget (vagy nullot) fogad el és HTML-t ad vissza:
Ebben az esetben a szűrőnek biztosítania kell az adatok helyes escapingjét.
Minden olyan szűrő, amelyet blokkok felett használunk (pl. mint a
{block|foo}...{/block}
) kontextusfüggőnek kell lennie.
Funkciók
Alapértelmezés szerint minden natív PHP függvény használható a Latte-ban, hacsak a homokozó nem tiltja le. De definiálhatsz saját függvényeket is. Ezek felülírhatják a natív függvényeket.
Hozzon létre egy függvényt a nevének és bármely PHP hívhatóságának regisztrálásával:
A használat ezután ugyanaz, mint a PHP-funkció hívásakor:
Az osztályt használó függvények
A függvények definiálásának második módja az osztály használata.
Létrehozunk egy metódust a TemplateFunction
attribútummal:
Betöltők
A betöltők felelősek a sablonok betöltéséért egy forrásból, például egy fájlrendszerből. Ezek beállítása a
setLoader()
módszerrel történik:
A beépített betöltők a következők:
FileLoader
Alapértelmezett betöltő. Sablonokat tölt be a fájlrendszerből.
A fájlokhoz való hozzáférés korlátozható az alapkönyvtár beállításával:
StringLoader
Sablonokat tölt be stringekből. Ez a betöltő nagyon hasznos a unit teszteléshez. Kisebb projekteknél is használható, ahol érdemes az összes sablon egyetlen PHP fájlban tárolni.
Egyszerűsített használat:
Egyéni betöltő létrehozása
A Loader egy osztály, amely a Latte\Loader interfészt valósítja meg.
Címkék
A templating motor egyik legérdekesebb funkciója, hogy új nyelvi konstrukciókat definiálhatunk címkék segítségével. Ez egyben egy összetettebb funkcionalitás is, és meg kell értenie, hogyan működik a Latte belsőleg.
A legtöbb esetben azonban nincs szükség a címkére:
- Ha valamilyen kimenetet kell generálnia, használjon helyette függvényt.
- ha valamilyen bemenetet kellene módosítania és visszaadnia, használjon helyette filtert
- ha egy szövegrészletet kellene szerkesztenie, akkor csomagolja be egy
{block}
címkével és egy szűrővel - ha nem kellett volna semmit kiadnia, hanem csak egy függvényt hívnia, hívja meg a
{do}
Ha mégis taget akarsz létrehozni, remek! Minden lényeges tudnivalót megtalálsz a Bővítmény létrehozása című fejezetben.
Fordítói passzusok
A fordítói átmenetek olyan függvények, amelyek módosítják az AST-eket vagy információt gyűjtenek bennük. A Latte-ban például egy homokozót így valósítanak meg: végigjárja egy AST összes csomópontját, megtalálja a függvény- és metódushívásokat, és azokat ellenőrzött hívásokkal helyettesíti.
A címkékhez hasonlóan ez is összetettebb funkcionalitás, és meg kell értenie, hogyan működik a Latte a motorháztető alatt. Az összes lényeges tudnivaló megtalálható a Bővítmény létrehozása fejezetben.