Aplikacije :: Direktorij Stručne Pomoći Lokalnoj Samoupravi :: Dario

Nastanak

Sredinom prvog mjeseca 2006-te počeo sam raditi aplikaciju DSPLS, gotovo klasičnu "direktorij" aplikaciju s malo specifičnim načinom pretraživanja.

Aplikacija je rađena LAMP tehnologijama (verzije: Apache 1.3/Apache 2.0, PHP4.3/PHP5.0, MySQL 4.1/5.0). Inicijalni skup podataka dobiven je iz prethodno korištene MS Access aplikacije.

Logički, aplikaciju sam podijelio u tri cjeline:

Razvoj

Tijekom razvoja primijenjeno je više uzoraka (engl. design pattern-a), uglavnom opisanih u radu Martina Fowler-a: Patterns of Enterprise Application Architecture.

Cijela aplikacija razvijena je na ideji MVC uzorka.

Izgled stranica (engl. View)

Izgled stranica definiran je predlošcima (engl. template), a koristi se Smarty template engine (verzija 2.6.12). Stranice su napravljene prema XHTML 1.0 i CSS 2 specifikacijama. Javascript je korišten minimalno i to isključivo za validaciju podataka unesenih u forme (na strani klijenta). U prvoj verziji Javascript kod nije napisan prema unobtrusive JavaScript preporukama, tj. nije napravljena potpuna separacija sadržaja (engl. content), odnosno XHTML koda i ponašanja (engl. behaviour), odnosno JavaScript-a.

Kod izgleda stranica definiramo strukturu i stil. Strukturu stranice čine zaglavlje (engl. header), glavni dio (engl. body) i podnožje ili završetak stranice (engl. footer). Glavni dio podijeljen je na dvije (na stranicama za koje nije potrebna autorizacija) ili tri kolone (na stranicama za promjenu podataka, gdje je potrebna autorizacija korisnika). Na samu izvedbu strukture najviše su utjecali:

Stil stranica definiran je CSS-om, a pregledavajući Open Source Web Design stranice, napravio sam kombinaciju boja prema Blank Canvas i whompy's Libra.

Napravljen je poseban izgled stranica za ispis na štampačima, gdje se ne prikazuje glavni meni, a sadržaj glavnog dijela proširen je na cijelu širinu stranice.

Stranice su rađene za XHTML 1.0 Transitional, dok su slova kodirana s utf-8.

Izgled stranica kontroliran je u preglednicima Mozilla Firefox 1.5, Internet Explorer 6.0 i Opera 8.52 (u kojoj postoje manja odstupanja u prvoj verziji).

Obrada, spremanje i pretraživanje podataka (engl. Model)

Kao spremište podataka koristi se MySQL verzija 4.1 ili verzija 5.0. Tekstualni podaci spremaju se u latin2 skupu karaktera, prema pravilima za poredak slova (engl. collation) latin2_croatian_ci (nastavak "ci" označava engl. case insensitive, odnosno svejedno je koriste li se velika ili mala slova).

Za pristup bazi podataka koristi se eksterna biblioteka ADOdb (verzija 4.72) koja radi apstrakciju baze na PHP nivou. Kad bi se htjelo promijeniti MySQL s nekom drugom relacionom bazom podataka, trebalo bi obratiti pažnju na:

Autoincrement polja koriste se uglavnom radi osiguranja jednostavne unikatne vrijednosti za primarni ključ (engl. primary key). Format datum/vremena bitan je u dijelu koji radi statističke izvještaje o upitima (koji nije javno dostupan), a koristi se ISO 8601 format (yyyy-mm-dd hh:mm:ss). Konverzija hrvatskih znakova u druge formate može biti vremenski zahtjevna.

Model sam podijelio na dva dijela:

dio koji pristupa bazi (preko ADOdb-a)
koji čine ActiveRecord i tvornica (engl. factory) ActiveRecord-a. Taj dio odvaja gornje slojeve koda od specifičnosti baze podataka. U njemu se nalazi sav SQL kod, uključujući kod za jednostavne CRUD operacije i kod za pretraživanje koji se dinamički generira ovisno o postavljenom upitu. Sav kod za pristup bazi, otvaranje i zatvaranje veze (engl. connection), izvršavanje SQL komandi te prihvat podataka (i meta-podataka) iz RDBMS-a obavlja se u ovom sloju.
dio koji prihvaća podatke unesene putem formi, validira ih i analizira te poziva potrebne procedure za pristup bazi
Svi podaci pristigli zahtjevom moraju biti provjereni (kako bi isključili moguće malverzacije), a najprikladnije mjesto za to je specifični model koji "zna" kakvi podaci su mogući i/ili smisleni u danom kontekstu. Model može kontrolirati semantiku unesenih podataka, za razliku od generičkih validatora koji provjeravaju samo tip podatka. Kad zahtjev prođe provjeru, kontroler može pokrenuti potrebnu akciju (npr. unos pristiglih podataka u bazu).

Prihvat i analiza zahtjeva, autorizacija, pokretanje akcija (engl. Controller)

Implementacije MVC-a u PHP okolini primjenjuju ili Front ili Page Controller, a ja sam se odlučio za Page Controller. Pojednostavljeno, kod Front Controller-a postoji jedinstvena URL adresa (obično index.php) kojoj se putem GET ili POST zahtjeva prosljeđuju potrebni parametri na osnovu kojih Front Controller odlučuje koju akciju treba pokrenuti. Page Controller samim nazivom stranice ograničava moguće akcije, tako da je pojedini Page Controller bitno jednostavniji (od Front Controller-a).

Isključimo iz razmatranja URL adrese ostalih resursa (slika, ikona, javascript koda, CSS datoteka, ...), koji se prosljeđuju svakom prema zahtjevu, bez posebnih kontrola i dodatnih akcija u PHP kodu. Kod zahtjeva koji traže takve resurse, HTTP server (ovdje Apache) može, prema svojoj konfiguraciji, poduzimati neke akcije (poput slanja "Content-Type", "Last-Modified" i sličnih HTTP header informacija).

Svaka PHP stranica počinje analizom radne okoline i zahtjeva koji ju je pokrenuo. U prvom dijelu Page Controller-a, koji je HTTP server pokrenuo na osnovu URL adrese, definiraju se parametri poput:

Ovdje se učitavaju i instanciraju model, view i controller objekti. Kako je broj mogućih akcija, definiranih u prvoj verziji aplikacije, relativno mali, kod samih akcija nalazi se u okviru zasebnih metoda kontroler objekta. Ako se bude radila verzija 2.0, ovo je jedna od točaka koje su kandidati za preradu (engl. refactoring). Kod složenijih sustava, primijenio bih Command uzorak.

Kontrola kvalitete

Razvojem Agile i Extreme Programming metoda, postalo je jasno kako su razne metode testiranja koda nužnost. Danas (početkom 2006-te godine) primjenjujemo testiranje pojedinih dijelova (engl. Unit Testing) aplikacije, za što sam koristio SimpleTest verziju 1.0 Marcusa Baker-a.

Vrlo često sam kodiranje novih funkcija, metoda i klasa počeo nakon što sam definirao sučelje (parametre i povratne vrijednosti) u test kodu (postupak poznat kao definiranje ugovora, engl. contract). Kompletno testiranje pristupa bazi, modela i dijelova zajedničke biblioteke funkcija napravljeno je i korišteno kod internih refactoring-a.

Ovakav pristup, meni osobno, daje puno veće povjerenje u ispravnost napravljenog koda.

Dokumentacija

Sastoji se od nekoliko dijelova:

Programerska dokumentacija nalazi se u PHP kodu, tako da se pomoću phpDocumentor paketa uvijek može generirati jedan od formata (PDF, HTML, ...).

Prestanak mog angažmana na projektu

Dana 2006-03-02 postavljene su stranice direktorija na javno dostupni server. Nakon toga slijedi ispravljanje eventualno primijećenih pogrešaka.

Pogledajte

Naslovna stranica