SVEUČILIŠTE U MOSTARU FAKULTET PRIRODOSLOVNO – MATEMATIČKIH I ODGOJNIH ZNANOSTI MATEMATIKA - INFORMATIKA Ana Raič Razvoj web aplikacije korištenjem PHP MVC frameworka Diplomski rad Mostar, 2014. SVEUČILIŠTE U MOSTARU FAKULTET PRIRODOSLOVNO – MATEMATIČKIH I ODGOJNIH ZNANOSTI MATEMATIKA - INFORMATIKA Razvoj web aplikacije korištenjem PHP MVC frameworka Diplomski rad Mentor: Doc.dr.sc. Goran Kraljević Student: Ana Raič Mostar, rujan 2014. Sadržaj: 1. Uvod..................................................................................................................................... 1 2. Softverski dizajnerski obrasci................................................................................................. 3 3. MVC (Model-View-Controller) ............................................................................................... 7 4. 3.1. Povijest i razvoj ....................................................................................................................... 7 3.2. Model ...................................................................................................................................... 8 3.3. Pogled (View)......................................................................................................................... 10 3.4. Kontroler (Controller) ............................................................................................................ 11 3.5. Prednosti MVC arhitekture.................................................................................................... 11 3.6. Nedostaci MVC arhitekture ................................................................................................... 14 3.7. Varijante Model-View-Controller uzorka .............................................................................. 14 PHP (Personal home page/Hypertekst Pretprocessor) .......................................................... 16 4.1. Razvoj programskog jezika PHP ................................................................................................ 16 4.1.1. 4.1.2. 4.1.3. 4.1.4. 4.1.5. 5. PHP/FI ................................................................................................................................. 16 PHP/FI 2.0 ........................................................................................................................... 17 PHP 3.................................................................................................................................. 17 PHP 4 .................................................................................................................................. 17 PHP 5 .................................................................................................................................. 18 4.2. Kako zapravo radi PHP? ......................................................................................................... 18 4.3. Osnovne karakteristike PHP-a ............................................................................................... 20 4.4. Prednosti PHP-a ..................................................................................................................... 22 4.5. Razvoj velikih aplikacija u PHP-u ........................................................................................... 23 4.6. Usporedba PHP-a s drugim programskim jezicima ............................................................... 25 4.7. Struktura PHP web aplikacije bez korištenja MVC arhitekture ............................................. 26 MVC u web aplikacijama ..................................................................................................... 35 5.1. Framework (radni okvir) ............................................................................................................ 35 5.1.1. 5.1.2. 5.1.3. 5.1.4. 5.2. Definicije frameworka ........................................................................................................ 36 Struktura frameworka ........................................................................................................ 37 Svojstva frameworka .......................................................................................................... 37 Prednosti korištenja frameworka ....................................................................................... 38 Popularni PHP MVC frameworci............................................................................................ 39 5.2.1. 5.2.2. 5.2.3. 5.2.4. 5.2.5. Zend Framework ................................................................................................................. 39 CakePHP Framework .......................................................................................................... 42 CodeIgniter Framework ...................................................................................................... 44 Yii framework...................................................................................................................... 45 Symfony framework ........................................................................................................... 46 6. Primjer web aplikacije ......................................................................................................... 48 6.1. Struktura PHP web aplikacije izgrađene pomodu CodeIgniter-a ............................................... 48 7. Zaključak ............................................................................................................................ 57 8. Literatura............................................................................................................................ 59 Dodatak A: Popis slika ................................................................................................................ 60 Dodatak B: Popis oznaka i kratica ............................................................................................... 61 1. Uvod Današnje web aplikacije u velikom broju slučajeva nude mogućnosti prikazivanja i rada s podacima koji se nalaze trajno pohranjeni unutar baze podataka ili rjeĎe datotečnog sustava. Osim što mogu nuditi funkcionalnosti pregledavanja podataka na različite načine, omogućavaju dodavanje novih, te mijenjanje i brisanje postojećih podataka. Sve spomenute operacije korisnik obavlja kroz grafičko korisničko sučelje (eng. Graphical User Interface – GUI) koje bi trebalo biti izvedeno tako da korisnik što efikasnije i jednostavnije ostvari željeni cilj. S druge strane aplikacija osim korisničkog sučelja najčešće sadržava implementaciju odreĎene poslovne logike i mogućnost pristupa odreĎenom spremištu podataka. U konačnici se tok podataka odvija u oba smjera izmeĎu korisničkog sučelja i spremišta podataka, a posredstvom poslovne logike. Iz navedenog se može zaključiti da različiti logički dijelovi web aplikacije imaju meĎusobno veliki stupanj interakcije i zato ih je potrebno dizajnirati da meĎusobno budu što neovisniji, a da u isto vrijeme pružaju jednostavna i učinkovita sučelja (eng. interface), što je opisano u prvom poglavlju. Da bi sama web aplikacija, kao i programski kod od kojeg je sačinjena, bili što učinkovitiji i kvalitetniji, koriste se uzorci (eng. patterns). Svaki uzorak se odnosi na problem koji se često pojavljuje prilikom razvoja programske podrške, a zatim opisuje način rješavanja tog istog problema. Postavlja se pitanje na koji način dizajnirati funkcionalnosti korisničkog sučelja web aplikacije tako da se spomenuti zahtjevi mogu što jednostavnije implementirati. Jedan od najpoznatijih uzoraka koji ostvaruje tražene zahtjeve je Model-View-Controller, koji odvaja prezentacijsku logiku aplikacije od poslovne logike i samih podataka. Naziv je dobio prema tri osnovne konceptualne komponente od kojih se sastoji. Struktura i način rada ovog uzorka detaljno je opisana u poglavlju 3. Četvrto poglavlje ovog rada bavi se PHP-om (eng. Personal Home Page Tools). To je široko rasprostranjen Open Source skriptni jezik koji se izvršava na strani web servera, a namijenjen je za kreiranje dinamičkih web stranica, te općenito različitih internet aplikacija. PHP je podržan od strane velikog broja platformi (gotovo svih), ali se posebno udomaćio na Unix/Linux platformi. Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na jednu višu, profesionalniju razinu. 1 Radi se o PHP paketima (php framework) koji služe kao alati za brži i sigurniji razvoj internet aplikacija. Njihova namjena je prvenstveno bila da se gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju gradi, problemima organizacije datoteka, klasifikacije objekata i slično. U ovom radu, u petom poglavlju, navedeno je i objašnjeno pet različitih PHP MVC frameworka: Zend, CakePHP, CodeIgniter, Yii i Symfony framework. Praktični dio ovog rada prati razvoj web aplikacije korištenjem PHP MVC CodeIgniter frameworka. Osnovna ideja je pokazati prednosti ovakvog korištenja arhitekture pri pisanju skripti za izradu projekta za iznajmljivanje apartmana na obalama Jadrana u odnosu na arhitekturu koja je korištena pri izradi istog projekta prošle akademske godine, u okviru kolegija Programiranje za internet. Od svih opisanih frameworka, CodeIgniter je odabran zbog svojih visokih performansi, velike zajednice korisnika i jednostavnosti korištenja. 2 2. Softverski dizajnerski obrasci Od početka softverskog inženjerstva četrdesetih godina prošlog stoljeća do danas razvoj softvera konstantno napreduje. Širi se spektar namjene aplikacija i raste njihova složenost. Stalni ciljevi su poboljšanje produktivnosti softverskih inženjera i povećanje kvaliteta aplikacija za krajnjeg korisnika. U početku razvoja kompjutera, programi su direktno ovisili o hardveru koji je bio ugraĎen. Razlikovao se hardver za poslovne i naučne aplikacije. Sustavni softver bio je besplatan, a dobivao se uz računalo budući da je bez softvera računalo bilo beskorisno. Računala su se nalazila u tzv. „mašinskoj sali“, a programeri su rezervirali vrijeme za pristup računalu ili zaduživali operatere za konkretne zadatke. Ulaz u računalo predstavljale su bušene kartice, a izlaz se čekao na pisaču. Bilo kakvo planiranje i upravljanje razvojem softvera bilo je gotovo nemoguće. Zanimljivo je napomenuti da su sve do 1960.-ih godina programeri često bile žene. Prvi programer je zapravo programerka, Ada Byron Lovelace. Ada je bila suradnica Charlesa Babbagea, slavnog izumitelja analitičkog stroja. Inspirirana Babbageovim radom vjerojatno je prva osoba koja je istražila njegove nevjerojatne mogućnosti. Adine bilješke o stroju sadrže ono što se danas smatra prvim algoritmom koji se napravio da bi ga stroj mogao obraditi. Zbog ovoga se i smatra prvom računalnom programerkom te je u njenu čast jedan programski jezik po njoj dobio ime. Muškarci su bili na prestižnijim i bolje plaćenim poslovima – bavili su se hardverom. Hardver se mijenjao jako brzo, i svakih godinu-dvije posao programera bio je prevoĎenje programa na novija računala. Upravo to je potaknulo razvoj softverskih jezika višeg stupnja: FORTRAN, COBOL i ALGOL. Neke tvrtke počele su nuditi uslugu razvoja „custom“ softvera, ali još uvijek nije nitko prodavao softverske pakete. Već u to doba pojavila se ideja o ponovnoj upotrebi dijelova softvera, modularnom programiranju i apstrakciji podataka. Kako je softver bio besplatan, mnoge tvrtke su dobrovoljno davale kataloge sa komponentama za ponovnu upotrebu (npr. IBM-ova grupa SHARE). 3 Razvoj softvera glavni je faktor u razvoju informacijskih tehnologija. Primjena softvera se raširila na sva područja ljudskog djelovanja. Mogućnosti razvoja softvera, pored već postignutih rezultata, i dalje su nezamislive. Razvoj programskih jezika, a posebno jezika četvrte generacije, objektno orijentiranog programiranja te pokušaja stvaranja univerzalnih programskih alata, dovodi do toga da se softver sve više približava korisniku i postaje jednostavniji za upotrebu. Zbog mnoštva gotovih programskih paketa za različite namjene, danas najčešće nije isplativo razvijati svoj softver. Naravno, ostaje potreba za razvojem specifičnih softverskih rješenja za pojedina područja, kao i dodatnih programa, koji predstavljaju nadogradnju već kupljenih softverskih paketa. Razvoj softvera je težak, a razvoj softvera na takav način da se njegovo rješenje može ponovo upotrijebiti još je teže. Mnogi iskusni programeri su imali tih problema i s vremenom su se pojavili zajednički obrasci koji bi pomogli njihovom rješavanju. Christopher Alexander prvi je opisao obrasce na takav način da se mogu primijeniti na razvoj softvera. Rekao je: „Svaki uzorak opisuje problem koji se javlja iznova i iznova u našem okruženju, a zatim opisuje srž rješenja tog problema, ali na takav način da je jedno rješenje moguće koristiti milijun puta, a da nikad to ne uradimo dva puta na isti način“. Pod pojmom softverski produkt podrazumijeva se skup računalnih programa i pripadne dokumentacije, stvoren zato da bi se prodao nekom korisniku. Može biti razvijen za nekog odreĎenog korisnika (bespoke product, customized product) ili općenito za tržište (generic product). Softverski produkt često se kraće naziva softver ili (softverski) sustav. Za današnji softver podrazumijeva se da on mora biti kvalitetan. Preciznije, od softverskog produkta se očekuje da se on odlikuje sljedećim atributima kvalitete: Mogućnost održavanja: Softver se mora moći mijenjati u skladu s promijenjenim potrebama korisnika. Pouzdanost i sigurnost: Softver se mora ponašati na predvidiv način te ne smije izazivati fizičke ili ekonomske štete. Efikasnost: Softver mora imati zadovoljavajuće performanse te treba upravljati strojnim resursima na štedljiv način. Upotrebljivost: Softver treba raditi ono što korisnici od njega očekuju, a sučelje mu treba biti zadovoljavajuće te za njega mora postojati dokumentacija. 4 Softversko inženjerstvo je disciplina koja se bavi svim aspektima proizvodnje softvera. Dakle, softversko inženjerstvo bavi se modelima, metodama i alatima koji su nam potrebni da bi na što jeftiniji način mogli proizvoditi što kvalitetnije softverske produkte. Softversko inženjerstvo može se smatrati znanstvenom disciplinom, ali takoĎer i tehničkom strukom. U oba slučaja, ono je u bliskoj vezi s još dva područja znanja: Računarstvo (computer science): Poznavanje teorijskog računarstva potrebno je softverskom inženjerstvu na sličan način kao što je poznavanje mehanike potrebno strojarskom tehničaru. Sistemsko inženjerstvo (system engineering): Bavi se razvojem složenih sustava koji se sastoje od hardvera, softvera i ljudskih aktivnosti. Softverski inženjer mora svoje softversko rješenje uklopiti u takav složeniji sustav. Softversko inženjerstvo je takoĎer i profesija. U mnogim zemljama softverski inženjeri organizirani su u strukovne udruge koje štite njihova prava, ali donekle i ograničavaju slobodu njihovog djelovanja. Primjeri takvih udruga su ACM, IEEE-CS i British Computer Society. Udruge donose pravila ponašanja za svoje članove. Na web stranici (http://www.acm.org/about/se-code) može se naći etički kodeks softverskih inženjera kojeg su zajednički usvojili ACM i IEEE-CS. Softversko inženjerstvo počelo se razvijati krajem 60-ih godina 20. stoljeća. Sam naziv izgleda da je bio skovan na jednoj NATO konferenciji u Njemačkoj 1968. godine. Disciplina je nastala kao odgovor na takozvanu „softversku krizu“. Naime, pojavom računala treće generacije (na primjer IBM serija 360) stvorila se potreba za složenijim softverom (na primjer multi-tasking operacijski sustav). Pokrenuti razvojni projekti višestruko su premašili planirane troškove i rokove. Vidjelo se da se dotadašnje neformalne tehnike individualnog programiranja ne mogu uspješno „skalirati“ na velike programe gdje sudjeluje veliki broj programera. Osjećala se potreba za metodama razvoja softvera koje bi bile u stanju kontrolirati kompleksnost velikog softverskog projekta. Stanje svijesti iz tih vremena plastično je opisano u čuvenoj knjizi1. Od 60-tih godina 20. stoljeća do danas softversko inženjerstvo prešlo je dug put. Ispočetka su se predlagale metode razvoja softvera oblikovane po analogiji s metodama iz tradicionalnih 1 Brooks F.P.: The Mythical Man Month – Essays on Software Engineering, Anniversary Edition. Addison-Wesley, Reading MA, USA, 1995. 5 tehničkih struka (na primjer mostogradnja). Kasnije se uvidjelo da je softver po mnogočemu specifičan te da zahtjeva drukčije pristupe. Razvijali su se novi programski jezici, bolji načini utvrĎivanja zahtjeva, grafički jezici za modeliranje, formalne metode za specifikaciju i verifikaciju, pouzdaniji načini voĎenja projekata i procjene troškova, alati koji nastoje automatizirati proces razvoja softvera. Zahvaljujući takvom razvoju, softversko inženjerstvo uspjelo je etablirati kao važan dio tehnike i računarstva. Softver se u današnje vrijeme proizvodi daleko predvidljivije i efikasnije nego prije. Ipak, još uvijek postoji širok prostor za poboljšanje. Važna osobina softverskog inženjerstva je da u njemu nema „jednoumlja“ ni jednoobraznosti. Za razliku od matematike gdje se proučavaju nepobitne istine, u softverskom inženjerstvu razvijaju se različite ideje i pristupi koji su često u meĎusobnom nesuglasju. Glavni razlog za takvu raznolikost pristupa je raznolikost samih softverskih produkata – zaista, teško je očekivati da se sve vrste softvera mogu razvijati na isti način. Drugi razlog za raznolikost je činjenica da softversko inženjerstvo još uvijek nije doseglo svoju zrelu fazu – ta disciplina se i ovog trenutka intenzivno razvija, a nove spoznaje revidiraju stare. 6 3. MVC (Model-View-Controller) 3.1. Povijest i razvoj Kako se razvijalo objektno orijentirano programiranje, sve se više ukazala potreba razdvajanja dizajniranja sučelja od ostalih dijelova sustava. Sučelja su dijelovi pomoću kojih komponente sustava meĎusobno komuniciraju. Česte su komunikacije dijelova programa meĎusobno, ali i izmeĎu dijelova programa i ljudi. Za očekivati je da će se dizajn sučelja često mijenjati i prilagoĎavati i ljudima i tehnologiji, i to puno češće nego će se mijenjati sama obrada podataka koja je u pozadini sustava. Zbog toga se odvajanje ova dva dijela sustava pokazalo vrlo praktičnim i ubrzalo je razvoj i održavanje softvera. Još u 1970-tim godinama, profesor Trygve Reenskaug predložio je za upotrebu SmallTalk objektnog jezika arhitekturu Model-View-Controller (MVC), koja je omogućavala razdvajanje sučelja (GUI – Graphical User Interface) od ostalog dijela programa, a od 2009. godine Microsoft je prihvatio taj koncept i razvio MVC okvir kako bi „zaustavio miješanje programske logike i prezentacijske logike“ (Deacon, 2013.) Model-View-Controller (MVC) je obrazac softverske arhitekture. Koristi se u softverskom inženjerstvu za odvajanje pojedinih dijelova aplikacije u komponente ovisno o njihovoj namjeni. MVC dijeli aplikaciju na tri glavne komponente: model, pogled (view) i kontroler (controller). MVC softverski obrazac specificira gdje će biti smješten odreĎeni tip aplikacijske logike. Tako će UI logika biti u komponenti view (pogled), poslovna logika u model komponenti, dok će logika unosa biti smještena u kontroler komponenti. Ovakvo razdvajanje omogućuje manju kompleksnost pri razdvajanju aplikacija tako što omogućava fokusiranje samo na jedan njen dio. Na primjer, prvo se korisnik može u početku fokusirati samo na UI, a kasnije razvijati logiku. Ovakav način pristupa aplikaciji omogućuje da jedan programer može raditi na UI, drugi na kontroler logici, dok treći na poslovnoj logici modela. Dvije osnovne ideje nalaze se u osnovi ove arhitekture, a to su ponovno korištenje već postojećeg koda i jasna raspodjela dužnosti meĎu pojedinim dijelovima sustava. Prva ideja omogućava da se jednom napisani kod uz minimalne ili čak nikakve izmjene može koristiti u više različitih projekata. Druga ideja je podjela sustava na više meĎusobno neovisnih cjelina 7 od kojih svaka ima svoj zadatak i koje se pojedinačno mogu modificirati bez straha da će se te promijene odraziti na ostatak sustava. Slika 1 prikazuje ovisnost izmeĎu objekata MVC uzorka. Važno je zapaziti da View i Controller ovise o Model komponenti. S druge strane, Model ne ovisi niti o View komponenti, niti o Controller komponenti. Ova neovisnost Model komponente je izrazito važna jer omogućava da ta komponenta bude razvijena i testirana neovisno o prezentacijskoj logici. Odijeljenost View komponente i Controller komponente je sekundarne naravi tako da se čak kod nekih varijanti Model-View-Controller uzorka te dvije komponente udružuju u jednu. Takva implementacija često je zastupljena kod klijentskih (desktop) aplikacija. MeĎutim, kod web aplikacija granica izmeĎu te dvije komponente je izražena, budući da se prezentacijski sloj (View) nalazi na strani korinsika i vidljiv je kroz web preglednik, dok se dogaĎaji obraĎuju na poslužiteljskoj strani (Controller). Slika 1. Dijagram razreda MVC uzorka – konceptualni pogled 3.2. Model Model se sastoji od podataka, poslovnih pravila, logike i funkcija ugraĎenih u programsku logiku. Čini samu bit aplikacije, a sastoji se od skupa klasa koje modeliraju i podržavaju rješavanje problema kojim se aplikacija bavi, i taj dio je obično stabilan i trajan koliko i sam problem. Postoji nekoliko načina na koje je moguće stvoriti kostur modela. Programer može prvo definirati klase te odnose atributa unutar svake klase i tako stvarati bazu podataka ili može prvo stvoriti bazu podataka te dopusti samom procesu da automatski stvara klase. 8 Kada se identificiraju klase modela koje će se implementirati u web aplikaciju, potrebno je uzeti u obzir i veze izmeĎu njih. Na primjer, u slučaju korištenja aplikacije za rezervaciju apartmana, svaka pojedina rezervacija bit će vezana za jednog, i samo jednog, korisnika koji je rezervirao željeni apartman u odreĎenom vremenskom razdoblju. Takva veza je poznata kao jedan-na-jedan odnos (1:1). Svaki korisnik, meĎutim, može rezervirati više apartmana. Takva veza je poznata kao jedan-na-više odnos (1:N). Na slici 2 prikazan je relacijski model podataka raĎen za potrebe kolegija Programiranje za internet, naziv projekta: Iznajmljivanje apartmana. Slika 2. Relacijski model podataka Model u MVC arhitekturi obično se sastoji od Modela područja (Domain Model, Md) i Modela aplikacije (Application Model, Ma). Domain Model sadrži glavne objekte koji opisuju problem (npr. korisnici, rezervacija, mjesto, itd.), dok se Application Model sastoji od tehničkih objekata potrebnih za izradu aplikacije (npr. popis registriranih korisnika, sučelje za unos podataka o apartmanima, itd.). Domain Model obično se povezuje s bazom podataka jer se objekti iz Domain Modela prikazuju u bazi i o njima se podaci pohranjuju u bazi. Ovisno o potrebama koje se javljaju u pojedinim fazama razvoja informacijskog sustava, razlikuju se tri vrste modela podataka: 1. konceptualni model podataka 2. logički model podataka 3. fizički model podataka 9 Konceptualni model sadrži samo prikaz naziva entiteta (tj. tablica) u bazi njihovih veza. Odražava način na koji korisnici budućeg informacijskog sustava shvaćaju dogaĎaje u sustavu, a zatim i podatke koji proizlaze iz takvih dogaĎaja. Logički model sadrži još nazive atributa u tablicama, primarnih i stranih ključeva. Stvaraju ga i koriste stručnjaci informatičari (projektanti) kao osnovu za oblikovanje i razvoj informacijskih sustava. Fizički model sadrži sve stupce u tablicama i tipove podataka u pojedinim stupcima. Predstavlja način na koji stroj (elektroničko računalo) „vidi“ podatke pohranjene u njegovoj memoriji. Dakle, Model dio MVC arhitekture sadrži informacije o objektima (klasama, svojstvima, entitetima u bazi podataka i vezama), te sve ostalo što ulazi u Model područja (Domain Model) i Model aplikacije (Application Model). Ovaj dio ne posjeduje znanje o vezama s vanjskim svijetom, tj. ne bavi se vezama s okolinom. 3.3. Pogled (View) Pogled predstavlja bilo kakav prikaz podataka kao što je obrazac, tablica ili dijagram. Bavi se načinom prikaza informacija korisniku ili aplikaciji, tj. odgovara na pitanje kako će se nešto prikazati korisniku ili drugoj aplikaciji, a sadrži sučelja koja su veza s modelom (s prvim dijelom arhitekture sustava). S obzirom da u aplikaciji obično postoji više sučelja, ovaj dio često se naziva u množini: Views (pogledi). Ti pogledi obično se odnose na prozore za komunikaciju, a mogu biti (Deacon, 2012.): Pogled na grafičko korisničko sučelje (GUI view) Pogled na komandnu liniju (Command line view) Pogled na aplikacijsko programsko sučelje (API view) Dakle, sučelja ne moraju nužno biti grafička. 10 3.4. Kontroler (Controller) Kontroler u osnovi prima zahtjeve korisnika. Kontroler je objekt koji upravlja pogledima. Pojednostavljeno se može reći da kontroler kontrolira input, dok pogledi (views) kontroliraju output (kako će nešto izgledati u prozoru). Da bi mogli upravljati inputom, kontroleri moraju poznavati na kojoj se platformi, tj. operacijskom sustavu i bazi radi u aplikaciji. Pogledi nasuprot tome ne moraju to poznavati. Primjeri zahtjeva koji pripadaju u kontroler: Kada korisnik u web preglednik upiše adresu: http://www.fpmoz.ba/new/ želimo da se prikaže stranica s osnovnim informacijama o Fakultetu prirodoslovno-matematičkih i odgojnih znanosti. Ako koristimo web obrazac za kontaktiranje neke tvrtke, kada kliknemo na dugme „Pošalji“, želimo da se naša poruka pošalje na e-mail adresu primatelja ili spremi u datoteku. 3.5. Prednosti MVC arhitekture Osnovna prednost MVC arhitekture je razdvajanje projekta na smislene i odvojene cjeline, što predstavlja veliku prednost pri izradi velikih projekata na kojima radi više osoba. Iz toga proizlazi i druga prednost koja se odnosi na izmjenu, nadogradnju i budući razvoj. Ovakav pristup omogućava laganu izmjenu jednog od elemenata bez velike intervencije u druge elemente, kao i ponovo korištenje već napravljenih elemenata. Tako, npr., pri promijeni vizualnog identiteta web stranice možemo promijeniti samo View element bez izmjena funkcionalnosti, što uvelike olakšava održavanje i odgaĎa potrebu za izradu novog rješenja. U ovakvoj arhitekturi Model je tijelo, View su oči, a Controller je mozak projekta. MVC okvir ima osnovni cilj pružiti alate i metode za dizajniranje Modela, Pogleda i Kontrolera. Dodatni ciljevi MVC okvira su (Pluralsight, 2012.): Prigrliti web (povezati aplikaciju sa HTML, CSS I JavaScript tehnologijama, čije se naredbe automatski generiraju prilikom izrade aplikacije) 11 Izgraditi i pokretati aplikacije u ASP.NET okolini, koja omogućuje izgradnju, debuggiranje i generiranje izvršnog koda aplikacije Omogućiti proširive (eng. extensible) aplikacije Omogućiti testabilne (eng. testabile) aplikacije, koje će se lako moći testirati Primjer MVC: Dijelovi MVC aplikacije koja će na web stranici prikazivati popis raspoloživih apartmana za rezervaciju: Popis naziva smještaja i sadržaj smještaja = Model Zahtjev korisnika da se na web stranici prikaže popis naziva smještaja i sadržaj smještaja = Kontroler Zahtjev korisnika da se na web stranici taj popis prikaže u obliku tablice = Pogled Slika 3. MVC obrazac MVC arhitekturu možemo realizirati na više modificiranih načina, za web je iskorišteno sljedeće rješenje (slika 3): 12 Slika 4. MVC arhitektura za web Na ovaj način zahtjevi se usmjeravaju Controller klasi koja obraĎuje korisnikov unos i radi s modelom. Pritom Model sadržava detalje relevantne za model kao što su objekti i pravila baze, a Contoller sadrži aplikacijsku logiku i ostale tehničke detalje kao što su autorizacija i višejezičnost. Nakon što obradi zahtjev Contoller priprema podatke za prezentaciju (prezentacijski model), odabire potrebni View i njegov zadatak je završen. S obzirom na to da Controller klase nisu vezane s ulazno-izlaznim sučeljem, one su čista aplikacijska logika i mogu se lako testirati po potrebi. View je iskorišten za pretvaranje prezentacijskog modela u gotovi HTML. Sadrži osnovnu prezentacijsku logiku, kao što je izlistavanje objekata po redovima ili pokazivanje i skrivanje odreĎenih dijelova stranice. Rad s prezentacijskim modelom bi se trebao obavljati na prethodnoj Controller razini, jer se ime koristi puna snaga ovakve arhitekture. 13 3.6. Nedostaci MVC arhitekture MVC ima, naravno, i svoje nedostatke. Previše je kompleksan za implementaciju kod razvoja manjih aplikacija i njegovo korištenje u tim slučajevima dovodi do pogoršanja kako samog dizajna, tako i performansi. Ponekad se može dogoditi da uslijed čestih promjena modela pogled bude preplavljen zahtjevima za izmjenu. Ukoliko on služi za prikazivanje sadržaja kojem je potrebno odreĎeno vrijeme za izmjenu, često zahtjevi mogu dovesti do kašnjenja. 3.7. Varijante Model-View-Controller uzorka Model-View-Controller uzorak može biti implementiran u dvije varijante: pasivni Model (engl. Passive Model) i aktivni Model (engl. Active Model). Kod pasivnog Model-a jedan Controller ekskluzivno upravlja modelom, što znači da model ne može promijeniti svoje stanje bez da u tu operaciju bude uključen Controller. Nakon što Contoller promijeni stanje Model-a obavještava View o nastalim promjenama koji zatim može osvježiti prikazane podatke. U ovoj varijanti Model-View-Controller uzorka Model je potpuno neovisan o Contoller-u i View-u, što znači da isti ne mora prijavljivati promjene koje su izvršene na njemu. U slučaju aktivnog Model-a moguće je da Model promijeni svoje stanje bez da je u tu operaciju uključen Controller. Takav se slučaj može dogoditi na način da više Controller komponenti u isto vrijeme mijenjaju stanja Model komponente ili kada neke druge komponente unutar aplikacije takoĎer imaju pravo na mijenjanje Model komponente. Budući da u takvoj situaciji samo Model ima saznanja o promjenama koje su nastale, jedino on može obavijestiti View o nastalim promjenama. MeĎutim, to je u kontradikciji s glavnom karakteristikom Model komponente, a to je nezavisnost u odnosu na Controller i View, te se u tom slučaju koristi Observer implementacijski uzorak koji ima mehanizam slanja obavijesti o promjenama bez izravne veze s drugim objektima. Svaki View implementira Observer sučelje i registrira se kod Model komponente s namjerom da prima obavijesti o promjenama. Model sadržava listu svih registriranih View komponenti, ali ne zahtjeva nikakve posebne informacije o pojedinoj View komponenti. Kada se dogodi promjena Model obavještava sve registrirane promatrače (engl. Observer) što u konkretnom slučaju znači View komponente. 14 Implementacija aktivnog Model-a prikazana je na slici 5. Slika 5. Konceptualni pogled: Dijagram razreda aktivnog modela MVC uzorka Web aplikacije koje su izvedene korištenjem Model-View-Controller uzorka su primjer pasivnog Model-a. Kod web aplikacija View se nalazi na korisničkoj strani, dok se Model i Controller nalaze na strani poslužitelja, a meĎusobno su povezani HTTP protokolom. Svi zahtjevi su inicirani od strane korisnika, a server u ovisnosti o zahtjevu šalje odgovarajući odgovor. U takvom okruženju je nemoguće da server samoinicijativno pošalje obavijest korisnikovom pregledniku o promjeni unutar Model komponente, te je jedino moguće rješenje implementacija pasivnog Model-a. U ovakvoj situaciji Controller prestaje biti sekundarna komponenta i otvaraju se brojne mogućnosti za nadogradnju i prilagodbu ovog uzorka za web aplikacije. 15 4. PHP (Personal home page/Hypertekst Pretprocessor) 4.1. Razvoj programskog jezika PHP Priča o PHP-u počinje 1995. kada je Rasmus Lerdof iz potrebe da prati broj posjeta na svojoj online biografiji razvio niz CGI (Common Gateway Interface) alata razvijenih u Perl programskom jeziku. Ubrzo je ovaj jezik prihvaćen i od drugih programera. Prije PHP-a, kakvog ga poznajemo danas, ovo je bio jedini način da se web stranicama unese malo dinamike, jer HTML kao takav samo je način prezentacije podataka. Svakako razvoj ovakvih aplikacija nije bio lagan. U daljnjem razvoju PHP-a postojeći programi su ponovo napisani kao niz binarnih izvršnih datoteka napisanih u C programskom jeziku te dodani elementi za pristup bazama podataka i radu na web formama. PHP je pretrpio četiri značajne promjene dok nije dosegao složenost i fleksibilnost kakvu danas poznajemo. U studenom 2007. godine koristio se u preko 21 milijun domena širom svijeta, a taj broj neprekidno raste. Slika 6. PHP: Hypertext Pretprocessor 4.1.1. PHP/FI Kada se ukazala potreba za novim funkcijama, Rasmus je napisao znatno veći broj aplikacija u C programskom jeziku. Uz ostalo dodao je i funkcije za komunikaciju s bazama podataka. Aplikaciju je nazvao Personal Home Page/Forms Interpreter odnosno PHP/FI. Ona je omogućavala kreiranje jednostavnih dinamičkih stranica na webu. Rasmus Lerdorf odlučio je javno objaviti PHP/FI Personal Home Page Tools (PHP Tools) verziju 10. lipnja 1995. godine kako bi ovu aplikaciju svi mogli javno koristiti i sudjelovati u njenom budućem razvoju i poboljšanju. Verzija PHP/FI sadrži osnovne karakteristike koje PHP ima i danas. 16 Varijable koristi na način Perla, automatskim interpretiranjem varijabli primljenih iz HTTP formi te omogućava uključivanje HTML sintakse. Sintaksa je bila jako slična Perlu, uz nešto ograničenja i pojednostavljenja, ali s dosta nekonzistentnosti. 4.1.2. PHP/FI 2.0 Godine 1997. pojavilo se drugo izdanje PHP/FI-a – verzija 2.0, napisana u programskom jeziku C. Tada ga je koristila skupina od nekoliko tisuća ljudi širom svijeta na oko 50 000 stranica što je u tom trenutku predstavljalo oko 1% internetske domene. Iako je već nekoliko ljudi intenzivno sudjelovalo u razvoju, to je i dalje bio uglavnom projekt koji je kreirao jedan čovjek. PHP/FI 2.0 službeno je izdan u studenom 1997. godine, nakon što je dugo bio u beta izdanju. 4.1.3. PHP 3 PHP 3 je prvo izdanje koje sliči današnjem izdanju PHP-a, a stvorila su ga dva izraelska programera – Andi Gutmans i Zeev Suraski 1997. godine prepisujući kompletni PHP/FI 2.0 jer nije zadovoljavao u razvoju njihovih e-commerce web aplikacija. Andi, Rasmus i Zeev odlučili su suraĎivati u zajedničkom razvoju PHP 3.0 kao službenog nasljednika PHP/FI 2.0. Tako je nastao novi programski jezik nazvan „PHP“ što je danas skraćenica od Hypertext Pretprocesor. Jedna od najvećih kvaliteta PHP 3.0 bila je mogućnost dodavanja novih proširenja. Zbog mogućnosti uporabe različitih baza podataka, protokola i API-a kao i mogućnosti proširenja privukla je još više programera koji su razvijali daljnje module za funkcionalna proširenja. Ključ je uspjeha PHP 3.0, dakle, mogućnost modularnih proširenja, objektno orijentirana sintaksa i poboljšana jezična sintaksa. Stabilnija verzija PHP 3.0 službeno je izdana u lipnju 1998. godine nakon otprilike 9 mjeseci testiranja. Tijekom 1998. godine skupina PHP korisnika širi se na desetke tisuća korisnika i stotine tisuća web poslužitelja zauzimajući pri tome udio od oko 10% svih internetskih poslužitelja. 4.1.4. PHP 4 U zimu 1998. godine, kratko nakon službenog izdanja PHP 3 verzije, Andi Gutmans i Zeev Suraski počeli su rad na rekonstrukciji PHP jezgre. Ciljevi su bili poboljšati karakteristike kompleksnih aplikacija i još više povećati modularnost PHP-a. Novi PHP interpreter, nazvan Zend Engine (po dijelovima svojih imena Zeev and Andi), postigao je zadane ciljeve i 17 predstavljen je prvi put sredinom 1999. godine. PHP 4.0, baziran na novom interpreteru s novim proširenjima, izdan je službeno u svibnju 2000. godine, skoro dvije godine nakon pojave PHP 3. Osim poboljšanja jezgre i novih ekstenzija, značajne novosti bile su podrška za još više web poslužitelja, HTTP sesije, output buffering i sigurniji način rukovanja korisničkim podacima. 4.1.5. PHP 5 Nakon dužeg razvoja i više predverzija u srpnju 2004. godine objavljena je nova verzija PHP 5. Jezgra PHP 5 je Zend Engine 2.0. Verzija PHP 5 je u potpunosti stabilna i sadrži još više modula za podršku raznim novim tehnologijama (npr. XML Extensible Markup Language), što omogućava potpuno objektno orijentirano programiranje (prema uzoru na Javu). 4.2. Kako zapravo radi PHP? Programeri pišu PHP skripte koje se spremaju na web poslužitelj. Web poslužitelj sadrži PHP interpreter koji prevodi kod – nastaje dinamička Web stranica koju korisnik može vidjeti u svom Internet pregledniku. Web stranica može biti izgraĎena na bazi podataka (npr. MySQL baza podataka). Kada klijent pošalje zahtjev web poslužitelju za dinamičkom PHP web stranicom, poslužitelj je konfiguriran kako bi mogao prepoznati ekstenziju .php te prosljeĎuje datoteku PHP interpreteru koji dalje prosljeĎuje SQL upit poslužitelju. Nakon obrade upita rezultati se vraćaju poslužitelju te se na kraju prikazuju u pregledniku klijenta. Iako se predstavlja kao jezik za programiranje na strani poslužitelja, PHP je mnogo više od toga. Može se koristiti na svim važnijim operacijskim sustavima – Linux, Unix, Windows, MacOS te podržava većinu proceduralno i objektno orijentirano programiranje te korisnik ima potpunu slobodu izbora. Tri su glavna područja primjene PHP-a: Programiranje na strani poslužitelja – već je spomenuto glavno područje primjene. Da bi ovo funkcioniralo, potrebno je imati PHP interpreter, web poslužitelj te web preglednik. Kod se izvršava na web poslužitelju na kojem je instaliran PHP. 18 Command line programiranje – PHP skripta se može izvršavati bez poslužitelja ili preglednika. Ovaj tip korištenja je idealan za skripte koje se redovito izvršavaju koristeći cron (Unix/Linux) ili Task Scheduler (Windows). Pisanje desktop aplikacija – iako nije najbolji izbor za ovakav tip posla, neke napredne mogućnosti za programiranje na strani klijenta se mogu koristiti i za izradu desktop aplikacija. Jedna od najvažnijih osobina PHP-a je podrška za mnoge baze podataka. Programiranje web stranica koje koriste baze podataka je jako jednostavno zahvaljujući upravo PHP-u. Najčešće se PHP koristi u kombinaciji s MySQL bazama podataka. Ne treba zaboraviti ni podršku za komunikaciju s drugim uslugama koristeći protokole kao LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM i mnoge druge. Ovdje vidimo primjer jedne jednostavne PHP skripte. Poslužitelj će izvršiti navedeni PHP kod te će ga korisnik vidjeti u njegovom krajnjem obliku „Pozdrav! Ovo je PHP skripta!“ u web pregledniku. U praksi je korištenje PHP-a, naravno, mnogo složenije. Slika 7. Primjer jednostavne PHP skripte 19 4.3. Osnovne karakteristike PHP-a PHP je serverski skriptni jezik opće namjene izvorno dizajniran za izradu dinamičkih web stranica. To je jedan od prvih serverskih skriptnih jezika koji se mogao ugraditi u izvorni HTML dokument, umjesto pozivanja vanjske datoteke za obradu podataka. Unutar HTML stranica može se ugraditi PHP kod koji se izvršava kada posjetitelj web lokacije zatraži odreĎenu stranicu. Web server tumači PHP kod ugraĎen u stranicu i generira HTML kod ili neku drugu vrstu izlaznih podataka koje posjetitelj stranice može vidjeti. S vremenom, PHP je dobio mogućnost tekstualnog sučelja, a može se koristiti i u izradi grafičkih aplikacija. PHP djeluje prvenstveno kao filter. Njegov ulaz je datoteka ili tekstualni niz, a njegov izlaz predstavlja novi niz podataka koji je najčešće HTML dokument. PHP može biti implementiran na većini web poslužitelja ili kao samostalna ljuska na gotovo svakom operacijskom sustavu i platformi. Instaliran je na više od 20 milijuna web domena i na preko 1 milijun web poslužitelja, što ga je pozicioniralo kao ozbiljnog konkurenta sličnim skriptnim jezicima poput Microsoft-ovog Active Server Pages (ASP) i Sun-ovog Java Server Pages (JSP), a koriste ga i mnoge značajne web aplikacije kao što su Wikipedia, Facebook, Digg, Joomla i Wordpress. PHP je projekt otvorenog koda, što znači da imate pristup izvornom kodu koji možete koristiti, mijenjati i dalje distribuirati potpuno besplatno. PHP je prvobitno bila skraćenica za Personal Home Page, ali je značenje kasnije izmijenjeno u skladu s rekurzivnim GNU (GNU = Gnu's Not Unix) pravilima za davanje imena tako da je PHP sada skraćenica za PHP: Hypertext Pretprocesor. PHP je prvi programski jezik koji je bio ugraĎen unutar HTML stranice mijenjajući njen sadržaj i na kraju generirajući konačni sadržaj. Na osnovu navedenog možemo reći da po definiciji nije programski nego skriptni jezik. Danas ne možemo reći da je Perl prethodnik PHP-a jer je PHP u potpunosti ponovo napisan u C programskom jeziku. PHP je besplatan software izdan pod PHP licencom i u potpunosti je neovisan o operacijskom sustavu, tj. može se izvršavati na bilo kojem operacijskom sustavu (Linux, Windows, Mac, …) 20 TakoĎer, PHP je vrlo modularan kada su u pitanju ekstenzije, bilo da su pisane u C-u (PECL) ili niz klasa u PHP-u (PEAR). Danas je PHP izrastao u jako popularan skriptni jezik za razvoj čak i jako kompleksnih projekata te je u kombinaciji sa MySQL-om postao jako popularan alat (force to be reckoned with). PHP je izvorno implementiran kao interpreter. Naknadno je razvijeno nekoliko prevoditelja (engl. compiler) koji omogućavaju veću brzinu izvršavanja, statičku analizu i poboljšanu interoperabilnost s dijelovima koda pisanim u drugim jezicima. Poznatiji prevoditelji za PHP su Phalanger koji prevodi PHP u Common Intermediate Language (CIL) byte-kod i HipHop (razvio ga je Facebook i sada je dostupan kao open source) koji pretvara PHP skripte u C++ kod, a zatim ga prevodi čime se opterećenje poslužitelja smanjuje i do 50%. PHP uključuje mnoge besplatne i open source biblioteke. Pomoću njih se ostvaruje pristup mnogim mrežnim servisima poput poslužitelja baza podataka, FTP, LDAP, POP3, IMAP, SNMP, NNTP i brojnih drugih poslužitelja. Mnoge funkcije poznate u programskom jeziku C dostupne su i u standardnom PHP jeziku. Moguće je i pisanje proširenja u C jeziku za dodavanje nepostojećih funkcionalnosti u PHP jezik poput dinamičkog generiranja fotografija i Adobe Flash sadržaja, pa čak i sinteze govora. Projekt PHP Extension Community Library (PECL) predstavlja repozitorij ekstenzija PHP jeziku. Ovaj programski jezik namijenjen je za izradu dinamičkih i interaktivnih stranica na webu. To je serverska tehnologija (kao što su Perl, ASP ili ColdFusion) što znači da se on izvršava na web serveru. Njegovim izvršavanjem kreira se dio web stranice (ili cijela stranica) koji se potom šalje korisniku i bude vidljiv u njegovom pretraživaču. PHP omogućava interakciju korisnika s web stranicama. Na „statičnim“ stranicama komunikacija je jednosmjerna: korisnik klikom na neki link dobije pogled na odreĎeni sadržaj. Da bi korisnik mogao na bilo koji način utjecati na sam sadržaj neke web stranice potrebna je primjena neke serverske tehnologije. PHP se može instalirati na većini web poslužitelja, mnogim operacijskim sustavima i platformama kao što su Linux, Microsoft Windows, Mac OS, Solaris i OpenBSB, a posebno je naglašena mogućnost spajanja s velikim brojem relacijskih sustava za upravljanje bazama podataka (RDBMS). Dostupan je besplatno, a „The PHP Group“ korisnicima nudi potpuni izvorni kod za razvoj, prilagodbu i proširenja prema vlastitim potrebama. 21 4.4. Prednosti PHP-a Glavni konkurenti PHP-a su Perl, Microsoftov ASP.NET, Ruby (on Rails ili drugačiji), JSP (Java Server Pages) i ColdFusion. U usporedbi s navedenim tehnologijama, PHP ima više prednosti s obzirom na: Performanse: PHP je vrlo brz. Jedan relativno jeftin server može obraditi milijun zahtjeva dnevno. Rezultati testova koje je objavila tvrtka Zend Technologies (http://www.zend.com) dokazuju da PHP nadmašuje svoje konkurente. Proširivost: PHP ima ono što njegov autor, Rasmus Lerdorf, često naziva „sharednothing“ arhitektura. To znači da možete efikasno i jeftino horizontalno proširiti sustav na veliki broj običnih, jeftinih servera za podatke. Integriranost sa sustavom za upravljanje bazama podataka: PHP standardno omogućava uspostavljanje veza s više sustava za upravljanje bazama podataka. Osim s MySQL-om, moguće je uspostavljanje direktnih veza sa sustavima PostgreSQL, mSQL, Oracle, dbm, FilePro, DB2, Hyperwave, Informix, InterBase i Sybase, itd. Pomoću standarda ODBC (Open Dataabse Connectivity) mogu se uspostavljati veze sa svakom bazom podataka za koju postoji ODBC upravljački program. To vrijedi za Microsoftove proizvode, kao i za mnoge druge. Pored biblioteka, PHP ima i sloj apstrakcije za pristup bazama podataka koji se zove PHP Database Objects (PDO) koji omogućava konzistentan pristup bazama podataka i pospješuje pisanje koda. UgraĎene biblioteke: Budući da je projektiran za upotrebu na Webu, PHP sadrži brojne funkcije koje omogućavaju obavljanje mnogih poslova potrebnih u Web aplikacijama. Možete generirati slike tijekom rada aplikacije, koristiti XML dokumente, slati poruke e-poštom, raditi s kolačićima, generirati dokumente u formatu PDF – i sve to pomoću nekoliko redova programskog koda. Niska cijena: PHP je besplatan. (Najnoviju verziju uvijek je moguće preuzeti s adrese http://www.php.net, potpuno besplatno). Lako se uči: Sintaksa PHP-a slična je sintaksama drugih programskih jezika, prvenstveno jezika C i Perl. Podrška za objektno orijentirano programiranje: Verzija PHP 5 donosi objektno orijentirane mogućnosti. Slično kao kod programiranja u programskim jezicima Java ili C++, mogu se prepoznati elementi i sintaksa kao što su nasljeĎivanje, privatni i zaštićeni atributi i metode, apstraktne klase i metode, konstruktori, destruktori i slično. 22 Postoje i neke rjeĎe korištene mogućnosti poput, na primjer, upotrebe iteratora. Dio opisane funkcionalnosti bio je na raspolaganju već u verzijama PHP-a 3 i 4, ali je u verziji 5 ona znatno dopunjena. Prenosivost: PHP je na raspolaganju za mnoge operacijske sustave. PHP kod moguće je pisati jednim od Unix operacijskih sustava, kao što su Linux i FreeBSD, pod komercijalnim verzijama Unixa kao što su Solaris i IRIX, OS X, ili pod raznim verijama Microsoftovog Windowsa. Napisani kod u nekom operacijskom sustavu najčešće se nastavlja raditi bez izmjena u drugom operacijskom sustavu u kojem je instaliran PHP. Fleksibilnost pristupa razvoju aplikacija: U PHP-u se mogu lako realizirati jednostavni zadaci, a isto tako i velike aplikacije uz upotrebu frameworka zasnovanog na projektnim obrascima kao što je MVC arhitektura. Izvorni kod: Izvorni kod u PHP-u javno je dostupan. Za razliku od komercijalnih proizvoda zatvorenog koda, na jednostavan način je moguće izmijeniti ili dodati PHP programskom kodu. Nije potrebno čekati da proizvoĎač objavi servisne pakete niti brinuti o tome hoće li proizvoĎač bankrotirati ili prestati podržavati proizvod. Dostupnost podrške i dokumentacije: Tvrtka Zend Technologies (http://www.zend.com), koja je autor stroja na kojem se zasniva PHP, financira razvoj PHP-a zaradom od podrške i srodnog softvera koji distribuira na komercijalnoj osnovi. Dokumentacija o PHP-u i zajednica korisnika PHP-a ozbiljni su i bogati resursi informacija koje je danas moguće besplatno koristiti. 4.5. Razvoj velikih aplikacija u PHP-u Bilo tko da je pokušao napraviti bilo kakvu aplikaciju u PHP-u, vjerojatno se uvjerio da je razvoj aplikacija u PHP-u prilično jednostavan te kao takav PHP se ubraja u jedan od onih programskih jezika koje je jednostavno naučiti, ali teško savladati (easy to learn, hard to master). Ponekad razvoj velikih aplikacija zahtjeva odreĎenu metodologiju razvoja, poznavanje osnovnih principa programskog inženjerstva. Vrlo lako se može dogoditi da se naĎemo u situaciji gdje više vremena potrošimo ispravljajući pogreške koje smo napravili nego na samu izradu aplikacije. Pri tome se tu ne radi samo o poznavanju strukture programskog jezika, jer koliko god dobro poznavali neki programski jezik, ipak smo ljudi, a ljudi griješe. 23 Iako u tome nema ništa loše, osim gubitka vlastitog vremena, neke greške se skupo plaćaju, barem u profesionalnom razvoju aplikacija. Da bi se izbjegla takva situacija ponekad je bolje koristiti pristup (think twice code once) „Čitaj dva puta, kodiraj jednom“. Programski jezik PHP se već više od 10 godina koristi za izradu dinamičkih web sjedišta. Inicijalno su se dinamičke stranice stvarale uz pomoć jezika HTML, a dinamičke karakteristike dodavao je programski jezik PHP koji se uklapao u postojeću HTML stranicu. Ovakvo ispreplitanje dvaju programskih jezika je predstavljalo pogodnost budući da se na jednostavan način dodavala funkcionalnost web sjedištima. Kroz inačice 3 i 4, programski jezik PHP stekao je veliku popularnost u zajednici otvorenog koda. Kako je popularnost jezika rasla, bilo je neizbježno nastajanje sve većih i većih aplikacija koje su temeljene na ovom jeziku. Ubrzo je postalo jasno da isprepletanje dvaju programskih jezika nije predstavljalo dugoročno rješenje za velike web aplikacije. Problemi se očituju u skalabilnosti i održavanju velikih projekata. Točnije, puno je teže dodavati nove funkcionalnosti i ispravljati programske greške (eng. bug) ukoliko se funkcijski dio koda nalazi zajedno sa HTML prikazom. Jedno svojstvo web aplikacija je često mijenjanje grafičkog sučelja, odnosno izgleda. Ukoliko se funkcijski dio koda usko veže uz HTML nije moguće zamijeniti izgled stranice bez mijenjanja postojeće funkcionalnosti koda. U cilju rješavanja ovog problema nastala su razvojna okruženja, a neka od najpopularnijih razvojnih okruženja za programski jezik PHP su Cake PHP, CodeIgniter, Yii, Symfony i Zend framework. Razvojna okruženja općenito služe za potporu izgradnje i testiranja dinamičkih web stranica, web aplikacija i usluga. TakoĎer, pomažu u razrješavanju učestalih problema koji se pojavljuju prilikom projektiranja web aplikacija. Često okruženja nude gotov skup biblioteka i alata za pristup bazi podataka, izradu i upravljanje predlošcima, upravljanje korisničkom sjednicom te olakšavaju ponovnu uporabu programskog koda. Mnoga razvojna okruženja prate arhitektonski obrazac MVC (engl. Model-View-Controller) koji omogućuje razdvajanje modela podataka s poslovnom pravilima od korisničkog sučelja. Ovo svojstvo se općenito smatra dobrom praksom obzirom da modularizira kod, potiče ponovnu uporabu koda i omogućuje više sučelja koji se mogu primjenjivati. Razvojna okruženja stvorena su s ciljem jednostavnijeg stvaranja i održavanja velikih web aplikacija zasnovanih na PHP programskom jeziku. Sadrže bogat skup gotovih komponenti koje pokrivaju velik dio učestalih potreba prilikom izrade web aplikacija. 24 4.6. Usporedba PHP-a s drugim programskim jezicima PHP vs ASP Iako su PHP i ASP po mnogočemu slični, razlikuju se u četiri dosta bitne kategorije, a to su: Cijena: Sam ASP je besplatan, no da bismo ga koristili, potrebno je imati IIS server koji je podržan na nekim od Windows operacijskih sustava. Najčešće se u ASP aplikacijama koristi MS SQL Server koji takoĎer ima svoju cijenu. Veliki problem se javlja ukoliko bismo ga željeli pokrenuti na drugim platformama ili serverima. S druge strane, programiranje u PHP-u ne košta ništa, a popularne baze podataka za PHP su besplatne (MySQL i PostreSQL). Platforma: Korištenje ASP aplikacija je ograničeno na Windows platformu, dok se PHP aplikacije vrte na svim platformama. Programerska zajednica: ASP ima svoju zajednicu na MSDN-u, ali je često teško doći do zaista korisnih stvari besplatno na internetu. Nasuprot tome, za PHP postoji mnogo tutoriala, članaka, foruma i slično. Brzina: ASP je sporiji u izvoĎenju od PHP-a. Ipak, osnovna razlika je u tome što ASP sam po sebi nije jezik već skupina povezanih objekata kojima možemo pristupiti pomoću VB ili JavaScripta. Veliki problem kod ASP-a je što je programer ograničen samim jezikom koji je podijeljen na „komponente“ te ukoliko želimo šire mogućnosti morali bismo ASP nadograĎivati dodatnim komponentama, a to zapravo znači dodatne troškove. PHP vs Perl Iako ova dva jezika imaju dosta sličnosti, ipak postoji više razlika. Glavna razlika je ta što je PHP namijenjen prije svega za pisanje web skripti, dok Perl ima dosta širu upotrebu. Samim time ima i složeniju sintaksu od PHP-a što ga čini težim za naučiti i savladati u odnosu na PHP. Unatoč široj upotrebi Perl-a, PHP koristi neke dobre osobine Perla poput konstruktora te nekih sintaktičkih osobina. Ukratko rečeno, Perl je programski jezik čije je ime kratica od eng. „Practical Extraction and Report Language“. Originalni autor Perla je Larry Wall, a prva inačica pojavila se 18. Prosinca 1987. godine. Perl vuče svoje korijene iz drugih jezika kao što su primjerice C, sed, awk i Unix shell. Odlikuje ga kvalitetan repozitorij gotovih programskih rješenja (CPAN – 25 kratica od eng. „Comprehensive Perl Archive Network“) što mu je ujedno i glavna prednost u odnosu na konkurentske jezike. Perl je prema svojim karakteristikama objektno orijentirani interpreterski programski jezik opće namjene s naglaskom na funkcionalnost, proširivost te laganu krivulju učenja. Perl je bio jezik izbora za razvoj WWW aplikacija sredinom 90-ih godina. Os samih svojih početaka to je jezik Unix i Linux sistemskih administratora koji ga koriste u svakodnevnom radu prvenstveno za automatizaciju procesa. Danas postoji i čitav niz korisničkih komercijalnih aplikacija pisanih u Perlu. 4.7. Struktura PHP web aplikacije bez korištenja MVC arhitekture 26 Slika 8. Direktorij PHP web aplikacije 27 apartmani_objekti.php <?php require("config.php"); include("header.php"); include("html_head.php"); include("menu.php"); if (isset($_COOKIE['uname'])){ $prijavljen=true; $tip_korisnika=$_COOKIE['tip_korisnika']; } function IspisApartmana(){ global $dbhost, $dbuser, $dbpass,$dbname; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); echo "<h2>Pregled apartmana</h2>"; $sql="SELECT ID_objekta, naziv_objekta, vlasnik, adresa, telefon, email, web, broj_soba, udaljenost_od_mora, udaljenost_od_centra, status, naziv_mjesto, status FROM `apartmani_objekti` NATURAL JOIN mjesto ORDER BY ID_objekta"; $result=mysql_query($sql); echo "<table class=\"sample\"><tr><th> ŠIFRA </th><th> NAZIV </th><th> VLASNIK </th><th> ADRESA </th><th> TELEFON </th><th> EMAIL </th><th> WEB   </th><th> BROJ </br> APARTMANA </th><th> UDALJENOST </br>OD MORA </th><th> UDALJENOST </br>OD CENTRA </th><th> MJESTO </th><th>; STATUS;</th><th></th><th></th></tr>"; while($ispisrez = mysql_fetch_array($result)){ echo "<tr>"; echo "<td>".$ispisrez['ID_objekta']."</td>"; echo "<td>".$ispisrez['naziv_objekta']."</td>"; echo "<td>".$ispisrez['vlasnik']."</td>"; echo "<td>".$ispisrez['adresa']."</td>"; echo "<td>".$ispisrez['telefon']."</td>"; echo "<td>".$ispisrez['email']."</td>"; echo "<td>".$ispisrez['web']."</td>"; echo "<td><center>".$ispisrez['broj_soba']."</center></td>"; echo "<td><center>".$ispisrez['udaljenost_od_mora']."</center></td>"; echo "<td><center>".$ispisrez['udaljenost_od_centra']."</center></td>"; "<td><center>".$ispisrez['parking']."</center></td>"; echo "<td>".$ispisrez['naziv_mjesto']."</td>"; // echo "<td>".$ispisrez['naziv']."</td>"; echo "<td>".$ispisrez['status']."</td>"; echo "<td><a href=\"objekt_brisi.php?id=".$ispisrez['ID_objekta']."\"onclick=\"return confirm('Želite li stvarno pobrisati');\">Briši </a></td>"; echo "<td><a href=\"objekt_promijeni.php?id=".$ispisrez['ID_objekta']."\">Ažuriraj</a></td >"; echo "</tr>"; } mysql_close($conn); echo "</table>"; 28 echo "</br></br></br><a href=\"objekt_dodaj.php?id=".$ispisrez['ID_objekta']."\">Dodaj novi objekt</a>"; } ?> <div id="pregled_apartmana" > <?php IspisApartmana() ?> </div> <?php include("footer.php"); ?> objekt_dodaj.php <?php include("html_head.php"); include("header.php"); include("menu.php"); require("config.php"); if (isset($_COOKIE['uname'])){ $prijavljen=true; $tip_korisnika=$_COOKIE['tip_korisnika']; } else { $prijavljen=false; } ?> <div > <div > <div > <div id="dodavanje_apartmana" > </br></br></br> <h1> DODAVANJE NOVOG OBJEKTA APARTMANA</h1> </div> <div class="ana"> <form action="insertobjekt.php" method="GET" class="dodaj"> <span>NAZIV OBJEKTA: </br><input type="text" name="naziv" size="30" maxlength="40"><span><br> <span>VLASNIK: </br><input type="text" name="vl" size="30" maxlength="40"><span><br> <span>ADRESA: </br><input type="text" name="adr"size="30" maxlength="40" ><span><br> <span>TELEFON: </br><input type="text" name="tele" size="30" maxlength="40"><span><br> <span>EMAIL: </br><input type="text" name="ema" size="30" maxlength="40"><span><br> <span>WEB: </br><input type="text" name="we" size="30" maxlength="40" ><span><br> <span>BROJ SOBA: </br><input type="text" name="broj"size="30" maxlength="40"><span><br> <span>UDALJENOST OD MORA: </br><input type="text" name="od_mora" size="30" maxlength="40"><span><br> <span>UDALJENOST OD CENTRA: </br><input type="text" name="od_centra" size="30" maxlength="40"><span><br> <span>PARKING: </br><input type="text" name="par" size="30" maxlength="40"><span></br> <span>STATUS: </br><input type="text" name="stat" size="30" maxlength="40"><span></br> <span> MJESTO: </br> 29 <select name="ID_mj"> <option value="odabir" size="30" maxlength="40" >Odaberite mjesto</option> </br></br></br> <?php // povezivanje $conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); echo "<h2>Pregled mjesta</h2>"; $sql2="SELECT * FROM mjesto ORDER BY ID_mjesto"; $result2=mysql_query($sql2); while($ispisrez2 = mysql_fetch_array($result2)){ echo "<option value=\"".$ispisrez2['ID_mjesto']."\">".$ispisrez2['naziv_mjesto']."</br></br></op tion></br></br></br>"; echo "</br>"; } ?> </select> <span> </br></br><input type="submit" name="posalji" value="Dodaj"><br> </form> <!-- <?php $conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); echo "<h2>Pregled objekata</h2>"; $sql2="SELECT * FROM apartmani_objekti ORDER BY 1"; $result2=mysql_query($sql2); while($ispisrez2 = mysql_fetch_array($result2)){ echo "<option value=\"".$ispisrez2['ID_objekta']."\">".$ispisrez2['naziv_objekta']."</option>"; while petlje } ?> </div> </div> </div> </div> <?php include("footer.php"); ?> objekt_brisi.php <?php include("html_head.php"); include("header.php"); include("menu.php"); require("config.php"); if (isset($_COOKIE['uname'])){ $prijavljen=true; $tip_korisnika=$_COOKIE['tip_korisnika']; } else { $prijavljen=false; } ?> <?php 30 global $dbhost, $dbuser, $dbpass,$dbname; if (isset($_GET['id'])) { $sifra_objekta = $_GET['id']; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); $sql="DELETE FROM apartmani_objekti WHERE ID_objekta=$sifra_objekta"; $result=mysql_query($sql) or die("<h2>Pogreska kod brisanja</h2>".mysql_error()); if ($result){ echo "<h2 class='brisanje_objekta'>BRISANJE OBJEKTA SA ŠIFROM:<b>$sifra_objekta</b>...</h2>"; } } ?> </br> <a href="apartmani_objekti.php" class="link_novi_popis2">Pogledaj novi popis apartmana.</a> objekt_promijeni.php <?php require("config.php"); include("html_head.php"); include("header.php"); include("menu.php"); if (isset($_COOKIE['uname'])){ $prijavljen=true; $tip_korisnika=$_COOKIE['tip_korisnika']; } else { $prijavljen=false; } ?> <div id="content-container"> <div id="content-container2"> <div id="content-container3"> <div id="content"> <?php if ($tip_korisnika==2){ if (isset($_GET['azuriraj'])){ $ID_objekta = $_GET['ID_objekta']; $naziv_objekta = $_GET['naziv_objekta']; $vlasnik = $_GET['vlasnik']; $adresa = $_GET['adresa']; $telefon = $_GET['telefon']; $email = $_GET['email']; $web = $_GET['web']; $broj_soba = $_GET['broj_soba']; $udaljenost_od_mora = $_GET['udaljenost_od_mora']; $udaljenost_od_centra=$_GET['udaljenost_od_centra']; $parking = $_GET['parking']; $ID_mjesto = $_GET['ID_mjesto']; $status = $_GET['status']; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); $sql="UPDATE apartmani_objekti SET naziv_objekta='$naziv_objekta', vlasnik='$vlasnik', adresa='$adresa', telefon='$telefon', email='$email', web='$web', broj_soba='$broj_soba', udaljenost_od_mora='$udaljenost_od_mora', 31 udaljenost_od_centra='$udaljenost_od_centra', parking='$parking', ID_mjesto='$ID_mjesto', status='$status' WHERE ID_objekta=$ID_objekta"; $result=mysql_query($sql) or die("<h2>Pogreska kod pronalaska objekta</h2>".mysql_error()); if ($result){ echo "Uspješno ažuriranje</br></br>"; echo "<a href='apartmani_objekti.php' class='novi_popis_objekata'>Pogledajte novi popis objekata</a>"; } } if (isset($_GET['id'])) { $ID_objekta = $_GET['id']; $conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); $sql="SELECT * FROM apartmani_objekti WHERE ID_objekta='$ID_objekta' "; $result=mysql_query($sql) or die("<h2>Pogreska kod pronalaska objekta</h2>".mysql_error()); while($ispisrez = mysql_fetch_array($result)){ $trenutni_objekt=$ispisrez['ID_objekta']; echo "<form action=\"objekt_promijeni.php\" method=\"GET\">"; echo "<span>ŠIFRA OBJEKTA: </br><input type=\"text\" name=\"ID_objekta\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['ID_objekta']."\" READONLY></span><br>"; echo "<span>NAZIV OBJEKTA:</br> <input type=\"text\" name=\"naziv_objekta\" size=\"35\" maxlength=\"40\"value=\"".$ispisrez['naziv_objekta']."\"></span><br>"; echo "<span>VLASNIK: </br><input type=\"text\" name=\"vlasnik\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['vlasnik']."\"></span><br>"; echo "<span>ADRESA: </br><input type=\"text\" name=\"adresa\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['adresa']."\"></span><br>"; echo "<span>TELEFON:</br> <input type=\"text\" name=\"telefon\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['telefon']."\"></span><br>"; echo "<span>EMAIL:</br> <input type=\"text\" name=\"email\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['email']."\"></span><br>"; echo "<span>WEB: </br><input type=\"text\" name=\"web\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['web']."\"></span><br>"; echo "<span>BROJ APARTMANA: </br><input type=\"text\" name=\"broj_soba\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['broj_soba']."\"></span><br>"; echo "<span>UDALJENOST OD MORA:</br> <input type=\"text\" name=\"udaljenost_od_mora\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['udaljenost_od_mora']."\"></span><br>"; echo "<span>UDALJENOST OD CENTRA:</br> <input type=\"text\" name=\"udaljenost_od_centra\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['udaljenost_od_centra']."\"></span><br>"; echo "<span>PARKING: </br><input type=\"text\" name=\"parking\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['parking']."\"></span><br>"; echo "<span>ŠIFRA MJESTA:</br> <input type=\"text\" name=\"ID_mjesto\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['ID_mjesto']."\"></span><br>"; echo "<span>STATUS:</br> <input type=\"text\" name=\"status\" size=\"35\" maxlength=\"40\" value=\"".$ispisrez['status']."\"></span><br>" } echo "</select><br></span><span><input type=\"submit\" name=\"azuriraj\" value=\"AŽURIRAJ\"></span>"; echo "</form> } } else { echo "<h3>Nemate razinu za pregledavanje ovih podataka</h3><br>"; } ?> 32 </div> </div> </div> </div> rezervacija.php <?php require("config.php"); include("header.php"); include("html_head.php"); include("menu.php"); if (isset($_COOKIE['uname'])){ $name=$_COOKIE['uname']; $prijavljen=true; $tip_korisnika=$_COOKIE['tip_korisnika']; } if(isset($_COOKIE['id_korisnika'])){ $id_korisnik = $_COOKIE['id_korisnika']; } else { $prijavljen=false; } if(isset($_GET['a'])){ $id_objekt= $_GET['a']; $conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to mysql'); mysql_select_db($dbname); $sql="SELECT naziv_smjestaja FROM apartmani_smjestaj WHERE ID_smjestaj=".$id_objekt; $result=mysql_query($sql); while($ispisrez2 = mysql_fetch_array($result)) $naziv_objekta = $ispisrez2['naziv_smjestaja']; } ?> <div > <div > <div > <div > </div> <div class="ana"> <h2>REZERVACIJA</h2> <form action="insertrezervacija.php" method="GET" class="dodaj"> <span>NAZIV SMJEŠTAJA:</br> <?php echo $naziv_objekta; echo '<input type="hidden" name="idsmjestaja" value="'.$id_objekt.'">'; ?> <span> </br> <span>VAŠE KORISNIČKO IME:</br> <?php echo $name; ?> <span></br> <?php 33 $date_from=date('Y-m-d', time()+14*60*60*24); $date_to=date('Y-m-d',time()+21*60*60*24); echo '<span>DATUM OD: </br><input type="date" name="od" value="'.$date_from. '"><span></br>'; echo '<span>DATUM DO: </br><input type="date" name="do" value="'.$date_to. '"><span></br>'; ?> <?php echo '<input type="hidden" name="id_korisnik" value="'.$id_korisnik.'"/>'; ?> <input type="submit" name="posalji" value="Dodaj"><br> </form></div> </div> </div> </div> <?php include("footer.php"); ?> 34 5. MVC u web aplikacijama 5.1. Framework (radni okvir) Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na jednu višu, profesionalniju razinu. Radi se o PHP paketima (php framework) koji služe kao alati za brži i sigurniji razvoj Internet aplikacija. Njihova namjena je prvenstveno bila da se gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju gradi, problemima organizacije datoteka, klasifikacije objekata i slično. Termin okvir (engl. framework) se vrlo često koristi u softverskom inženjerstvu, posebno kada se govori o projektiranju i implementaciji objektno orijentiranog softvera. Najjednostavnije, okvir se može definirati kao generator aplikacija odreĎene domene, ili konkretnije, okvir predstavlja kostur aplikacije, koji sadrži kompletan kod osnovnih funkcija cijelog sustava, a koji se može prilagoditi za potrebe odreĎene aplikacije2. Framework je skup klasa (i/ili programa) koje funkcioniraju da bi olakšale i ubrzale razvoj aplikacije. Prvi objektno orijentirani frameworci bili su MVC (engl. Model-View-Controller) za Smalltalk i MacApp za Apple aplikacije. Drugi važni okviri iz ove početne faze bili su ET++ i Interviews. Zanimljivo je primijetiti da je većina prvobitnih okvira bila kreirana za projektiranje korisničkog interfejsa. U povijesti frameworka takoĎer je važno spomenuti ime tvrtke Taligent, zajedničkog pothvata tvrtki Apple, IBM i Hewlett-Packard. Oni su razvili grupu alata za ubrzan razvoj aplikacija pod nazivom „Zajednička točka“ (engl. Common Point), koji se sastoji od više od stotinu objektno orijentiranih frameworka. Okviri su slični softverskim bibliotekama budući da i jedni i drugi predstavljaju kod koji se može ponovo koristiti upakiran u API (engl. Application Programming Interface). Biblioteke služe za ponovnu upotrebu koda, ali ne podrazumijevaju neku konkretnu strukturu aplikacije, već samo omogućuju funkcionalnosti pomoću kojih aplikacija radi. S druge strane, frameworci predstavljaju apstraktnu specifikaciju nekog tipa aplikacije. Ipak, neke biblioteke se pomalo ponašaju kao frameworci, a s druge strane ima fremeworka koji se mogu koristiti 2 Dr. Siniša Vlajid: Projektovanje programa (Skripta), FON, Beograd, 2004. 35 kao biblioteke klasa. To se može promatrati kao kontinuum sa tradicionalnim bibliotekama na jednom i odgovarajućim frameworkom na drugom kraju. Često se postavlja pitanje ometa li korištenje frameworka kreativnost programera? Na prvi pogled izgleda tako jer projektiranje softvera i dalje predstavlja spoj nauke i umjetnosti. MeĎutim, čak i svaki školovani umjetnik koristi metodologiju koja mu omogućuje da usmjeri svoj kreativni rad u željenom smjeru. Dobro izabrana metodologija zapravo oslobaĎa umjetnika od brige oko osnova; konkretno programer se može posvetiti dizajniranju boljeg korisničkog interfejsa (funkcionalno i vizualno), boljim performansama, itd. Programiranje u frameworku svodi se na graĎenje aplikacije od unaprijed definiranih programskih instrukcija nad konkretno definiranim podacima i pisanje specifičnih funkcija ovisnih o zahtjevu koji aplikacija mora zadovoljiti. 5.1.1. Definicije frameworka Ne postoji jedinstvena definicija frameworka te gotovo svatko tko se bavio ovom granom softverskog inženjerstva dao je svoju definiciju frameworka. Razornost definicija pokazuje da zapravo nema slaganja oko toga što je zapravo framework aplikacije. Različite definicije frameworka: Framework je biblioteka klasa koja sadrži uzore interakcije izmeĎu objekata. Sastoji se od konkretnih i apstraktnih klasa, specijalno kreiranih da se koriste zajedno. Framework je logička struktura koja klasificira i organizira složene informacije. Framework je skup kolaboracijskih koncepata oblikovanih za jednostavnu ponovnu upotrebu. Framework je konkretno, ali nekompletno rješenje za probleme velike važnosti koji se ponavljaju. Framework je aplikacija u kojoj se generički kod za standardne funkcionalnosti može selektivno prekriti korisničkim kodom kojim će se dobiti specifične funkcionalnosti. Framework je kostur aplikacije, koji sadrži kompletan kod osnovnih funkcija cijelog sustava, a koji se može prilagoditi za potrebe konkretne aplikacije. Klasa je za objekt isto ono što je framework za aplikaciju. Klasa je prototip, skica objekta, isto kao što je framework prototip, odnosno skica aplikacije. Frameworci su generatori aplikacija odreĎene domene. 36 5.1.2. Struktura frameworka Omotač (eng. wrapper) o Pojednostavljuje interfejs k tehnologiji o Smanjuje/eliminira ponavljajuće zadatke o Povećava fleksibilnost aplikacije korištenjem apstrakcije o Često se mogu ponovo koristiti bez obzira na projektantske odluke visokog nivoa Arhitektura o Arhitektura predstavlja način na koji se implementiraju i povezuju komponente sustava Metodologija o Usmjerava projektiranje i čini ga konzistentnim o Često se može ponovo koristiti bez obzira na zahtjeve aplikacije 5.1.3. Svojstva frameworka 1. Framework je konkretan. Drugim riječima, framework se sastoji od fizičkih komponenti, koje najčešće čine datoteke, biblioteke i slično. Uzori projektiranja nisu framework, već korisne ideje koje programer po svojoj procjeni realizira u toku izvoĎenja projekta. Za razliku od toga framework je jedna moguća realizacija. 2. Framework je nekompletan. To nije gotovo rješenje, već ostavlja programeru konkretna mjesta koja treba popuniti odgovarajućim kodom. Što je framework složeniji, to programer manje koda treba napisati, ali je sa druge strane teže naučiti kako koristiti framework. 3. Framework diktira rješenje. On odreĎuje arhitekturu sustava, dijelove koda koji su predviĎeni za prilagoĎavanje potrebama konkretne aplikacije, kao i način na koji će se to uraditi. 4. Framework pomaže u rješavanju problema koji se ponavljaju. 5. Frameworci rješavaju važne probleme. Iako je pojam važnosti relativan, treba imati na umu da se frameworci prave za rješavanje problema velike važnosti. 37 5.1.4. Prednosti korištenja frameworka Pojednostavljuje rad sa složenim tehnologijama. Povezuje pojedinačne komponente/objekte u korisne cjeline. Kod se implementira konzistentno, čime se obično postiže fleksibilnija aplikacija sa manje grešaka. Kod je jednostavniji za održavanje (čak i onima koji ga nisu implementirali). Frameworci postaju zaista korisni tek kada se učestalo koriste. Sa svakim novim projektom koji koristi framework, pogrešna učenja postaju sve manji problem, a produktivnost se povećava. Funkcionalnost koja treba premostiti ili zaobići nedostatke u frameworcima može uzrokovati više poteškoća i uzeti više vremena nego što bi bio slučaj kada bi se odreĎena funkcionalnost razvijala u potpunosti. Kvalitetni frameworci pružaju fleksibilnu strukturu koja omogućuje programeru modifikacije, nadopune ili ugradnju nekih novih funkcionalnosti. Ovo ne predstavlja funkcionalni nedostatak frameworka, već je više nedostatak na nivou različite implementacije tih koncepata. Programske pogreške (bug-ovi) i sigurnost u frameworku se mogu odraziti na svaku aplikaciju koja koristi taj framework. Osim toga, svaka aplikacija mora biti posebno testirana u odnosu na framework i popravljena ukoliko ima sigurnosnih propusta. Softverski framework predstavlja skup kodova ili biblioteka koji pružaju zajedničku funkcionalnost za cijelu klasu aplikacija. Za razliku od jedne biblioteke koja obično pruža jedan specifični dio funkcionalnosti, frameworci pružaju širi opseg funkcionalnosti korištenih od strane jednog tipa aplikacije. Umjesto ponovnog pisanja koda za uobičajenu programsku logiku, programer može iskoristiti framework koji će mu pružiti zahtijevanu funkcionalnost, znatno smanjujući vrijeme potrebno za kreiranje aplikacije, a istovremeno se smanjuje mogućnost pojavljivanja novih programerskih grešaka (bug-ova) i sigurnosnih propusta. Na primjer, frameworci web aplikacija mogu pružiti svu potrebnu funkcionalnost vezanu za upravljanje sesijom korisnika, skladištenjem podataka i izgledom web stranica. Postoji mnogo različitih tipova frameworka od kojih neki nude tek nešto malo više od individualnih modula različitih funkcionalnosti i skupova alata slabo povezanih nekim zajedničkim okvirom aplikacije, dok drugi nude skoro 38 gotovu aplikaciju sa strogo definiranom strukturom i drugim pravilima. Izbor pravog frameworka za dani projekt često zahtjeva od programera da balansira izmeĎu funkcionalnosti koju framework nudi i fleksibilnosti koja nakon toga ostaje. 5.2. Popularni PHP MVC frameworci Danas postoji veći broj gotovih framework-a za PHP, od koji su najpoznatiji CakePhp, CodeIgniter, Zend Framework, Symfony, … Njihova usporedba prikazana je na slici 1-1. Slika 9. Pregled postojećih PHP frameworka 5.2.1. Zend Framework Zend Framework je razvojno okruženje otvorenog koda za izradu web aplikacija i servisa zasnovan na programskom jeziku PHP 5. Zend je u potpunosti implementiran korištenjem objektno orijentirane paradigme. Komponente ovog web razvojnog okruženja oblikovane su tako da imaju što manji broj zavisnosti prema drugim komponentama. 39 Ovim se postiže suglasnost sa jednim od osnovnih koncepata objektno orijentiranog programiranja, a to je smanjivanje sprege (engl. coupling). Slaba spregnutost komponenata omogućuje programerima korištenje individualnih komponenata po potrebi. Zend zajednica ovu pogodnost naziva oblikovanje po potrebi (engl. use-at-will design). Iako ih je moguće koristiti odvojeno, komponente razvojnog okruženja Zend čine snažnu i proširivu biblioteku gotovih rješenja. Cilj Zenda je pružiti programerima robusnu okolinu za razvoj vlastitih web aplikacija i usluga. On nudi MVC implementaciju visoke učinkovitosti, apstraktni sloj nad bazom podataka koji olakšava upravljanje nad podacima i niz komponenata koje implementiraju prikaz HTML stranica te validaciju i filtriranje korisničkog unosa. Ostale komponente kao što su Zend_Auth i Zend_Acl omogućavaju autorizaciju i autentifikaciju korisnika prilikom pristupa resursu. Prednost razvojnog okruženja Zend Framework je velika količina gotovih komponenata koje se mogu iskoristiti za izradu vlastitih web aplikacija ili servisa, a te komponente su temeljito testirane i isprobane. Korištenjem gotovih testiranih komponenata smanjuje se vrijeme razvoja. Na primjer, validacija i/ili filtriranje korisničkog unosa česta je operacija u svim web aplikacijama. Ovisno o domeni aplikacije, korisnički unos ponekad može biti problematičan za analizu (npr. unos e-mail adrese). Zend sadrži niz gotovih komponenata koje implementiraju većinu poslovne logike vezane za filtriranje i validaciju unosa. Glavni sponzor projekta „Zend Framework“ je tvrtka Zend Technologies, ali i mnoge tvrtke su pridonijele razvoju ovog web razvojnog okruženja. Ovakva potpora privatnog sektora omogućava brži razvoj i kvalitetniju potporu. Dodatno, osnivači tvrtke Zend Technologies su Andi Gutmas i Zeev Suraski, koji se poznati kroz svoj rad na jezgri programskog jezika PHP. Smatra se da je njihova popularnost imala značajan utjecaj na širenje i prihvaćanje Zend okruženja u ranim fazama njegova razvoja. Tvrtke kao što su Google, Microsoft i Strikelron udružile su se sa Zend Technologies kako bi pružili gotove komponente, odnosno sučelja prema vlastitim servisima i drugim tehnologijama koje žele pružiti korisnicima razvojnog okruženja Zend. Osim službenih partnera, Zend Framework se sastoji od velike zajednice korisnika koji meĎusobno razmjenjuju informacije putem IRC kanala, foruma i elektroničke pošte. Razvoj Zenda usko je vezan za razvoj programskog jezika PHP. Točnije, nastao je u cilju proširivanja jezika i poboljšanja učinkovitosti u izradi aplikacija. 40 Nakon što je PHP 3.0 postao javno dostupan 1998. godine, Andi Gutmas i Zeev Suraski počeli su raditi na poboljšanju njegove jezgre. Cilj im je bio poboljšati performanse složenih aplikacija i podršku za modularnu izradu komponenata. Tadašnja treća inačica Zend okruženja nije bila u stanju učinkovito raditi sa složenim tipovima podataka. Svoje poboljšanje prozvali su Zend Engine. Prvi puta je predstavljena 1999. godine, a nova, četvrta inačica programskog jezika PHP bazirala se na Zend Engineu. Nova inačica je donijela brojne pogodnosti kao što su: podrška za više poslužitelja visoke performanse HTTP sjednice globalne poslužiteljske varijable (npr. $_GET, $_POST, $_COOKIE, $_SESSION) sigurniji način upravljanja korisničkim unosom PHP 4 i dalje nije bio bolji po pitanju objektnog modeliranja od inačice 3. Iako PHP nije bio stvoren za objektno orijentirano modeliranje mnogi programeri su ga ipak koristili. Nova inačica Zend razvojnog okruženja (Zend 2) sadrži većinu obilježja objektno orijentiranih jezika kao što su: prosljeĎivanje referenci (engl. Pass by Reference) kopiranje objekata (poznatije kao kloniranje) vraćanje objekata PHP inačica 5 je po uzoru na Zend 2 preuzela sve karakteristike objektne paradigme te se od inačice 5 programski jezik PHP satra potpuno objektno orijentiranim jezikom. Neke nove karakteristike, uz one koje uvodi Zend 2, su: destruktori sakupljači smeća3 vidljivost varijabli objekata (standardno: public, private, protected) usvajanjem objektne paradigme stvorilo se plodno tlo za daljnji razvoj biblioteka gotovih funkcionalnih modula (engl. Framework). Gotove komponente bile bi oblikovane po odgovarajućim oblikovnim obrascima što smanjuje meĎusobnu povezanost i time povećava 3 Sakupljači smeda – (engl. Garbage Collection) u računalnoj znanosti predstavlja oblik automatiziranog upravljanja memorije. Karakteristični su za jezike poput Java, C#, Python i drugi, a primarna zadada je brisanje objekata iz memorije koji se više ne koriste. 41 modularnost. Ta inicijativa s vremenom je sazrela u Zend Framework. Suraski smatra da će kroz nekoliko narednih godina trend razvoja aplikacija korištenjem jezika PHP naglo narasti, a primarni razlog će biti korištenje razvojnih okruženja poput Zenda. Budućnost razvoja samog razvojnog okruženja Zend bit će usmjerena na računarstvu zasnovanom na oblacima. Slika 10. Zend framework 5.2.2. CakePHP Framework CakePHP je web razvojno okruženje otvorenog koda izraĎeno u programskom jeziku PHP koje pruža proširivu arhitekturu za razvoj, održavanje i implementaciju programa. Razvoj Cake-a počinje u travnju 2005. godine. Inspiriran programom Ruby on Rails, Michal Tatarynowicz objavio ga je pod MIT licencom i omogućio da ga koriste zajednice programera. U srpnju 2005. godine, Larry E. Masters (poznatiji kao PhpNut) preuzeo je ulogu glavnog programera ovog frameworka. Od tada je nastalo nekoliko projekata i još uvijek se radi na razvoju novih. Dobro je dokumentiran framework, a oblikovan je pomoću koncepata Ruby on Rails razvojnog okruženja, koji može biti primijenjen u PHP4 i PHP5. Iako koristi mnoge koncepte Rails okruženja, ne radi se o pokušaju prevoĎenja tog jezika u PHP programski jezik. CakePHP se koristi za razvoj raznolikih aplikacija, a popis nekih stranica koje su izgraĎene pomoću CakePHP-a može se pronaći na službenim stranicama ili u literaturi [6]. Cake olakšava komunikaciju user interface-a sa bazom podataka, brz je, koristi MVC arhitekturu te time forsira objektno orijentirano programiranje. Neke osobine CakePHP-a: Kompatibilan je sa PHP4 i PHP5 Fleksibilan View Cashing Application Scaffolding Access Control List 42 View Helpers za AJAX, Javascript, HTML forme, … Radi iz bilo kojeg website poddirektorija Brz, fleksibilan template (PHP sintaksa sa Helper metodama) UgraĎena validacija Website directory nezavisan View caching U odnosu na Zend, CakePHP jednostavniji je za korištenje, pogotovo kod početnika. Iako oba okruženja nude veliku razinu modularnosti i uporabu gotovih komponenata, CakePHP većinu postavki i operacija definira i obraĎuje samostalno, dok Zend zahtjeva dublje poznavanje korištene komponente. Iz tog razloga pogodniji je za manje projekte gdje se u relativno malom vremenskom razdoblju mora razraditi funkcionalan prototip. Izrada istog projekta korištenjem Zend okruženja mogla bi trajati dulje ukoliko se odabrane komponente moraju dodatno konfigurirati ili preoblikovati. CakePHP zahtjeva znatno manje poznavanje objektnog programiranja budući da nije nužno ručno konfigurirati gotove komponente. Nedostatak okruženja CakePHP je manja fleksibilnost u odnosu na Zend. Zbog unaprijed pretpostavljenog ponašanja komponenti teško je unositi veće promijene bez mijenjanja samog izvornog koda komponente. Komponente Zend okruženja mogu promiijeniti svoje ponašanje jednostavnom manipulacijom postavki putem definiranog sučelja što ih čini vrlo fleksibilnim. Iz tog se razloga Zend okruženje koristi u većim projektima gdje se promijene zahtijeva dogaĎaju često. Slika 11. CakePHP framework 43 5.2.3. CodeIgniter Framework CodeIgniter je brzo, besplatno, objektno orijentirano web razvojno okruženje otvorenog koda pisano u programskom jeziku PHP. Cilj okruženja je omogućiti programerima razvoj složenih aplikacija korištenjem bogatih biblioteka gotovih funkcija. Sama konfiguracija dosta je jednostavna te nije potrebna baza za svaki kontroler, kao što je to primjer u CakePHP-u. Prva inačica okruženja CodeIgniter izdana je 28.02.2006. godine i od tada do danas je prešao veliki put i razvio se u jedan od najboljih PHP frameworka. Trenutna stabilna inačica je 2.0. Okvirno se bazira na MVC obrascu. U ovom obrascu, na kojem je zasnovana većina frameworka, model služi za bilo kakvu komunikaciju s bazom podataka, view služi za prikaz podataka, a u kontroleru se nalazi sva programska logika, te kontroler povezuje podatke iz modela i prikazuje ih u viewu. Točnije, kontroleri i pogledi su nužni dio okruženja, ali model nije i rijetko se koristi. Ovo razvojno okruženje ističe se brojnim svojim performansama. Podrazumijeva rad po odreĎenom standardu koji omogućuje jednostavan rad i lako održavanje. TakoĎer se jednostavnije snaći u kodu koji je pisao netko drugi bez većih poteškoća, kao i bržu adaptaciju onoga tko ne sudjeluje u izradi projekta od samog početka. Omogućava i ponovno korištenje koda, što znači da ukoliko je jednom napravljena, na primjer, login forma ona se može koristiti uz minimalne izmjene i u daljnjem radu. Najbrži je od prethodno spomenutih okruženja. CodeIgniter ne zahtjeva korištenje naredbenog retka (konzole) kao većina frameworka što pridonosi jednostavnosti korištenja. TakoĎer pruža svu slobodu u kodiranju i imenovanju funkcija u čemu nema nekih ograničenja. Jedan od tvoraca programskog jezika PHP, Rasmus Ledford, na konferenciji frOSCon 2008. godine pohvalio je CodeIgniter okruženje zbog visokih performansi, velike zajednice korisnika i jednostavnosti korištenja. Instalacija CodeIgnitera je jednostavna i lako se konfigurira. Pogodan je za izradu većih aplikacija te omogućava povezivanje sa velikim brojem tipova baza (MySQL, MySQLi, MS SQL, Oracle, SQLite, ODBC) kao i povezivanje sa više baza podataka unutar jedne aplikacije. 44 Ipak, postoje odreĎene mane ovog okruženja, kao što su: podrška za predloške (engl. templates) korisničke kontrole integracija sa programskim jezikom jQuery kompatibilnost sa PHP inačicom 4 Zadnja stavka (kompatibilnost sa PHP 4) se broji kao mana iz razloga što se u program uključuje velika količina nepotrebnog koda što smanjuje preglednost i održavanje. Slika 12. CodeIgniter framework 5.2.4. Yii framework Yiiframework je web razvojno okruženje otvorenog koda izraĎeno u programskom jeziku PHP. Yii je akronim za „Yes It Is!“. Yii projekt započet je početkom 2008. godine u cilju poboljšanja PRADO4 web razvojnog okruženja. Nedostatak PRADO okruženja je bio spor odaziv prilikom prevoĎenja složenih stranica weba, te nije bio pogodan za početnike i mnoge komponente za obavljanje raznih funkcija kao što su pristup bazi podataka i obavljanje upita, validacija korisničkog unosa, automatizirano generiranje kompleksnih WSDL specifikacija za servise, pretpohranjivanje (engl. caching) sadržaja i drugo. Ujedno je i jedino razvojno okruženje za programski jezik PHP koji nalikuje okruženju ASP.NET. Ipak, nije primarni izbor za početnike, ali niti za veće projekte. Razlog tomu je manjak funkcionalnosti u odnosu na okruženja poput CakePHP, CodeIgniter i Zend. 4 PRADO – web razvojno okruženje temeljeno je na događajima i komponentama. PRADO uvodi nove koncepte u razvoj web aplikacija kao što su događaji i svojstva. Ovi novi koncepti zamjenjuju postojede koncepte procedura, URL-a i parametara u upitima koji se javljaju u ostalim okruženjima. 45 Dodatno, Yii je relativno mlado razvojno okruženje. U vrijeme pisanja nalazi se u inačici 1.0., što je apriorni nedostatak zbog mogućih neuočenih grešaka i znatno manje zajednice korisnika u odnosu na ostala okruženja. Slika 13. Yii framework 5.2.5. Symfony framework Symfony Framework je PHP framework otvorenog koda (open source) za web aplikacije. Agencija Sensi Labs stvorila je ovaj framework za potrebe vlastitih web stranica. Symfony je izdan 2005. godine pod MIT Open Source licencom te je danas jedan od vodećih frameworka za PHP razvoj web sadržaja. Odlikuje se bogatstvom sadržaja, podrškom velike zajednice, profesionalnom podrškom itd. Brojne stranice su izgraĎene upravo korištenjem Symfony frameworka – Yahoo!, Daillymotion, Opensky.com, Exercise.com pa čak i phpBB. Korištenje nekog frameworka može biti jako dobar izbor zbog više činjenica. U tekstu ispod navedene su prednosti zašto je dobro koristiti baš ovaj framework umjesto nekog drugog frameworka: Ugled – već nakon pokretanja projekta Symfony 2005. godine, profesionalci u području razvoja web usluga su ga prihvatili zbog lako prepoznatljivog i stabilnog okruženja. Zahvaljujući svojoj aktivnoj zajednici i razvojnim inženjerima, Symfony se kontinuirano razvija. Trajnost – tvrtka koja je razvila Symfony, Sensio, nastala je prije više od 12 godina. Ta ista tvrtka danas vakodnevno koristi Symfony framework za vlastite projekte. 46 Dizajniran od strane profesionalca, i za profesionalce, Symfony je prije svega pragmatičan alat sa odličnim mogućnostima za primjenu u realnoj okolini. Sensio i danas pruža podršku za ovaj framework, ali je možda još važnija podrška rastuće zajednice i mnogih kompanija koje su uložile u razvoj frameworka. Preporuke – brojni profesionalci i tvrtke preporučuju upravo ovaj framework. Veliki broj stranica i aplikacija je odabralo Symfony. Inovacije – Symfony ima najbolje karakteristike frameworka: brzina, fleksibilnost, ponovno upotrebljive komponente itd. Nastoji prilagoditi inovacije i ideje svijetu PHP-a. takoĎer treba spomenuti i konstantna poboljšanja koja dovode do povećane produktivnosti razvojnih inženjera. Resursi – bogatstvo resursa je odlika Symfony frameworka. Od podrške koju pruža Sensio do podrške zajednice uvijek je moguće pronaći odgovore na postavljena pitanja. Vodeći se principom „nedokumentirana linija je linija koja ne postoji“ mogu se pronaći brojna djela posvećena upravo Symfony frameworku koja pomažu razvoju stranica i aplikacija. Interoperabilnost – Symfony podržava trenutne standarde PHP-a: PHPUnit, konvencije nazivanja klasa itd. TakoĎer omogućuje korisniku korištenje dijelova vlastitog softvera bez korištenja cijelog frameworka. Toliko je interoperabilan da i sam koristi dijelove vanjskog softvera (ORM Doctrine, Swiftmailer i slično). Slika 14. Symfony framework 47 6. Primjer web aplikacije 6.1. Struktura PHP web aplikacije izgrađene pomoću CodeIgniter-a CodeIgniter je jedan od najpopularnijih PHP frameworka zasnovanih na MVC arhitekturi. U najvećoj mjeri svoju popularnost duguje jednostavnosti i maloj liniji učenja, ali je privlačan i zbog činjenice da sa njegovom instalacijom programer dobiva mnogo definiranih obrazaca i na njemu je samo da odluči koje će koristiti i kako. On korisniku nudi predefinirane obrasce za Model, View i Controller, koji su definirani kao klase (sa prefiksom CI kao CodeIgniter, tj. CI_Model itd. ) koje programer treba naslijediti i zatim sa lakoćom implementirati. Osim njih, CodeIgniter programeru definira i znatan broj drugih rješenja, kao pristupe bazi, te autoloader klasa i funkcija koje su potrebne širom aplikacije. CodeIgniter dolazi sa predefiniranom strukturom, koju programer može modificirati po svojim željama. U toj strukturi, ističu se direktoriji controllers, models i views, gdje su u aplikaciji iz primjera smještene MVC komponente. Slika 15. Direktorij MVC PHP aplikacije Analizom prethodno napisane PHP web aplikacije, koja nije koristila MVC pristup, donesen je zaključak da je riječ o aplikaciji kojoj je potreban jedan kontroler. 48 Stoga je u controllers direktoriju dodana skripta site.php i u njoj definirana klasa Site, koja nasljeĎuje CodeIgniter-ovu definiranu klasu za kontroler, CI_Controller. site.php <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Site extends CI_Controller { public function index() { $this->load->view('html_head'); $this->load->view('header'); $this->load->view('menu'); $this->load->view('pocetna'); $this->load->view('footer'); } * * * public function apartmani_objekti($action = false, $param = false) { $this->load->model('Apartmani_objekti_model'); if(isset($action)) { switch ($action) { case 'delete': $name = $this->Apartmani_objekti_model->getObjektName($param); $this->Apartmani_objekti_model->delete($param); $data['deleted'] = $name; break; case 'addedit': if(isset($param)){ $data['obj'] = $this->Apartmani_objekti_model->get($param); } $this->load->model('Mjesta_model'); $data['mjesta'] = $this->Mjesta_model->getAll(); $this->load->view('html_head'); $this->load->view('header'); $this->load->view('menu'); $this->load->view('add_edit_apartman', $data); $this->load->view('footer'); break; case 'insert': if( $this->Apartmani_objekti_model->insert($_POST) ){ $this->load->view('apartman_dodan', $_POST); } else { echo "Nije uspjelo.Pokusajte opet"; } break; case 'update': if( $this->Apartmani_objekti_model->update($_POST) ){ $this->load->view('apartman_updatean', $_POST); } else { echo "Nije uspjelo.Pokusajte opet"; } break; default: # code... break; } } 49 if( $action != 'addedit' && $action != 'insert' && $action != 'update'){ $data['objects'] = $this->Apartmani_objekti_model->getAllObjects(); //echo json_encode($data); $this->load->view('html_head'); $this->load->view('header'); $this->load->view('menu'); $this->load->view('apartmani_objekti', $data); $this->load->view('footer'); } } } Codeigniterov kontroler treba posjedovati metodu index, koja je početna metoda koju kontroler izvodi. Ostale metode se pozivaju iz url-a. Naime, CodeIgniter interpretira url na sljedeći način: www.primjer.com/kontroler/metoda/parametar1/parametar2 Dakle, CodeIgniter iz url-a zaključuje koji kontroler trenutno upravlja aplikacijom. Pri tome, zahtjeva da se jedan kontroler postavi kao početni, što je u ovom slučaju Site. Ukoliko metoda nije specificirana, pozvati će se index metoda. U suprotnom, potrebno je u url-u navesti metodu. Za poziv metode apartmani_objekti, potrebno je pozvati www.primjer.com/site/apartmani_objekti Ovako pozvana metoda će, kao što se može vidjeti u kodu, pozvati Apartmani_objekti_model. Model je definiran tako, da služi isključivo za dohvat i manipulaciju podataka iz baze podataka: apartmani_objekti_model.php <?php class Apartmani_objekti_model extends CI_Model { function __construct() { parent::__construct(); } function getAllObjects() { $this->db->select('*'); $this->db->from('apartmani_objekti'); $this->db->join('mjesto', 'mjesto.ID_mjesto = apartmani_objekti.ID_mjesto'); //$query = $this->db->get(); return $this->db->get()->result(); } function delete($id) { 50 $this->load->model('Apartmani_smjestaj_model'); $this->Apartmani_smjestaj_model->deleteByObject($id); $this->db->where('ID_objekta', $id); $this->db->delete('apartmani_objekti'); } function get($id) { $this->db->where('ID_objekta', $id); $this->db->from('apartmani_objekti'); return $this->db->get()->row(); } function getObjektName($id) { $this->db->select('naziv_objekta'); $this->db->where('ID_objekta', $id); $this->db->from('apartmani_objekti'); return $this->db->get()->row(); } function insert($data) { unset($data['posalji']); $this->db->insert('apartmani_objekti', $data); return true; } function update($data) { unset($data['posalji']); $this->db->where('ID_objekta', $data['ID_objekta']); $this->db->update('apartmani_objekti', $data); return true; } } Ovaj model sadrži sve osnovne CRUD metode (CReate, Update, Delete – stvori, izmjeni, pobriši) kao i metodu za ispis svih apartmana. Upravo metoda za ispis (getAllObjects) se poziva pri pozivu apartmani_objekti metode kontrolera. U toj metodi, kao i unutar ostalih funkcija, može se vidjeti još jedna osobina CodeIgnitera, a to je način pisanja SQL upita. CodeIgniter ima svoj objekt za manipuliranje bazom podataka, te se u većini slučajeva ne mora pisati sam upit, već se preko tog objekta može framework-u prepustiti formiranje upita preko njegovih pravila. U slučaju da se kontrolerovoj funkciji apartmani_objekti u url-u pridruži još parametara, ta funkcija će pristupiti nekoj drugoj metodi modela. Kao što se može vidjeti u kodu, apartmani_objekti metoda kontrolera očekuje 2 parametra: action i param. Prvi parametar odreĎuje koja će se metoda modela pozvati, a druga koji parametar će se slati toj metodi. 51 Primjerice, ukoliko se pošalje url: www.primjer.com/site/apartmani_objekti/delete/1 pozvati će se model Apartmani_objekti, i njegova metoda delete, koja očekuje parametar koji tumači kao id zapisa u bazi apartmana kojeg želimo pobrisati. TakoĎer, i upit za brisanje iz baze, može se izvršiti preko CodeIgniter-ovog db objekta. Problem nastaje, jer se u drugim tablicama u bazi, nalazi id našega apartmana. U tom slučaju, CodeIgniter-ov db objekt neće htjeti izvršiti akciju brisanja. Za razliku od nekih drugih frameworka, CodeIgniter nije dovoljno „pametan“ da sam pobriše zavisne zapise u bazi. Zbog toga, prije nego se pristupi akciji brisanja, model Apartmani_objeti poziva model Apartmani_smjestaj, te mu govori da pobriše sve zapise, gdje je strani ključ apartmani_id jednak id-u kojeg želimo pobrisati. Taj model takoĎer, ukoliko postoje, poziva zavisne modele da pobrišu podatke koji više nisu relevantni. apartmani_smjestaj_model.php <?php class Apartmani_smjestaj_model extends CI_Model { function __construct() { parent::__construct(); } function delete($id) { $this->db->where('ID_smjestaj', $id); $this->db->delete('apartmani_smjestaj'); } function deleteByObject($id_object) { $this->db->select('ID_smjestaj'); $this->db->from('apartmani_smjestaj'); $smjestajs = $this->db->get()->result(); //echo $smjestajs; $this->load->model('Slike_model'); $this->load->model('Rezervacija_model'); foreach ($smjestajs as $smjestaj) { $this->Slike_model->deleteBySmjestaj($smjestaj->ID_smjestaj); $this->Rezervacija_model->deleteBySmjestaj($smjestaj->ID_smjestaj); $this->delete($smjestaj->ID_smjestaj); } } } mjesta_model.php <?php class Mjesta_model extends CI_Model { function __construct() { 52 parent::__construct(); } function getAll() { $this->db->select('*'); $this->db->from('mjesto'); //$query = $this->db->get(); return $this->db->get()->result(); } } rezervacija_model.php <?php class Rezervacija_model extends CI_Model { function __construct() { parent::__construct(); } function deleteBySmjestaj($ID_smjestaj) { $this->db->where('ID_smjestaj', $ID_smjestaj); $this->db->delete('rezervacija'); } } slike_model.php <?php class Slike_model extends CI_Model { function __construct() { parent::__construct(); } function deleteBySmjestaj($ID_smjestaj) { $this->db->where('ID_smjestaj', $ID_smjestaj); $this->db->delete('slike'); } } Prilikom izvršavanja metode brisanja, kontroler je uzeo podatke o apartmanu koji je pobrisao i spremio ih u objekt $data. Kontroler, nakon što je model izvršio manipulacije nad bazom, poziva View komponente sustava. U ovim datotekama bi, po pravilu, trebao biti definiran samo prikaz naše stranice, uz što manje logike, koja bi trebala biti svedena na provjeru podataka koji su tom pogledu proslijeĎeni. Pogled se poziva korištenjem load→view funkcije, koja kao parametar prima naziv php datoteke koja se nalazi u views direktoriju, te opcionalno parametara koje je model dohvatio i obradio. Pri tome, kontroler može dohvatiti više pogleda, a na programeru koji se brine o toj komponenti je da se pobrine da se svi pogledi učitaju ispravno. 53 View : apartmani_objekti <?php echo '<div id="pregled_apartmana" >'; echo "<h2>Pregled apartmana</h2>"; if(isset($deleted)){ echo '<p>Pobrisan je objekt '. $deleted->naziv_objekta .'</p>'; } ?> <table class=\"sample\"> <tr><th>  ŠIFRA   </th> <th>    NAZIV     </th> <th>  VLASNIK   </th> <th>    ADRESA     </th> <th>   MJESTO   </th> <th></th><th></th> </tr> foreach($objects as $obj) { echo "<tr>"; echo "<td>".$obj->ID_objekta."</td>"; echo "<td>".$obj->naziv_objekta."</td>"; echo "<td>".$obj->vlasnik."</td>"; echo "<td>".$obj->adresa."</td>"; echo "<td>".$obj->naziv_mjesto."</td>"; echo "<td><a href=".base_url()."index.php/site/apartmani_objekti/delete/".$obj->ID_objekta." \"onclick=\"return confirm('Želite li stvarno pobrisati');\">Briši </a></td>"; echo "<td><a href='".base_url()."index.php/site/apartmani_objekti/addedit/".$obj>ID_objekta."'>Ažuriraj</a></td>"; echo "</tr>"; } echo "</table>"; echo "</br></br></br><a href='".base_url()."index.php/site/apartmani_objekti/addedit'>Dodaj novi objekt</a>"; echo '</div>'; Na vrlo sličan način pozivaju se i metode za dodavanje i izmjenu postojećeg apartmana. Ove metode, zbog svoje specifičnosti, pozivaju drugi pogled, onaj sa formom za unos / izmjenu postojećih podataka. Budući da je forma koju treba ispuniti praktički ista, a zahvaljujući činjenici da se u CodeIgniteru pogledu mogu pridružiti i podaci, moguće je koristiti isti pogled, uz upotrebu malo logike ( provjera postoje li podaci ). TakoĎer, u ovisnosti o tome jesu li primljeni podaci o ureĎivanom objektu, forma će imati drugu akciju po završetku. 54 View: add_edit_apartman.php <?php if(!empty($obj)){ $action = '../update'; $selected_mjesto = $obj->ID_mjesto; $naslov = 'UREDIVANJE APARTMANA '.$obj->naziv_objekta; $button_label = 'UREDI'; } else { $action = 'insert'; $selected_mjesto = 0; $naslov = 'DODAVANJE NOVOG OBJEKTA APARTMANA'; $button_label = 'DODAJ'; } ?> <div > <div > <div > <div id="dodavanje_apartmana" > </br></br></br> <h1> <?php echo $naslov;?></h1> </div> <div class="container"> <form action="<?php echo $action; ?>" method="POST" class="dodaj"> <?php if(!empty($obj)){ echo '<input type="hidden" name="ID_objekta" value = '.$obj>ID_objekta.'>'; } ?> <span>NAZIV OBJEKTA: </br> <input type="text" name="naziv_objekta" value="<?php if(!empty($obj)) { echo $obj->naziv_objekta;}?>"> <span><br> <span>VLASNIK: </br> <input type="text" name="vlasnik" value="<?php if(!empty($obj)) { echo $obj->vlasnik;}?>"> <span><br> <span>ADRESA: </br> <input type="text" name="adresa" value="<?php if(!empty($obj)) { echo $obj->adresa;}?>"> <span><br> <span>TELEFON: </br> <input type="text" name="telefon" value="<?php if(!empty($obj)) { echo $obj->telefon;}?>"> <span><br> * * * <span> MJESTO: </br> <select name="ID_mjesto"> <option value="odabir" value="<?php if(!empty($obj)) { echo $obj>ID_mjesto;}?>"> Odaberite mjesto </option> </br></br></br> <?php foreach ($mjesta as $mjesto) { echo "<option value='".$mjesto->ID_mjesto."' ".($mjesto->ID_mjesto == $selected_mjesto ? 'selected' : '') .">". $mjesto->naziv_mjesto. "</br></br></option></br></br></br>"; } ?> </select> <span> 55 </br></br><input type="submit" name="posalji" value="<?php echo $button_label; ?>"><br> </form> </div></div></div></div> Iz ovog kratkog primjera, može se vidjeti logička podjela komponenti u aplikaciji. Dok se u klasičnoj PHP web aplikaciji, unutar jedne skripte mogu naći mnoge komponente, kao što su markup (HTML), SQL upiti, obrada podataka, pozivanje drugih skripti i slično, u prezentiranoj aplikaciji toga nema. Podjela je jasno učinjena: kontroler se prvi poziva, te mu je zadatak da na osnovu poziva koji je korisnik napravio odluči što treba učiniti, te koje modele i poglede pozvati. Modelu nareĎuje da mu dohvati potrebne podatke, i po potrebi ih izmjeni kao i da manipulira bazom podataka. To je jedini zadatak koji model treba imati, te se isti, kao ni kontroler, uopće ne treba brinuti kako će se podaci prikazati. To je zadaća pogleda, kojeg nakon dohvata podataka poziva kontroler. 56 7. Zaključak Razvojem objektno orijentiranog programiranja javlja se potreba za razdvajanjem dizajniranja sučelja od ostalih dijelova sustava. Jedan od takvih sučelja je MVC (Model-View-Controller) obrazac softverske arhitekture koji dijeli aplikaciju na tri osnovne komponente: model, pogled i kontroler. MVC specificira gdje će biti smješten odreĎeni dio aplikacijske logike. Osnovna prednost MVC arhitekture je razdvajanje projekta na smislene i odvojene cjeline, što predstavlja veliku prednost pri izradi velikih projekata na kojima radi više osoba. Iz toga proizlazi i druga prednost koja se odnosi na izmjenu, nadogradnju i budući razvoj. Ovakav pristup omogućava laganu izmjenu jednog od elemenata bez velike intervencije u druge elemente, kao i ponovo korištenje već napravljenih elemenata. Mnoga razvojna okruženja prate arhitektonski obrazac MVC (engl. Model-View-Controller) koji omogućuje razdvajanje modela podataka s poslovnom pravilima od korisničkog sučelja. Ovo svojstvo se općenito smatra dobrom praksom obzirom da modularizira kod, potiče ponovnu uporabu koda i omogućuje više sučelja koji se mogu primjenjivati. Razvojna okruženja stvorena su s ciljem jednostavnijeg stvaranja i održavanja velikih web aplikacija zasnovanih na PHP programskom jeziku. Sadrže bogat skup gotovih komponenti koje pokrivaju velik dio učestalih potreba prilikom izrade web aplikacija. Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na jednu višu, profesionalniju razinu. Radi se o PHP paketima (php framework) koji služe kao alati za brži i sigurniji razvoj Internet aplikacija. Njihova namjena je prvenstveno bila da se gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju gradi, problemima organizacije datoteka, klasifikacije objekata i slično. Za praktični dio ovog rada odabran je CodeIgniter framework koji je pogodan je za izradu većih aplikacija te omogućava povezivanje sa velikim brojem tipova baza, kao i povezivanje sa više baza podataka unutar jedne aplikacije. To je web razvojno okruženje koje se odlikuje visokim performansama, velikom zajednicom korisnika te jednostavnosti korištenja. 57 Cilj rada bio je pokazati prednosti korištenja ovakve tehnologije pri razvoju web aplikacije u odnosu na arhitekturu koju sam koristila pri izradi projekta prošle akademske godine, a primjeri skripti iz tog projekta navedeni su u četvrtom poglavlju ovog rada, što je i pokazano. 58 8. Literatura [1] Deacon, J.; (2013.); Model-View-Controller Arhitecture; <http://www.jdl.co.uk/briefings/MVC.pdf>; [04.04.2014.] [2] Feifan, Zhou; (2011.); Design Patterns: Model-View-Controller; <http://cupsofcocoa.com/2011/08/13/design-patterns-model-view-controller/>; [05.04.2014.] [3] Cake Software Foundation; (2012.); CakePHP: CakePHP Cookbook Documentation, <http://book.cakephp.org/2.0/_downloads/en/CakePHPCookbook.pdf >; [01.08.2014.] [4] Bari, Ahnsanul i Syam, Anupom; (2007.); CakePHP: Application Development; Packt Publishing; <http://www.it-ebooks.info/read/2489/>; [11.06.2014.] [5] Upton, David; (2007.); CodeIgniter for Rapid PHP Application Development; Packt Publishing; < http://www.it-ebooks.info/read/2760/>; [14.04.2014] [6] Makarov, Alexander; (2013.); Yii Application Development Cookbook; 2nd Edition; <http://it-ebooks.info/book/2867/>; [14.04.2014.] [7] CakePHP tutorijali; dostupno na Internet adresi: <http://www.lynda.com/CakePHPtutorials/Comparing-Zend-Symfony-CakePHP-CodeIgniter/92562/99630-4.html>; [01.06.2014.] [8] Upute za korištenje PHP jezika; dostupno na Internet adresi: <http://www.php.net > [04.05.2014.] [9] [10] Pitt, C.; (2012.); Pro PHP MVC; Apress CodeIgniter tutorijali; dostupno na Internet adresi: < http://www.lynda.com/CakePHPtutorials/MVC-Frameworks-Building-PHP-Web-Applications/92562-2.html>; [05.04.2014.] [11] Krasner, Glenn E. i Pope, Stephen T.; (1968.); A Cookbook for Using the Model-ViewController User Interface Paradigmi n Smalltalk-80; JOOP [12] Model-View-Controller (MVC) Architecture; dostupno na Internet adresi: <http://www.jdl.co.uk/briefings/mvc.html>; [12.06.2014.] [13] The MVC pattern in theory and practice, dostupno na Internet adresi: <http://warp.povusers.org/programming/mvc.html>; [12.06.2014.] [14] Gamma, E., Helm, R., Johnson, R., Vlissides, J.; (1994.); Design Patterns: Elements of Reusable Object-Oriented Software 59 Dodatak A: Popis slika Slika 1. Dijagram razreda MVC uzorka – konceptualni pogled.............................................................. 8 Slika 2. Relacijski model podataka ......................................................................................................... 9 Slika 3. MVC obrazac ........................................................................................................................... 12 Slika 4. MVC arhitektura za web .......................................................................................................... 13 Slika 5. Konceptualni pogled: Dijagram razreda aktivnog modela MVC uzorka ................................. 15 Slika 6. PHP: Hypertext Pretprocessor .................................................................................................. 16 Slika 7. Primjer jednostavne PHP skripte.............................................................................................. 19 Slika 8. Direktorij PHP web aplikacije.................................................................................................. 27 Slika 9. Pregled postojećih PHP frameworka........................................................................................ 39 Slika 10. Zend framework ..................................................................................................................... 42 Slika 11. CakePHP framework .............................................................................................................. 43 Slika 12. CodeIgniter framework .......................................................................................................... 45 Slika 13. Yii framework ........................................................................................................................ 46 Slika 14. Symfony framework............................................................................................................... 47 Slika 15. Direktorij MVC PHP aplikacije ............................................................................................. 48 60 Dodatak B: Popis oznaka i kratica MVC (eng. Model-View-Controller) ASP (eng. Active Server Pages) HTTP (eng. Hypertext Transfer Protocol) HTML (eng. Hypertext Markup Language) SQL (eng. Structured Query Language) URL (eng. Uniform Resource Locator) GUI (eng. Graphical User Interface) PHP (eng. Pesonal Home Page Tools) ACM (eng. Association for Computing Machinery) IEEE-CS (eng. The Institute of Electrical and Electronics Engineers - Computer Society) NATO (eng. The North Atlantic Treaty Organisation) IBM (eng. The International Business Machines Corporation) Md (eng. Domain Model) Ma (eng. Application Model) API (eng. Application programming interface) CSS (eng. Cascading Style Sheets) CGI (eng. Common Gateway Interface) PHP/FI (eng. Personal Home Page/Forms Interpreter) XML (eng. Extensible Markup Language) SQL (eng. Structured Query Language) LDAP (eng. Lightweight Directory Access Protocol) IMAP (eng. Internet Message Access Protocol) SNMP (eng. Simple Network Management Protocol) NNTP (eng. Network News Transfer Protocol) POP3 (eng. Post Office Protocol 3) COM (eng. Component Object Model Technologies) JSP (eng. Java Server Pages) GNU (eng. Gnu's Not Unix) PERL (eng. Practical Extraction and Report Language) PECL (eng. The PHP Extension Community Library) 61
© Copyright 2024 Paperzz