Pogledajte određenu poruku
Staro 09. 09. 2010.   #13
Goran Rakić
wannabe hacker
Na probnom radu
 
Avatar Goran Rakić
 
Datum učlanjenja: 10.06.2005
Lokacija: Beograd
Poruke: 10
Hvala: 0
0 "Hvala" u 0 poruka
Goran Rakić is on a distinguished road
Pošaljite poruku preko Yahoo za Goran Rakić
Default

Batalio sam Smarty pre nekoliko godina u korist PHP-a kao jezika za pisanje šablona, odnosno za pisanje skripta pogleda (engl. view script). Osnovna namera bila mi je da očistim kontroler (u MVC) od svog suvišnog koda. Kontroler upravlja prijemom zahteva i definiše različite callbackove koji spuste pozive u model aplikacije.

U kodu pogleda sada mogu da definišem sav PHP kod za lepljenje na callback-ove kontrolera i da slobodno koristim PHP za upravljanje izlazom i podacima iz kontrolera (bilo da odgovor na zahtev pravi HTML, CSS ili PDF). Ovim imam bolju razdvojenost slojeva aplikacije ali gubim mogućnost da "dizajner menja šablon". Ne znam da li iko pušta dizajnere da menjaju šablon, pitanje da li i HTML valjan umeju da pišu. Veb dizajner u timu pak razumeće i to malo PHP koda. Ako prihvatimo rad sa komponentama (za RIA) onda se slaganje forme prikaza obavlja u PHP kodu, a ovim to lepo stoji u skripti pogleda, gde i treba.

Smarty mi se u jednom trenutku učinio nepotreban bloat i ograničenje. Ipak i dalje bih preporučio programerima da ga koriste kada im odgovara. Ako govorimo isključivo o veb stranama, sintaksa šablona je lepša u Smarty-ju nego kada se piše u PHP-u. Ja bih se ipak odlučio za eksterni pretprocesor, ali ne znam kako bi se u nekim timovima drugi sa tim uklopili. Smarty ima dokumentovanu sintaksu, široko je poznat, i to je značajna prednost.


Nasleđivanje šablona je odličan pristup koji već neko vreme koristim. Okačio sam izvučen mali kodić iz veće biblioteke kao primer kako se to može ubaciti bez Smartyja.

Osobine:
1) Pogled se izvršava u imenskom prostoru metode render klase fw_ViewRenderer
2) Promenljive prenete kao niz se ubacuju u imenski prostor i tako su dostupne iz šablona. Iz pogleda moguće je pristupiti renderer objektu preko $this
4) Renderer dozvoljava šablonu da odredi šablon koji će da nasledi i definiše blokove koje se prenose nasleđenom šablonu. Blokovi se koriste kao izmenjivi delovi roditeljskog šablona, a mogu biti definisani sa begin..end ili mogu biti učitani preko spoljnog šablona (kao što smo radili sa include)
5) Pri izvršavanju pogleda izvršava se prvo šablon-dete, a potom rekurzivno svi roditeljski šabloni kojima se sada blokovi prenose uz šablonske promenljive (omogućeno prepisivanje)
6) Postoji pretprocesor koji ulepšava i validira sintaksu šablona, ali nije neophodan (ovde je čist PHP kod)
7) Preko male touple-like klase pogled može da definiše i skup HTTP zaglavlja. Pogled nije ograničen na HTML, mada sa nasleđivanjem u binarnim šablonima treba paziti sa proredima oko begin..end.

Pogledajte na: http://gitorious.org/grakic-sandbox/...r/trees/master

tmpl/_base.html je apstraktni šablon koji ima prazan blok central_page. U realnom primeru imali bismo header, footer, left_column,... Osnovna razlika u odnosu na include je da base šablon ne povlači ove delove, on samo definiše njihov raspored i okolni statički HTML kod. Tek šablon koji nasledi base će da odredi sadržaj ovih blokova.

Samo nasleđivanje u kontroleru uopšte ne vidimo, tamo se poziva tmpl/index.html a kako on dalje radi nas ne zanima. Index šablon će definisati sadržaj central_page bloka, a mogli smo i da na tom mestu povučemo include (preko set_block(filename, vars); ).

Poslednja izmena od Goran Rakić : 09. 09. 2010. u 23:33.
Goran Rakić je offline   Odgovorite uz citat