91
Visoka škola strukovnih studija za informacione i komunikacione tehnologije 2013 Napredno web programiranje Materijal za auditorne i laboratorijske vežbe dr Nenad Kojić Marko M Spasojević

Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije

2013

Napredno web programiranje

Materijal za auditorne i laboratorijske vežbe dr Nenad Kojić Marko M Spasojević

Page 2: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Priprema za rad u zend framework

1. Potrebno je preuzeti verziju 1.12.0 zend frameworkhttp://framework.zend.com/downloads/latest

2. Nakon toga potrebno je ra3. Proverite da li možete da izvršite komandu

morate dodati putanju do fajla (podešava se u okviru Windows operativnog sistema MyComputer (desni taster)Properties-> Tab Advanced>Edit i na postojeći tekst dopisati putanju do php.exe fajla. Putanje se razdvajaju sa ;)

4. Nakon toga je potrebno datoteke poddirektorijumu bin) XAMPP onda se nalazi u automatizuje neke zadatke u okviru Ako koristite XAMPP php/PEAR direktorijumu. Verzija koja se tu nalazi može da vi preuzeli i koja se nalazi u oko verzije koju želite da koristite možete se odlu

a. da koristite postojevašeg direktorijuma

b. da koristite novi koji se nalazi u okviru putanja u okviru direktive

c. se izvrši kopiranje xampp/php/PEAR

5. Ozvršite komandu zf show version6. Ako dobijete rezultat kao na slici onda je sve ura

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Priprema za rad u zend framework-u

Potrebno je preuzeti verziju 1.12.0 zend framework-a sa sajta http://framework.zend.com/downloads/latest

potrebno je raspakovati preuzeti fajl u okviru downloadProverite da li možete da izvršite komandu php –v u bilo gde u konzoli ako ne onda morate dodati putanju do fajla php.exe u Environment Variables->path(podešava se u okviru Windows operativnog sistema MyComputer (desni taster)

> Tab Advanced->Dugme Evironmet Variables->System Variablesći tekst dopisati putanju do php.exe fajla. Putanje se razdvajaju sa ;)

a je potrebno datoteke zf.bat i zf.php (nalaze se u okviru Zend biblioteke u prekopirati u direktorijum u kome se nalazi php.exe

XAMPP onda se nalazi u xampp/php) . Naime, zf.bat predstavlja pomoautomatizuje neke zadatke u okviru Zend Framework-a recimo izradu kontrolera itd.Ako koristite XAMPP Zend Framework najčešće dolazi zajedno u paketu i nalazi se u

direktorijumu. Verzija koja se tu nalazi može da se razlikuje od one koju ste vi preuzeli i koja se nalazi u library direktorijumu Zend Frameworkoko verzije koju želite da koristite možete se odlučiti za sledeće opcije:

da koristite postojeći pri čemu će vam biti nedostupan onaj kojivašeg direktorijuma library ili da koristite novi koji se nalazi u okviru library tako što se u fajlu putanja u okviru direktive include_path ili se izvrši kopiranje Zend Frameworka iz Zend/library u direktorijum

php/PEAR zf show version (bilo gde u konzoli)

Ako dobijete rezultat kao na slici onda je sve urañeno kako treba

Slika 1 – provera da li je Zend instaliran

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

download direktorijuma konzoli ako ne onda

>path promenljivu (podešava se u okviru Windows operativnog sistema MyComputer (desni taster)->

>System Variables->Path-i tekst dopisati putanju do php.exe fajla. Putanje se razdvajaju sa ;).

nalaze se u okviru Zend biblioteke u php.exe (ako se koristi

predstavlja pomoćnu skriptu koja a recimo izradu kontrolera itd.

e dolazi zajedno u paketu i nalazi se u se razlikuje od one koju ste

Zend Framework-a. Ako se dvoumite e opcije:

e vam biti nedostupan onaj koji se nalazi u okviru

tako što se u fajlu php.ini doda

u direktorijum

Page 3: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Kreiranje projekta

1. Pozicionirajte se na xampp/2. Izvršiti komandu zf create project sajt

kompletnom strukturom

3. Nakon toga potrebno je kreirati sajtova) . Na apache-u je potrebno u fajl upisati sledeće i omoguć

4. Potrebno je izvršiti editovanje

poveže vaš novi fiktivni domen sa ip adresom lokalnog rac:\WINDOWS\system32

Napomena: Ako menjate ovaj fajl na WindowsAko menjate fajl na XPzatim da ga editujete i tako izmenjenog vratite (prekokviru direktorijuma etc

5. Nakon toga je potrebno restartovati server (iskljuda startujete sajt vezba

127.0.0.1 vezba1

<VirtualHost *:80> DocumentRoot " ServerName v1.nawp.ict <Directory "[X]:/xampp/htdocs/sajt DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *:80> ServerName localhost DocumentRoot "</VirtualHost>

zf create project vezba1.nawp.ict

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

xampp/htdocs direktorijum ako koristite XAMPPzf create project sajt.nawp.ict , nakon čege se kreira projekat sa

kompletnom strukturom

Nakon toga potrebno je kreirati vhost (omogućava da se na jednom serveru postavi više u je potrebno u fajl xampp/apache/config/extra/httpd

e i omogućiti direktivu (ukloniti # ) NameVirtualHost *:80

Potrebno je izvršiti editovanje hosts fajla u okviru windows-a kako bi poveže vaš novi fiktivni domen sa ip adresom lokalnog računara. Fajl se nalazi u

system32\drivers\etc\hosts .

: Ako menjate ovaj fajl na Windows-u 7 morate to raditi kao administrator. Ako menjate fajl na XP-u onda morate fajl da prekopirate u neki drugi direktorijum, zatim da ga editujete i tako izmenjenog vratite (prekopirate preko postoje

etc. Nakon toga je potrebno restartovati server (isključiti/uključiti apache

vezba.nawp.ict , trebalo bi da dobijete prikaz kao na slici.

.1 vezba1.nawp.ict

DocumentRoot "[X]:/xampp/htdocs/sajt.nawp.ict/public" ServerName v1.nawp.ict

:/xampp/htdocs/sajt.nawp.ict/public"> DirectoryIndex index.php AllowOverride All Order allow,deny

ServerName localhost DocumentRoot "[X]:\xampp\htdocs"

zf create project vezba1.nawp.ict

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

direktorijum ako koristite XAMPP ege se kreira projekat sa

ava da se na jednom serveru postavi više

apache/config/extra/httpd-vhosts.conf NameVirtualHost *:80

a kako bi windows mogao da Fajl se nalazi u

u 7 morate to raditi kao administrator. u onda morate fajl da prekopirate u neki drugi direktorijum,

te preko postojećeg) na mesto u

apache servis). Pokušajte , trebalo bi da dobijete prikaz kao na slici.

Page 4: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Slika 2

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Slika 2 – Izgled poöetne stranice na blanko aplikaciji

Slika 3 - Struktura Zend aplikacije

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

poöetne stranice na blanko aplikaciji

Page 5: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Napomena: Ako niste uključili preporljučljivo da Zend direktorijum koji sadrži sve biblioteke prekopirate u okviru direktorijuma. Nakon što ste kreirali projekat u okviru direktorijuma koji nosi ime projekta kreirana je sledestruktura:

• application: predstavlja direktorijum o kome se nalazi kod vaše aplikacije (vaši kontroleri, modeli i viewBootstrap.php koji je odgovoran za po

• docs: sadrži dokumentaciju sajta• library: sadrži sporedne biblioteke koje se koriste u aplikaciji

• public: sadrži fajlove koji se ne obrajavaScript kod itd. ,a takovrši obradu svih zahteva koji su poslati aplikaciji. Pored njega tu je i fajl kome se nalaze naredbe koje redirektuju sve zahteva ka glavnom kontroleru.

• test: sadrži kod za testiranje aplikacije• .zfproject.xml: predstavlja fajl koji u kome se nalaze evidentirane sve promene koje je

napravila zf komanda.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

čili Zend Framework u okviru promenljive include_path ljivo da Zend direktorijum koji sadrži sve biblioteke prekopirate u okviru

Nakon što ste kreirali projekat u okviru direktorijuma koji nosi ime projekta kreirana je slede

: predstavlja direktorijum o kome se nalazi kod vaše aplikacije (vaši view-i). Takoñe pored toga tu se nalazi fajl koji se naziva

koji je odgovoran za početnu inicijalizaciju vašeg projekta

: sadrži dokumentaciju sajta : sadrži sporedne biblioteke koje se koriste u aplikaciji

: sadrži fajlove koji se ne obrañuju od strne glavnog kontrolera, css, slike, kod itd. ,a takoñe sadrže fajl index.php koji prestavlja glavni kontroler koji

vrši obradu svih zahteva koji su poslati aplikaciji. Pored njega tu je i fajl kome se nalaze naredbe koje redirektuju sve zahteva ka glavnom kontroleru.

sadrži kod za testiranje aplikacije : predstavlja fajl koji u kome se nalaze evidentirane sve promene koje je

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

include_path onda je ljivo da Zend direktorijum koji sadrži sve biblioteke prekopirate u okviru library

Nakon što ste kreirali projekat u okviru direktorijuma koji nosi ime projekta kreirana je sledeća

: predstavlja direktorijum o kome se nalazi kod vaše aplikacije (vaši toga tu se nalazi fajl koji se naziva

etnu inicijalizaciju vašeg projekta

uju od strne glavnog kontrolera, css, slike, koji prestavlja glavni kontroler koji

vrši obradu svih zahteva koji su poslati aplikaciji. Pored njega tu je i fajl .htaccess u kome se nalaze naredbe koje redirektuju sve zahteva ka glavnom kontroleru.

: predstavlja fajl koji u kome se nalaze evidentirane sve promene koje je

Page 6: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Razvojno okruženje Za razvoj aplikacija pomoću Zend Frameworkbi ovo okruženje moglo da se koristi za razvoj PHP aplikacija potrebno je tokom iodabrati opciju razvoja PHP aplikacija.

Podešavanje okružennja U glavnom meniju odaberite Toolssledeći prikaz:

Potrebno je da u polje Zend scriptBrowse. Kliknite na Ok.

Kreiranje projekta Projekat se kreira odabiromstavki slici ispod.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend Framework-a koristićemo Net Beans razvojno okruženje. Da bi ovo okruženje moglo da se koristi za razvoj PHP aplikacija potrebno je tokom iodabrati opciju razvoja PHP aplikacija.

Tools->Options i zatim tab PHP pa zatip tab

Slika 4 – Podešavanje zf scripte

Zend script upišete putanju do fajla zf.bat ili da prona

stavki File->New Project i odaberite PHP iz liste

Slika 5 – Odabir vrste aplikacije

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

razvojno okruženje. Da bi ovo okruženje moglo da se koristi za razvoj PHP aplikacija potrebno je tokom instalacije

pa zatip tab Zend, i dobijate

ili da pronañete isti preko

iz liste Categories kao na

Page 7: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Kliknite na Next > i u novom prozor

Nakon što ste zadali ime projekta koje bi trebalo da bude isto kao domensko ime preko kojeaplikacija biti dostupna, kliknite na projekta tj. Project URL. (mora da bude lokalna)Nakon podešavanja lokalnog Framework u kome želite da radite (izaberite

Klikom Finish kreira se projekt u

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

i u novom prozor trebate da navedete ime projekta (polje

Slika 6 – Definisanje imena projekta

Nakon što ste zadali ime projekta koje bi trebalo da bude isto kao domensko ime preko kojekliknite na Next i u sledećem prozoru obratite pažnju na putanju

mora da bude lokalna) URL-a kliknite na Next, i zatim se pojavljuje prozor

u kome želite da radite (izaberite Zend) i kliknite na Finish.

Slika 7 – Odabir framework-a

kreira se projekt u htdocs folderu server.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

(polje Project Name).

Nakon što ste zadali ime projekta koje bi trebalo da bude isto kao domensko ime preko kojeg će em prozoru obratite pažnju na putanju

pojavljuje prozor u kome birate

Page 8: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Omogućavanje AutoCompleteAko se kompletna biblioteka Zend Frameworkje uključite kako bi razvojno oruženje moglo da ima uvid u metode i svojstva stablu projekta odaberite folder odaverite Properties. Otvara dijalog u kome trebate dodati putanju do

Slika 8 –

Osnovni pojmovi

Bootstrap Predstavlja klasu (fajl) smešten u folderu inicijalizovati prilikom pokretanja aplikacije kao je definicija proizvoljnih putanjada „traži“ akcije u okviru direktorijuma

Konfiguracija Sam Zend Framework nije konfigurabilan ali vaša aplikacija jeste. Podaci o ksmeštaju u fajl application/configs/application.inipodešavate promenljive PHP okruženja.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

avanje AutoComplete-a Zend Framework-a nalazi van vašeg projekta onda bi bilo dobro da

ite kako bi razvojno oruženje moglo da ima uvid u metode i svojstva stablu projekta odaberite folder Include Path kliknite desnim tasterom miša na taj folder i

tvara dijalog u kome trebate dodati putanju do Zend Framework

– Uključivanje InteliSense-a za Zend Framework

smešten u folderu application i definiše resurse i komponente koji treba inicijalizovati prilikom pokretanja aplikacije kao i kod svakog zahteva (request

definicija proizvoljnih putanja. Podrazumevano se inicijalizuje FrontControllerda „traži“ akcije u okviru direktorijuma application/controllers/

nije konfigurabilan ali vaša aplikacija jeste. Podaci o kapplication/configs/application.ini . Sastoji se od direktiva pomo

podešavate promenljive PHP okruženja.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a nalazi van vašeg projekta onda bi bilo dobro da ite kako bi razvojno oruženje moglo da ima uvid u metode i svojstva Zend klasa. U

kliknite desnim tasterom miša na taj folder i Zend Framework-a.

Zend Framework

i komponente koji treba request). Tipičan primer

FrontController čiji je zadatak

nije konfigurabilan ali vaša aplikacija jeste. Podaci o konfiguraciji se . Sastoji se od direktiva pomoću kojih

Page 9: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

U okviru fajla može se primetiti da je fajl podeljen na nekoliko celina testing, development . Ove celine omoguod stanja u kome se nalazi aplikacija. Stanje se definiše kroz konstantu APPLICATION_PATH definišete je u okviru servera, navirtuelnih hostova na web serveru.sekcija.

Kontroleri Kontroleri su realizovani kao klase i„Action“. Na osnovu podataka u URLpozvana. Naime, URL-ovi u MVC arhitekturi imaju sledecontroller ime klase, a action Svaka aplikacija poseduje podrazumevani kontroler namenjen obradi grešaka kao što je recimo greška 404.Glavni kontroler u svakoj aplikaciji realizovanoj putem zadataka da obradi podatke iz URL

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

U okviru fajla može se primetiti da je fajl podeljen na nekoliko celina production,. Ove celine omogućavaju da se odreñene promenljive menjaju u zavisnosti

od stanja u kome se nalazi aplikacija. Stanje se definiše kroz konstantu APPLICATION_PATH okviru servera, načešće u .htaccess fajlu ili u okviru fajla za podešavanje

b serveru. Podešavanja mogu i da se redefinišu u okviru narednih

realizovani kao klase i sastoje se od metoda (akcija) čija se imena završavaju sa Na osnovu podataka u URL-u odreñuje se kontroler i akcija (metoda) koja

ovi u MVC arhitekturi imaju sledeću strukturu /controller/action je ime metode bez sufiksa Action.

seduje podrazumevani kontroler IndexController i ErrorControllernamenjen obradi grešaka kao što je recimo greška 404. Glavni kontroler u svakoj aplikaciji realizovanoj putem Zend-a je Front Controllerzadataka da obradi podatke iz URL-a.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

production, starting,

ene promenljive menjaju u zavisnosti od stanja u kome se nalazi aplikacija. Stanje se definiše kroz konstantu APPLICATION_PATH i

ili u okviru fajla za podešavanje Podešavanja mogu i da se redefinišu u okviru narednih

ija se imena završavaju sa uje se kontroler i akcija (metoda) koja će biti

/controller/action gde je

ErrorController koji je

Front Controller I ima

Page 10: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Slika 9

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Slika 9 – Šema obrade zahteva i generisanje odgovora

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 11: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Pravila za realizaciju kontrolera:1. Savko ime kontrolera mora po

sledeći format imena Ime_kontroleraControllerZend_Controller_Action

2. Ime fajla u kome se nalazi klasa mora u potpunosti odgovarati imenu klase i mora imati ekstenziju php (Ime_kontroleraController.php

Kontroler se najjednostavnije može kreirati preko komande izvršiti u okviru direktorijuma projekta tj. na rootapplication/controllers kreira se

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Pravila za realizaciju kontrolera: Savko ime kontrolera mora početi velikim slovom i predstavlja klasu koja mora imati

Ime_kontroleraController . Tako kreirana klasa izvodi Zend_Controller_Action. Ime fajla u kome se nalazi klasa mora u potpunosti odgovarati imenu klase i mora imati

Ime_kontroleraController.php)

Kontroler se najjednostavnije može kreirati preko komande zf create controler Prviizvršiti u okviru direktorijuma projekta tj. na root-u projekta) . Nakon njenog izvršavanja u

kreira se kontroler sa datim imenom i pratećim podrazumevanim kodom.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

eti velikim slovom i predstavlja klasu koja mora imati . Tako kreirana klasa izvodi se iz klase

Ime fajla u kome se nalazi klasa mora u potpunosti odgovarati imenu klase i mora imati

zf create controler Prvi (komandu u projekta) . Nakon njenog izvršavanja u

im podrazumevanim kodom.

Page 12: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

U okviru razvojnog okruženja projekat i u novootvorenom meniju izaberite za izvršavanje komande.

Slika 10 U polju Filter kucate ime komande koju tražite i za to vreme u polju se pronañene komande zajedno sa sintaksom. U polju komande. Kada završite sa parametrima kliknite na dugme Prilikom kreiranja kontrolera inicijalno se kreira metoda pod imenom konstruktora tj. inicijalizatora.Svaki kontroler se sastoji od akcija tj. metoda koje su definisane u okviru njega. Sve metode koje želimo da budu akcije mora da po

1. Ime akcije mora početi malim slovom. 2. Format: ime_akcijeAction

Komanda koja kreira akciju u okviru kontrolera je: Prilikom kreiranja akcije podrazumevano se kreira i application/views/script/naziv_kontrolera/ime_akcije.phtmlpodatka iz odabrane akcije. O ovome nešto više u tekstu koji sledi.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

U okviru razvojnog okruženja NetBeans da bi kreirali kontroler kliknite desnim tastrom miša na i u novootvorenom meniju izaberite Zend->Run Command... kako bi se otvorio dijalog

Slika 10 – NetBeans dijalog za ivršvanje komande

kucate ime komande koju tražite i za to vreme u polju Matching Tasksene komande zajedno sa sintaksom. U polju Parameters unosite potrebne parametre

komande. Kada završite sa parametrima kliknite na dugme Run kako bi izvršili komandu.

Prilikom kreiranja kontrolera inicijalno se kreira metoda pod imenom init()konstruktora tj. inicijalizatora. Svaki kontroler se sastoji od akcija tj. metoda koje su definisane u okviru njega. Sve metode koje želimo da budu akcije mora da poštuju pravila imenovanja akcije i ona glase:

četi malim slovom. ime_akcijeAction.

Komanda koja kreira akciju u okviru kontrolera je: zf create action ime_akcije ime_kontroleraPrilikom kreiranja akcije podrazumevano se kreira i fajl ime_akcije.phtml application/views/script/naziv_kontrolera/ime_akcije.phtml koje je zadužej za prikazivanje podatka iz odabrane akcije. O ovome nešto više u tekstu koji sledi.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

da bi kreirali kontroler kliknite desnim tastrom miša na kako bi se otvorio dijalog

Matching Tasks prikazuju unosite potrebne parametre

kako bi izvršili komandu.

init() koja ima ulogu

Svaki kontroler se sastoji od akcija tj. metoda koje su definisane u okviru njega. Sve metode koje akcije i ona glase:

zf create action ime_akcije ime_kontrolera u okviru foldera

koje je zadužej za prikazivanje

Page 13: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Views Predstavljaju fajlove koji se sastoje od standardnogkombinaciom koda smeštaju se u okviru foldera foldera prave se posebni folderi koji predstavljaju imena kontrolera i ovako kreirani folderi sadrže fajlove sa ekstenziom .phtmlkontrolera. Tako na primer za sa fajlovima index/index.phtml error/error.phtmlkomadom zf create view controller fileNameindex/index.phtml

error/error.phtml

<!DOCTYPE html PUBLIC ""http://www.w3.org/TR/xhtml1/DTD/xhtml1<html xmlns="http://www.w3.org/1999/xhtml">

<style> a:link,a:visited{color: #0398CA;} span#zf-name{color: #91BE3F;} div#welcome{ color: #FFFFFF; background-image: url(http://framework.zend.com/images/bkg_header.jpg); width: 600px;height: 400px;border: 2px solid #444444;overflow: hidden;text } div#more-information{ background-image: url(http://framewor height: 100%; } </style> <div id="welcome"> <h1>Welcome to the <span id="zf <h3>This is your project's main page</h3> <div id="more-information"> <p><img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" /></p> <p>Helpful Links: <br /> <a href="http://framework.zend.com/">Zend Framework Website</a> | <a href="http://framework.zend.com/manual/en/">Zend Frame </p> </div> </div>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Predstavljaju fajlove koji se sastoje od standardnog PHP-a i HTML-a. Fajlovi sa navedenom kombinaciom koda smeštaju se u okviru foldera application/views/scripts/ foldera prave se posebni folderi koji predstavljaju imena kontrolera i ovako kreirani folderi

.phtml čija imena odgovaraju imenima akcija u okontrolera. Tako na primer za kontrolere Index i Error postojali bi direktorijumi

index/index.phtml error/error.phtml . Ove fajlove možete i zasebno kreirati controller fileName .

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">

a:link,a:visited{color: #0398CA;} name{color: #91BE3F;}

image: url(http://framework.zend.com/images/bkg_header.jpg);width: 600px;height: 400px;border: 2px solid #444444;overflow: hidden;text

image: url(http://framework.zend.com/images/bkg_body

<h1>Welcome to the <span id="zf-name">Zend Framework!</span></h1><h3>This is your project's main page</h3>

information"> img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" /></p>

<p>Helpful Links: <br /> <a href="http://framework.zend.com/">Zend Framework Website</a> |<a href="http://framework.zend.com/manual/en/">Zend Framework Manual</a>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Fajlovi sa navedenom application/views/scripts/ . U okviru navedenog

foldera prave se posebni folderi koji predstavljaju imena kontrolera i ovako kreirani folderi ija imena odgovaraju imenima akcija u okviru tekućeg

postojali bi direktorijumi index/ i error/ Ove fajlove možete i zasebno kreirati

image: url(http://framework.zend.com/images/bkg_header.jpg); width: 600px;height: 400px;border: 2px solid #444444;overflow: hidden;text-align: center;

k.zend.com/images/bkg_body-bottom.gif);

name">Zend Framework!</span></h1>

img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" /></p>

<a href="http://framework.zend.com/">Zend Framework Website</a> | work Manual</a>

Page 14: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

error/error.phtml(nastavak)

Sigurno se pitate kako da prosledim nešto u pripadajuje da u okviru akcije uradite slede

application/views/scripts/prvi/index.phtml

<br /><br /> <div id="view-content"> <p>View script for controller <b>Prvi</b> and script/action name <b>index</b></p> <div><p>Zdravo, <?php </div>

// fajl PrviController.php public function indexAction() $this->view->imePrezime="Marko Spasojevic"; }

<head> <meta http-equiv="Content <title>Zend Framework Default Application</title></head> <body> <h1>An error occurred</h1> <h2><?php echo $this->message ?></h2> <?php if (isset($this->exception)): ?> <h3>Exception information:</h3> <p><b>Message:</b> <?php echo $this <h3>Stack trace:</h3> <pre><?php echo $this->exception <h3>Request Parameters:</h3> <pre><?php echo $this->escape(var_export($this </pre> <?php endif ?> </body> </html>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

prosledim nešto u pripadajući view fajl i naravno to nije teško potrebno je da u okviru akcije uradite sledeće:

application/views/scripts/prvi/index.phtml

<p>View script for controller <b>Prvi</b> and script/action name

<p>Zdravo, <?php print $this->imePrezime; ?></p></div>

public function indexAction(){ >imePrezime="Marko Spasojevic";

equiv="Content-Type" content="text/html; charset=utf-8" /><title>Zend Framework Default Application</title>

<h1>An error occurred</h1> >message ?></h2>

>exception)): ?> <h3>Exception information:</h3> <p><b>Message:</b> <?php echo $this->exception->getMessage() ?></p>

>exception->getTraceAsString() ?></pre> <h3>Request Parameters:</h3>

>escape(var_export($this->request->getParams(), true)) ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

i view fajl i naravno to nije teško potrebno

<p>View script for controller <b>Prvi</b> and script/action name

8" />

>getMessage() ?></p>

>getParams(), true)) ?>

Page 15: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Upravljanje prikazom (view) Prilikom pozivanja akcije unutar kontrolera, prikaz podataka se obavlja putem unapred kreiranog prikaza (view) koji predstavlja fajl sa nazivom application/views/scripts/ime_kontrolera/Ako ipak želite da podatke prikažete pomopodrazumevanog potrebno je da navedete ime drugog fajla koji

Isklju čivanje prikaza Ako želite da isključite generisanje prikaza to možete uraditi pomoodgovarajuće telo akcije:

Helper metode za prikaz (View Helper-i su namenjeni lakšegenerisanje linkova na osnovu osnovnih podataka o linku.odreñeni HTML sadržaj. Za generisanje linkova koristi se metoda

Tabela 1- Neki View Helper-i

Naziv Currency Cycle Doctype HeadLink HeadMeta HeadScript HeadStyle

<a href="<?= $this->url(array('vrednost','ime_custom_putanje'

$this->_helper->viewRenderer//deo koda ako želite da onemogu$this->_helper->layout()->disableLayout();$this->_helper->viewRenderer

$this->view->render(“drugi.phtml“);//kod ako se za prikaz koristi drugi fajl koji se nalazi u nekom drugom direktorijumu$this->view->setScriptPath('/application/scripts/mobile/about/');$this->view->render('contact.phtml');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Upravljanje prikazom (view)

Prilikom pozivanja akcije unutar kontrolera, prikaz podataka se obavlja putem unapred kreiranog ) koji predstavlja fajl sa nazivom ime_akcije.phtml i nalazi se u direktorijumu

application/views/scripts/ime_kontrolera/ . Ako ipak želite da podatke prikažete pomoću nekog drugog fajla čije ime odstupa od podrazumevanog potrebno je da navedete ime drugog fajla koji će se koristit za prika

ite generisanje prikaza to možete uraditi pomoću koda koji trebate staviti u

Helper metode za prikaz (View Helpers) lakšem generisaje prikaza pojedinih elemenata, kao na primer

generisanje linkova na osnovu osnovnih podataka o linku. To su funkcije/metode koje generišu

Za generisanje linkova koristi se metoda url i to na sledeći način:

i Opis

Prikaz iznosa u lokalnom formatuPrikazuje zebru od predefisanog skupa vrednostiUbacuje DOCTYPE direktivu u html dokumentGenisanje koda za eksterni CSS, favicon, RSSGenerisanje meta tagova Generisanje dela za script Generisanje style taga

url(array('controller' => 'naziv','action' => 'anaziv','ime_paremetra' => 'vrednost','ime_custom_putanje')); ?>">Naziv linka</a>

>viewRenderer->setNoRender(true); da onemogućite i prikaz strukture

>disableLayout(); >viewRenderer->setNoRender();

>render(“drugi.phtml“); //kod ako se za prikaz koristi drugi fajl koji se nalazi u nekom drugom direktorijumu

>setScriptPath('/application/scripts/mobile/about/'); >render('contact.phtml');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Prilikom pozivanja akcije unutar kontrolera, prikaz podataka se obavlja putem unapred kreiranog zi se u direktorijumu

ije ime odstupa od e se koristit za prikaz

u koda koji trebate staviti u

generisaje prikaza pojedinih elemenata, kao na primer To su funkcije/metode koje generišu

Opis Prikaz iznosa u lokalnom formatu Prikazuje zebru od predefisanog skupa vrednosti Ubacuje DOCTYPE direktivu u html dokument Genisanje koda za eksterni CSS, favicon, RSS

'controller' => 'naziv','action' => 'anaziv','ime_paremetra' =>

//kod ako se za prikaz koristi drugi fajl koji se nalazi u nekom drugom direktorijumu

Page 16: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Kreiranje sopstvenih View Helper Da bi napravili sopstvene View HelperZend_View_Helper_Abstractapplication/views/helpers/Pol.php

Za generisanje elemenata formulara mogu se koristi i možete naći na stranici http://framework.zend.com/manual/1.12/en/zend.view.helpers.html

Kreiranje strukture straniceDa bi kreirali jedinstven prikaz u okviru web aplikacije (sajta) koristimo komponentzove Zend Layout . Zend Framework

• Two Step View, aplikacija kreira prikaz• Composite View, prikaz se sastoji iz više manjih prikaza

strukturu Da bi se kreirao layout neophodno je da izvršite komandu: Izvršavanjem ove komande u okviru foldera application/layouts/scripts kreira se fajl layout.phtml koji sadrži PHP i HTML kod za generisanje struktureovako kreiranom fajlu inicijalno ima više HTML koda nego što ima PHPse samo jedna linija koda:

Sadržaj ove promenljive jer sadržaj viewlayout.phtml

<html> <head><title>Ovo je proba layout <body> <div id="test"> <h1>Naslov iz glavnog layout <?php echo $this->layout() </div> </body> </html>

<?php echo $this->layout()-

<?php class Zend_View_Helper_Pol public function Pol($oz_pol) if ($oz_pol==’m’){return } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Kreiranje sopstvenih View Helper-a

View Helper-e morate napraviti izvedenu iz Zend_View_Helper_Abstract . application/views/helpers/Pol.php

Za generisanje elemenata formulara mogu se koristi i helper-i. Detaljnu listu ovh http://framework.zend.com/manual/1.12/en/zend.view.helpers.html

Kreiranje strukture stranice Da bi kreirali jedinstven prikaz u okviru web aplikacije (sajta) koristimo komponent

Zend Framework koristi dva šablona za generisanje prikaza

, aplikacija kreira prikaz (view) koji se kasnije ubacuje u glavni prikaz, prikaz se sastoji iz više manjih prikaza (view) koji zajedno grade

ophodno je da izvršite komandu: zf enable layoutIzvršavanjem ove komande u okviru foldera application/layouts/scripts kreira se fajl layout.phtml koji sadrži PHP i HTML kod za generisanje strukture stranice u aplikaciji (sajtu). U ovako kreiranom fajlu inicijalno ima više HTML koda nego što ima PHP-a

Sadržaj ove promenljive jer sadržaj view-a koji je pozvan.

<head><title>Ovo je proba layout-a</title></head>

<h1>Naslov iz glavnog layout-a</h1> layout()->content; ?>

->content; ?>

Pol extends Zend_View_Helper_Abstract{ Pol($oz_pol){

return ‘On’;}else{ return ‘Ona’;}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

i. Detaljnu listu ovh helper-a http://framework.zend.com/manual/1.12/en/zend.view.helpers.html .

Da bi kreirali jedinstven prikaz u okviru web aplikacije (sajta) koristimo komponentu koja se koristi dva šablona za generisanje prikaza (view):

koji se kasnije ubacuje u glavni prikaz koji zajedno grade

zf enable layout . Izvršavanjem ove komande u okviru foldera application/layouts/scripts kreira se fajl

stranice u aplikaciji (sajtu). U a. Od PHP-a pojavljuje

Page 17: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Manipulacija strukturom stranice Instanci Zend_Layout klase možete pristupiti na nekoliko na

• U okviru view script-a

• U okviru akcije kontrolera

• Upotrebom statičke metode

• Preko bootstrap-a

Takoñe mogu se i izvršiti sledeć

• Podešavanje promenljivih u

• disableLayout(). Ako imate potreba da iskljumetodu. Na primer jedna od situacija je odgovor na AJAX zahtev.

• Odabir drugog prikaza

Parcijalni šabloni (Partial View Mnoge stranice se sastoje iz depotreba da se definiše šablom kojim Framework-u naziva Partial View.I

// upotreba script "alternate.phtml":$layout->setLayout('alternate')

$layout->disableLayout()

$layout->somekey =echo $layout->somekey$layout->assign('someotherkey'echo $layout->someotherkey

$layout = $bootstrap

$layout = Zend_Layout::

$layout = $this->_helper // ili $helper = $this->_helper$layout = $helper->getLayoutInstance()

<?php $layout = $this

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Manipulacija strukturom stranice

klase možete pristupiti na nekoliko načina: a

U okviru akcije kontrolera

ke metode

e mogu se i izvršiti sledeće operacije:

Podešavanje promenljivih u layout-u

. Ako imate potreba da isključite generisanje strukture onda koristite ovu metodu. Na primer jedna od situacija je odgovor na AJAX zahtev.

Odabir drugog prikaza

Partial View)

iz delova koji su u pogledu HTML koda indentičpotreba da se definiše šablom kojim će ovaj deo ili delovi generisati. Ovaj šablon se u

u naziva Partial View.Imena pomenljivih u okviru parcijalnih šablona

"alternate.phtml": setLayout('alternate');

disableLayout();

= "foo" somekey; // 'foo'

assign('someotherkey', 'bar'); someotherkey; // 'bar'

$bootstrap->getResource('Layout');

= Zend_Layout::getMvcInstance();

>_helper->layout();

>_helper->getHelper('Layout'); getLayoutInstance();

$this->layout(); ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

ite generisanje strukture onda koristite ovu

lova koji su u pogledu HTML koda indentični tako da se nameće e ovaj deo ili delovi generisati. Ovaj šablon se u Zend

okviru parcijalnih šablona mogu biti ista

Page 18: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

kao i imena u glavnom prikazu (bilo bi dobro da usvojite načinapplication/views/scripts . application/views/scripts/_post.phtml

Ako doñe do slučaja da je potrebno da se parcijalni šablom ponavlja više puta može se primeniti sledeća sintaksa:

Putanje do spoljnih resursa Putanje do odgovarajućih resursa (slike,index.php fajl. Praksa je da se ovi resursi postave u posebne foldere u okviru direktorijuma.

Upotreba placeholder-a Placeholder predstavlja jedinstvenu celinuSvaka stranica sadrži jedan ili više itd.). Placeholedr-i predstavljaju kontejnere koji se mogu posmatrati kao kzaključka da se sanjima može raditi slede

• Dodavanje stavki na kraj ili po

• Zamena cele kolekcije sa • Dodavanje sadržaja na kraj i po

• Definisanje stringa koji razdvaja elemente• Ubacivanje sadržaja u kolekciju

<div class=“posts“> <?=$this->partialLoop(‘_posts.phtml‘,array( </div>

<?= $this->partial(‘_post.phtml‘,array(‘naslov‘=>$post

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

kao i imena u glavnom prikazu (view-u) jer parcijalni šabloni predstavljaju zasebne poddomene čin za imenovanje fajlova parcijalnih šablona. Fajlovi se smeštaju u

application/views/scripts/_post.phtml

aja da je potrebno da se parcijalni šablom ponavlja više puta može se primeniti

Putanje do spoljnih resursa

ih resursa (slike,css i javaScript) zadaju se relativno u odnosu na fajl. Praksa je da se ovi resursi postave u posebne foldere u okviru

predstavlja jedinstvenu celinu čija struktura i sadržaj zavisi od stanja aplikacije. Svaka stranica sadrži jedan ili više placeholeder-a (deklaracija DOCTYPE, naslov dokumenta

i predstavljaju kontejnere koji se mogu posmatrati kao kolekcije što vodi do ka da se sanjima može raditi sledeće:

Dodavanje stavki na kraj ili početak

Zamena cele kolekcije sa jednom vrednošću Dodavanje sadržaja na kraj i početak elementa kolekcije

Definisanje stringa koji razdvaja elemente Ubacivanje sadržaja u kolekciju

tialLoop(‘_posts.phtml‘,array( array(‘naslov’=>’Post 1’,’telo’=>’Ovo je post ’),

array(‘naslov’=>’Post 2’,’telo’=>’Ovo je post ’), ));

‘_post.phtml‘,array(‘naslov‘=>$post->title,‘telo‘=>$post

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

predstavljaju zasebne poddomene i . Fajlovi se smeštaju u

aja da je potrebno da se parcijalni šablom ponavlja više puta može se primeniti

) zadaju se relativno u odnosu na fajl. Praksa je da se ovi resursi postave u posebne foldere u okviru public

ija struktura i sadržaj zavisi od stanja aplikacije. a (deklaracija DOCTYPE, naslov dokumenta

olekcije što vodi do

array(‘naslov’=>’Post 1’,’telo’=>’Ovo je post ’), array(‘naslov’=>’Post 2’,’telo’=>’Ovo je post ’),

=>$post->body)); ?>

Page 19: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Standardni placeholder-i Većina standardnih placeholderstrane. Podešavanje DOCTYPE

Ovaj podataka možete štampati na klasiradi u okviru Bootstrap klase

Generisanje sadržaja taga <title>bootstrap.php

Kod u nekoj akciji

<?php $this->headTitle()<?php $this->headTitle()

class Bootstrap extends // ...

protected function _initPlaceholders$this->bootstrap('View');$view = $this->getResource('View')$view->doctype('XHTML1_STRICT')

// Definisanje title i separatora:$view->headTitle('Moj Sajt')}}

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap protected function _initDocType

// da bi naredna naredbaresources.view[]=

$this->bootstrap('View') $view = $this->getResource('View') $view->doctype('XHTML1_STRICT') } }

<?php echo $this->doctype()<html> ………..

$this->doctype('XHTML1_STRICT')HTML5

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

placeholder-a se odnosi na generisanje sadržaja za <head>

Ovaj podataka možete štampati na klasičan način kao rezultat neke funkcije ali je praksa da se to

<title>

headTitle()->append('Neka strana'); //dodavanje na krajheadTitle()->prepend('Neka strana'); // dodavanje pre ?>

Zend_Application_Bootstrap_Bootstrap{

_initPlaceholders(){ ;

getResource('View'); doctype('XHTML1_STRICT');

separatora: Sajt')->setSeparator(' :: ');

Zend_Application_Bootstrap_Bootstrap{ tDocType(){ naredba fukcionisala potrebno je u application.ini

bootstrap('View'); getResource('View');

doctype('XHTML1_STRICT');

doctype() ?>

doctype('XHTML1_STRICT'); //XHTML1_TRANSITIONAL HTML4_STRICT HTML4_Loose

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

<head> sekciju html

in kao rezultat neke funkcije ali je praksa da se to

kraj ?> ?>

application.ini fajlu dodati

; //XHTML1_TRANSITIONAL HTML4_STRICT HTML4_Loose

Page 20: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

layout.phtml

Generisanje linkova ka stilovma Postavljanje stilova se obavlja preko headLink() sadrži nekoliko „virtuelnihDve metode koje najviše koriste su metoda uzima četiri argumenta podrazumevano text/css), $conditionalStylesheet$extras (asocijativni niz koji služi za podešavanje atributa bootstrap.php

Kod u nekoj akciji

<?php $this->headLink()

class Bootstrap extends // ... protected function _initPlaceholders$this->bootstrap('View');$view = $this->getResource('View')$view->doctype('XHTML1_STRICT')$view->headTitle('My Site')

$view->headLink()->prependStylesheet('/styles/site.css')} // ... }

<?php echo $this->doctype()<html> <?php echo $this->headTitle()<!—Ako se koristi append()

<title>Moj sajt :: Neka strana</title> <!—Ako se kotisti prepend()

<title>Neka strana :: ……… </html>

1.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Generisanje linkova ka stilovma

Postavljanje stilova se obavlja preko placeholder-a headLink(). Povratni objekat metode virtuelnih“ metoda koji nam pomažu prilikom generisanja linkova.

Dve metode koje najviše koriste su appendStylesheet() i prependStylesheet()etiri argumenta $href (relativna putanja do css-a), $media (MIME tip,

conditionalStylesheet (uslov pod kojim se koristi dati css fajl), (asocijativni niz koji služi za podešavanje atributa media).

headLink()->appendStylesheet('/styles/user-list.css') ?>

Zend_Application_Bootstrap_Bootstrap{

_initPlaceholders(){ ;

getResource('View'); doctype('XHTML1_STRICT');

Site')->setSeparator(' :: '); prependStylesheet('/styles/site.css');

doctype() ?>

headTitle() ?> Ako se koristi append() -->

:: Neka strana</title> Ako se kotisti prepend() -->

<title>Neka strana :: Moj sajt</title>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

. Povratni objekat metode “ metoda koji nam pomažu prilikom generisanja linkova.

prependStylesheet(). Svaka od ovih (MIME tip,

(uslov pod kojim se koristi dati css fajl),

?>

Page 21: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

layout.phtml

Generisanje script dela Placeholder za script se definiše preko Ovaj objekat poseduje nekoliko metoda: appendScript(). Prve dve metode omogudve služe za eksplicitno ubacivanje skripta pre ili posle.bootstrap.php

Kod u nekoj akciji

Definisanje script dela kroz kod

<?php $this->headScript()

site = {baseUrl: "<?php echo<?php $this->headScript()

<?php $this->headScript()

class Bootstrap extends // ... protected function _initPlacehold$this->bootstrap('View');$view = $this->getResource('View')$view->doctype('XHTML1_STRICT')// Podesiti inicijalni title$view->headTitle('My Site')$view->headLink()->prependStylesheet('/styles/site.css')$view->headScript()->prependFile('/js/site.js')} }

<?php echo $this->doctype()<html> <?php echo $this->headTitle() <?php echo $this->headLink()

…… </html>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

se definiše preko headScript() metode tj. objekta koga vrOvaj objekat poseduje nekoliko metoda: prependFile(), appendFile(), prependScript()

. Prve dve metode omogućavaju da dodate script fajlove pre i posle, dok druge dve služe za eksplicitno ubacivanje skripta pre ili posle.

dela kroz kod

headScript()->captureStart() ?>

echo $this->baseUrl() ?>"}; headScript()->captureEnd() ?>

headScript()->appendFile('/js/user-list.js') ?>

Zend_Application_Bootstrap_Bootstrap{

_initPlaceholders(){ ;

getResource('View'); doctype('XHTML1_STRICT');

i separator: Site')->setSeparator(' :: ');

prependStylesheet('/styles/site.css'); prependFile('/js/site.js');

doctype() ?>

headTitle() ?> headLink() ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

metode tj. objekta koga vrća ova metoda. prependFile(), appendFile(), prependScript() i

fajlove pre i posle, dok druge

Page 22: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

layout.phtml

Html kod nakon renderovanja

Izrada sopstvenih placeholder_sidebar.phtml

layout.phtml

kontroler

public function preDispatch(){ $this->view->render('_sidebar.phtml'); }

<?php if(is_array($this->sidebar_menu) && !empty($this <?php print $this->placeholder('sidebar')false,false,false);?> <?php endif; ?>

<?php print $this->placeholder('sidebar')<?php print $this->placeholder('sidebar')<?php print $this->placeholder('sidebar')

<script type="text/javascript" src="/js/site.js"></script><script type="text/javascript" src="/js/user<script type="text/javascript">site = { baseUrl: "<?php echo $this}; </script>

<?php echo $this->doctype() <html>

<?php echo $this->headTitle() <?php echo $this->headLink() <?php echo $this->headScript()

…… </html>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Html kod nakon renderovanja

placeholder-a

public function preDispatch(){ render('_sidebar.phtml');

>sidebar_menu) && !empty($this->sidebar_menu)): ?>>placeholder('sidebar')->menu=$this->htmlList($this

>placeholder('sidebar')->captureStart(); ?> placeholder('sidebar')->menu; ?>

>placeholder('sidebar')->captureEnd(); ?>

<script type="text/javascript" src="/js/site.js"></script> <script type="text/javascript" src="/js/user-list.js"></script> <script type="text/javascript">

echo $this->baseUrl() ?>"

doctype() ?>

headTitle() ?> headLink() ?> headScript() ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

>sidebar_menu)): ?> >htmlList($this->sidebar_menu,

Page 23: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Prosleñivanje parametara Parametri se mogu prosleñivati preko GET i POST zahteva. Kada se parametri prosleGET zahteva oni su sastavni deo URLkontroler poziva i koja akcija kontrolera se poziva kao na primer: http://v1.nawp.ict/prvi/proba Pored toga u URL-u mogu da se nalaze i neki podaci koji se mogu proslediti akciji kao parovi naziv/vrednost i to na sledeći što znači da se poziva kontroler prezime spasojevic. Da bi ovako prosleñene podatke mogli da dohvatimoda koristimo sledeći kod: $this->getParam(“ime_parametra“); PrviController.php

proba.phtml

Da bi prikazali kako se prenose podackoja se zove prenos u okviru kontrolera prenos.phtml napravićemo htmlstring koji treba da prenesemo preko POST zahteva. Ako taj podatak postoji onda ga ispisujemo ako ne pojavljuje se forma.

<br /><br /> <div id="view-content"> <p>View script za kontroler <b>Prvi</b> i script/ <p>Podaci koji su dosli preko URL</div>

public function probaAction(){ // action body $ime=$this->getParam('ime'); $prezime=$this $this->view->imePrezime=$ime." ".$prezime; }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

ivanje parametara

ñivati preko GET i POST zahteva. Kada se parametri prosleGET zahteva oni su sastavni deo URL-a. U samom URL-u nalaze se podaci o tome koji se

poziva i koja akcija kontrolera se poziva kao na primer:

da se nalaze i neki podaci koji se mogu proslediti akciji kao parovi način http://v1.nawp.ict/prvi/proba/ime/marko/prezime/spasojevic

i da se poziva kontroler prvi i njegova akcija proba kojoj se prosleñ

ene podatke mogli da dohvatimo u metodi koja se odnosi na akciju moramo

getParam(“ime_parametra“);

Da bi prikazali kako se prenose podaci putem POST zahteva pretpostavimo da imu okviru kontrolera prvi. U novokreiranom prezentacionom fajlu

html formular sa jednim tekstualnim poljem gde unosimo odrekoji treba da prenesemo preko POST zahteva. Ako taj podatak postoji onda ga ispisujemo

<p>View script za kontroler <b>Prvi</b> i script/ime akcije <b>proba</b></p><p>Podaci koji su dosli preko URL-a su : <?php print $this->imePrezime; ?></p>

public function probaAction(){

>getParam('ime'); $prezime=$this->getParam('prezime');

>imePrezime=$ime." ".$prezime;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

ivati preko GET i POST zahteva. Kada se parametri prosleñuju preko u nalaze se podaci o tome koji se

da se nalaze i neki podaci koji se mogu proslediti akciji kao parovi http://v1.nawp.ict/prvi/proba/ime/marko/prezime/spasojevic

kojoj se prosleñuju ime marko i

u metodi koja se odnosi na akciju moramo

i putem POST zahteva pretpostavimo da imamo akciju . U novokreiranom prezentacionom fajlu (view-u)

formular sa jednim tekstualnim poljem gde unosimo odreñeni koji treba da prenesemo preko POST zahteva. Ako taj podatak postoji onda ga ispisujemo

ime akcije <b>proba</b></p> >imePrezime; ?></p>

Page 24: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

PrviController.php

prenos.html

Flash Messanger Funkcija Flasg Messanger-a je da p

$this->_helper->flashMessenge$this->_helper->redirector('Index', 'index');//ispis poruke,ovaj deo koda se može ubaciti i u init() metodif ($this->_helper->FlashMessenger$this->view->messages = $this}

<br /><br /> <div id="view-content"> <p>View script for controller <b>Prvi</b> and script/action name <b>prenos</b></p> <div> <h3>Prenos preko posta</h3> <?php if(!isset($this <form action="/prvi/prenos" method="post"> <label for="email"> E-value="" size="25" /><br /> <input type="submit" name="btnSubmit" value="Posalji" /> </form> <?php } else { ?> <p>Email je: <?php print $this <?php }?> </div> </div>

public function prenosAction(){ $dugme=$this->getParam("btnSubmit"); $request=$this->getRequest(); if(isset($dugme) && $email=$this->getParam("tbEmail"); $this->view->email=$email; } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

a je da prenosi poruke izmeñu zahteva. Podaci se

>flashMessenger->addMessage('Ova poruka je dodata'); // šta se prosleredirector('Index', 'index'); //kome se prosleñuje kom contoller

//ispis poruke,ovaj deo koda se može ubaciti i u init() metod >FlashMessenger->hasMessages()) {

>messages = $this->_helper->FlashMessenger->getMessages();

<p>View script for controller <b>Prvi</b> and script/action name

<h3>Prenos preko posta</h3> <?php if(!isset($this->email)){ ?>

m action="/prvi/prenos" method="post"> -mail adresa:</label><input type="text" name="tbEmail"

value="" size="25" /><br /> <input type="submit" name="btnSubmit" value="Posalji" />

<p>Email je: <?php print $this->email; ?> </p>

public function prenosAction(){ >getParam("btnSubmit"); >getRequest();

f(isset($dugme) && $request->isPost()){ >getParam("tbEmail");

>email=$email;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

u zahteva. Podaci se čuvaju u sesiji.

// šta se prosleñuje contoller-u kojoj akciji

ssages();

<p>View script for controller <b>Prvi</b> and script/action name

mail adresa:</label><input type="text" name="tbEmail"

Page 25: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Kreiranje proizvoljnih putanja Da bi kreirali proizvoljnu putanju, moramo da otvorimo fajl putem metode definisati proizvoljnu putanju. Sve poziva strane moraku počinjati sanosiće naziv _initRoutes. Napravićemo proizvoljnu putanju koja se zove po application/Bootstrap.php

Meñutim, šta ako vaša proizvoljna putanja zahteva prompotrebno da na umesto klase Zend_Controller_Router_Route_StaticZend_Controller_Router application/Bootstrap.php

public function _initRoutes(){ …… $routeGalerija=new Zend_Controller_Router_Route('galerija/array('controller'=>'Galerija','action'=>'pregled','ime'=>''),array(' $router->addRoute('galerija',$routeGalerija);}

public function _initRoutes(){ $frontController= Zend_Controller_Front::getInstance(); $router=$frontController//statička ruta bez promenljivih parametara $route=new Zend_Controller_Router_Rarray('controller'=>'Index','action'=>'index')); //dodaje u tabelu putanja rutu sa $router->addRoute('pocetna',$route);}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Kreiranje proizvoljnih putanja

Da bi kreirali proizvoljnu putanju, moramo da otvorimo fajl application/Bootstrap.phpproizvoljnu putanju. Sve metode koje morate pozivatiinjati sa _init. Tako na primer, naša metoda za proizvoljne p

emo proizvoljnu putanju koja se zove početna i koja će voditi na po

utim, šta ako vaša proizvoljna putanja zahteva promenljivi deo tj. parametar. Onda je Zend_Controller_Router_Route_Static upotrebite klasu

public function _initRoutes(){

$routeGalerija=new Zend_Controller_Router_Route('galerija/:imearray('controller'=>'Galerija','action'=>'pregled','ime'=>''),array('ime'=>'\w+'));

>addRoute('galerija',$routeGalerija);

_initRoutes(){ Zend_Controller_Front::getInstance();

$router=$frontController->getRouter(); ka ruta bez promenljivih parametara

Zend_Controller_Router_Route_Static('pocetna', '=>'Index','action'=>'index'));

//dodaje u tabelu putanja rutu sa jedinstvenim imenom >addRoute('pocetna',$route);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

application/Bootstrap.php i u njemu ode koje morate pozivati prilikom svakog

. Tako na primer, naša metoda za proizvoljne putanje

e voditi na početnu stranu sajta.

nljivi deo tj. parametar. Onda je upotrebite klasu

:ime', w+'));

Page 26: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

application.ini

;custom routes,ako se ovo koristi u Boostrap.php fajlu moraju biti zakomentarisane odgovarajuce rute resources.router.routes.login.route="login"resources.router.routes.login.defaults.controller = Formulariresources.router.routes.login.defaults.action = login resources.router.routes.galerija.route="galerija/:ime"resources.router.routes.galerija.defaults.controller = Slikeresources.router.routes.galerija.defaults.action = galerijaresources.router.routes.galerija.defaults.ime = sveresources.router.routes.galerija.reqs.year = "[a

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

;custom routes,ako se ovo koristi u Boostrap.php fajlu moraju biti zakomentarisane

resources.router.routes.login.route="login" resources.router.routes.login.defaults.controller = Formulari resources.router.routes.login.defaults.action = login

resources.router.routes.galerija.route="galerija/:ime" resources.router.routes.galerija.defaults.controller = Slike

.galerija.defaults.action = galerija resources.router.routes.galerija.defaults.ime = sve resources.router.routes.galerija.reqs.year = "[a-z]+"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

;custom routes,ako se ovo koristi u Boostrap.php fajlu moraju biti zakomentarisane

Page 27: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Formulari Formulari u okviru Zend FrameworkZend_Form. Ova klasa omoguć

• Filtraciju i validaciju podataka• Redosled elemenata

• Renderovanje formulara i elemenata• Grupisanje elemenata i formulara

Kada želite da napravite formular imate dve moguili da napravite sopstvenu klasu koja nasle

$form = new Zend_Form; $form->setAction('/resource/process'$form->setAttrib('id', 'login')

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend Framework-a se konstruišu preko objekata instance objekta . Ova klasa omogućava sledeće: ciju i validaciju podataka

Renderovanje formulara i elemenata Grupisanje elemenata i formulara

Kada želite da napravite formular imate dve mogućnosti da kreirate instancu klase ili da napravite sopstvenu klasu koja nasleñuje klasu Zend_Form.

'/resource/process')->setMethod('post'); );

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a se konstruišu preko objekata instance objekta

nosti da kreirate instancu klase Zend_Form

Page 28: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primeri koda za formular i njegove elemente

// Kreiranje elemenata,prvi na$username =$form-> addElement(//drugi način $username =$form->addElement('text'$username->setLabel('Username')// vrednosti iz forme u obliku$values = $form->getValues()// samo validne vrednosti $values = $form->getValidValues($_POST)

// ako je došlo do greške if (!$form->isValid($_POST)) // ili

$this->view->form = $formreturn $this->render('form')// podaci o greškama $form->getErrors();// asocijativni$form->getMessages();//

//dodela vrednosti $username->setValue('Korisni //poruka o grešci $username-> addErrorMessage(“Vasa$form = new Registracija_Forma();//asocijativni niz ’name’=>vrednost$data = array('username' => 'wjgilmore',//name/value 'email' => '[email protected]', 'zip_code' => '43201'); $form->setDefaults($data); $this->view->form = $form;//popunjavanje padajiće liste$status = new Zend_Form_Element_Select('status');$options = array(1 => "On the Shelf", 2 => "Currently Playing", 3 => "For Sale", 4 => "On Loan");$status->AddMultiOptions($options)

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Primeri koda za formular i njegove elemente

// Kreiranje elemenata,prvi način addElement(new Zend_Form_Element_Text('username'))

addElement('text', 'username'); setLabel('Username');

obliku asocijativnog niza ‘name’=>vrednost getValues();

getValidValues($_POST);

isValid($_POST)) {echo $form;

$form; render('form');}

asocijativni niz ime/kodovi // asocijativni niz name/poruke

setValue('Korisničko ime');

addErrorMessage(“Vasa poruka“); Registracija_Forma();

//asocijativni niz ’name’=>vrednost = array('username' => 'wjgilmore',//name/value

'email' => '[email protected]', 'zip_code' => '43201'

;

e liste Zend_Form_Element_Select('status');

=> "On the Shelf", 2 => "Currently Playing", 3 => "For Sale", 4 => "On Loan");

AddMultiOptions($options);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

('username'));

Page 29: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primeri koda za formular i njegove elemente

//dodavanje validatora $username->addValidator(new$username->addValidator('alnum')//drugi parameter označava da li se $username->addValidator('regex'poruka“); //obavezan element $username->setRequired(true$username->addFilter('StringToLower')

//kraći zapisi prethodnog$username->addValidator('alnum')->addValidator('regex', false

->setRequired(true)->addFilter('StringToLower')

$username->addValidators(array>setRequired(true)->addFilters($form->addElement('text', 'username'

'validators' => array( 'alnum',array('regex', false'required' => true, 'filters' => array('StringToLower')));

//poruka o grešci $username-> addErrorMessage(“Vasa if ($form->isValid($this->getRequest()else {// greška} // validacija preko AJAX-a if ($form->isValidPartial($_POST))// podaci o greškama $form->getErrors();// asocijativni$form->getMessages();// asocijativni// definisanje grešaka $username->addValidator('Alpha', false, array('messages' => array(Zend_Validate_Alpha::INVALID => "ERROR: Invalid name",Zend_Validate_Alpha::NOT_ALPHA => "ERROR: Name cannot contain noncharacters", Zend_Validate_Alpha::STRING_EMPTY => "ERROR: Name cannot be empty")));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Primeri koda za formular i njegove elemente (nastavak)

new Zend_Validate_Alnum());//ili addValidator('alnum');

ava da li se validacija zaustavlja na elementu ili neaddValidator('regex', false, array('/^[a-z]/i')) -> addErrorMessage(“Vasa

true); addFilter('StringToLower'); //dodavanje filetera

i zapisi prethodnog addValidator('alnum')

false, array('/^[a-z]/')) addFilter('StringToLower');

array('alnum', array('regex', false, '/^[a-z]/i')))addFilters(array('StringToLower'));

'username', array(

false, '/^[a-z]/i')),

('StringToLower'),

addErrorMessage(“Vasa poruka“); >getRequest()->isPost())) {//uredu}

isValidPartial($_POST)) { // uredu} else {//greška}

asocijativni niz ime/kodovi asocijativni niz name/poruke

('Alpha', false, array( => array(Zend_Validate_Alpha::INVALID => "ERROR: Invalid name",

Zend_Validate_Alpha::NOT_ALPHA => "ERROR: Name cannot contain non

Zend_Validate_Alpha::STRING_EMPTY => "ERROR: Name cannot be empty")

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

validacija zaustavlja na elementu ili ne addErrorMessage(“Vasa

z]/i'))) -

=> array(Zend_Validate_Alpha::INVALID => "ERROR: Invalid name", Zend_Validate_Alpha::NOT_ALPHA => "ERROR: Name cannot contain non-alpha

Zend_Validate_Alpha::STRING_EMPTY => "ERROR: Name cannot be empty")

Page 30: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Tabela - Filteri

Tabela-Validatori

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 31: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Tabela-Validatori (nastavak)

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 32: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primer formulara- Forma za logovanje

$form = new Zend_Form$form->setAction('/user/login')

// element za korisničko ime$username = $form->createElement('text'$username->addValidator('alnum')->addValidator('regex', false->addValidator('stringLength'->setRequired(true) ->addFilter('StringToLower')

// Element za lozinku: $password = $form->createElement('password' $password->addValidator('StringLength' ->setRequired(true);

// Dodavanje elemenata formulara

$form->addElement($username)->addElement('submit', 'login'// kreiranje kontrolera

class UserController extendspublic function getForm

public function indexAction// render user/form.phtml$this->view->form = $this$this->render('form'); }

public function loginActionif (!$this->getRequest()-

return $this->_forward} $form = $this->getForm();if (!$form->isValid($_POST))

$this->view->formreturn $this->render('form')

} $values = $form->getValues()

// a sada autentifikacija } } // user/form.phtml <h2>Login:</h2> <?php echo $this->form;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Forma za logovanje

Zend_Form(); setAction('/user/login')->setMethod('post');

ime createElement('text', 'username');

addValidator('alnum') false, array('/^[a-z]+/'))

addValidator('stringLength', false, array(6, 20))

addFilter('StringToLower');

createElement('password', 'password'); addValidator('StringLength', false, array(6))

formulara addElement($username)->addElement($password)

'login', array('label' => 'Login'));

extends Zend_Controller_Action{ getForm(){return $form;}

indexAction(){ user/form.phtml

$this->getForm();

loginAction(){ ->isPost()) {

>_forward('index');

getForm(); isValid($_POST)) {

form = $form; render('form');

getValues();

form; ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 33: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Realizacija forme preko nasleñ

application/view/scripts/_form_test.phtml (prikaz

<form id="test" action="<?php print $this$this->element->getMethod(); ?>"> <p>Ime i prezime:<?php print $this <p>Email:<?php print $this <p><?php print $this->eleme</form>

<?php class Application_Model_FormTest

{ public function __construct($options=null){ parent::__construct($options); $this->setName('test');// name="test" $this->setMethod('post');// method="post" $this->setAction('/prvi/forma'); $ime_prezime=new Zend_Form_Element_Text('tbImePrezime'); $ime_prezime->setAttrib('size',35); $email=new Zend_Form_Elemen $email->setAttrib('size',35); $submit=new Zend_Form_Element_Submit("btnSubmit"); $submit->setAttrib('value','Prijavi'); $this->setDecorators(array(array('ViewScript',array('viewScript'=>'_form_test.phtml')))); $this->addElements(array($ime_prezime,$email,$submit)); } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Realizacija forme preko nasleñivanja

application/view/scripts/_form_test.phtml (prikaz-renderovanje pojedinih delova formulara)

?php print $this->element->getAction(); ?>" method="<?php print >getMethod(); ?>">

<p>Ime i prezime:<?php print $this->element->tbImePrezime; ?></p><p>Email:<?php print $this->element->tbEmail; ?></p>

>element->btnSubmit; ?></p>

Application_Model_FormTest extends Zend_Form

function __construct($options=null){

parent::__construct($options); setName('test');// name="test"

>setMethod('post');// method="post" >setAction('/prvi/forma');

$ime_prezime=new Zend_Form_Element_Text('tbImePrezime'); >setAttrib('size',35);

$email=new Zend_Form_Element_Text('tbEmail'); >setAttrib('size',35);

$submit=new Zend_Form_Element_Submit("btnSubmit"); >setAttrib('value','Prijavi');

>setDecorators(array(array('ViewScript',array('viewScript'=>'_form_test.phtml'))));

>addElements(array($ime_prezime,$email,$submit));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

renderovanje pojedinih delova formulara)

>getAction(); ?>" method="<?php print

>tbImePrezime; ?></p>

>setDecorators(array(array('ViewScript',array('viewScript'=>'_form_test.phtml'))));

Page 34: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Dekoratori Zend_Form_Decorator Dekoratori predstavljaju delove HTML koda u koje se smeštaju elementi formulara.

Podrazumevani dekoratori koji se

• Labele formulara se ubacuju izme

• Input elementi izmeñu <dd>...</dd>• Podaci o greškama se prikazuju kao neure

Da bi se promenio dekorator koji se koriste se slede

• addDecorators() uzima niz imena dekoratora koprimenjuje poslednji dodati

• clearDecorators() uklanja sve dekoratore sa elementa

• setDecorators() uklanja sve postoje Prikazivanje formulara pomoć

// eksplicinto pozivanje metodeecho $form->render($view)echo $form; // u .phtml fajlu <?php echo $this->form// dekoratori su metode koje$element->addDecorators(

));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend_Form_Decorator

Dekoratori predstavljaju delove HTML koda u koje se smeštaju elementi formulara.

Podrazumevani dekoratori koji se koriste su:

Labele formulara se ubacuju izmeñu <dt>....</dt>

ñu <dd>...</dd> Podaci o greškama se prikazuju kao neureñena lista

Da bi se promenio dekorator koji se koriste se sledeće metode:

uzima niz imena dekoratora koji se trebaju primeniti i uvek se primenjuje poslednji dodati

uklanja sve dekoratore sa elementa

uklanja sve postojeće i postavlja nove

Prikazivanje formulara pomoću dekoratora

metode render() render($view);// ili

form ?> koje vrše renderovanje elemenata

addDecorators(array('ViewHelper','Errors', array('HtmlTag', array('tag' => 'dd')), array('Label', array('tag' => 'dt')),

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Dekoratori predstavljaju delove HTML koda u koje se smeštaju elementi formulara.

ji se trebaju primeniti i uvek se

Page 35: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Prikazivanje formulara pomoć

Prikaz forme za logovanje u formi tabele, primenom dekoratora

$this->setElementDecorators(array( 'ViewHelper', 'Errors', array(array('data'=> array('Label',array('tag'=>'td')), array(array('row'=>'HtmlTag'),array('tag'=>'tr')) )); $submitDugme->setDecorators(array( 'ViewHelper', array(array('data'=>'HtmlTag'), array('tag'=>'td','class'=>'element')), array(array('emptyrow'=>'HtmlTag'), array('tag'=>'td', 'class'=>'element', 'placement'=>'PREPEND')), array(array('row'=>'HtmlTag'),array('tag'=>'tr')))); $this->setDecorators(array('FormElements', array('HtmlTag',array('tag'=>'table')),'Form', array('Fieldset',array('legend'=>'Login')) ));

// podešavanje redosleda $element->setOrder(10);$form->addElement('text' // gupisanje elemenata // addDisplayGroup(niz

$this->addDisplayGroup(array$this->getDisplayGroup('contact') $loginForm->setElementDecorators(array('ViewHelper',array(array('data'=>'HtmlTag'),ararray('Label',array('tag'=>'div','class'=>'test')),array('Description',array('tag'=>'div')))); $loginForm->setDecorators(array('FormElements',array ();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

pomoću dekoratora (nastavak)

Prikaz forme za logovanje u formi tabele, primenom dekoratora

>setElementDecorators(array(

array(array('data'=>'HtmlTag'),array('tag'=>'td','class'=>'element')),array('Label',array('tag'=>'td')), array(array('row'=>'HtmlTag'),array('tag'=>'tr'))

>setDecorators(array(

'data'=>'HtmlTag'), array('tag'=>'td','class'=>'element')), array(array('emptyrow'=>'HtmlTag'), array('tag'=>'td', 'class'=>'element', 'placement'=>'PREPEND')), array(array('row'=>'HtmlTag'),array('tag'=>'tr'))

ecorators(array('FormElements', array('HtmlTag',array('tag'=>'table')),'Form', array('Fieldset',array('legend'=>'Login'))

; // ili addElement('text', 'username', array('order' => 10));

imena elemenata,ime grupe) $this ili $form

array('name', 'email', 'tel', 'address'),'contact'); ('contact')->setLegend('Contact Information');

>setElementDecorators( array('ViewHelper',array(array('data'=>'HtmlTag'),array('tag'=>'div')), array('Label',array('tag'=>'div','class'=>'test')), array('Description',array('tag'=>'div'))

ecorators( array ('HtmlTag',array('tag'=>'div')),'Form')

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

'HtmlTag'),array('tag'=>'td','class'=>'element')),

Page 36: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Rad sa bazama podataka Osnovna namena modela u okviru MVC arhitekture je da komunicira sa bazom podataka. realizaciju modela postoje dva naova dva načina je u tome što ActiveRecordDataMapper koristi sloj koji omogutj. obavlja odgovarajuće mapiranje podataka. Poslednji nabaza podataka i jako je imun na promene

Podešavanje adaptera Prva stvar koju trebate uradite je podešmože uraditi sledećom komandom:

Podešavanje adaptera u okviru

Podešavanje adaptera u kodu

Metoda ActiveRecord Ovaj metod omogućava da direktno

$db = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => '127.0.0.1', 'username' => 'koirsnik', 'password' => 'lozinka', 'dbname' => 'test' ));

resources.db.adapter = "PDO_MYSQL"resources.db.params.host = "localhost"resources.db.params.username = "roresources.db.params.password = ""resources.db.params.dbname = "zendtest"resources.db.params.charset="utf8"

zf configure db-adapter \"adapter=PDO_MYSQL&host=locadbname=nazivBazePodatala

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Rad sa bazama podataka

Osnovna namena modela u okviru MVC arhitekture je da komunicira sa bazom podataka. realizaciju modela postoje dva načina realizacije: DataMapper i ActiveRecord

ActiveRecord način komunicira direktno sa tabelkoristi sloj koji omogućava komunikaciju entiteta u kodu i entiteta u bazi podataka

e mapiranje podataka. Poslednji način omogućava nezavisnost od sistema aza podataka i jako je imun na promene sistema baze podataka.

Prva stvar koju trebate uradite je podešavanje veze adaptera i odgovarajuće baze podataka. To se om komandom:

Podešavanje adaptera u okviru application.ini fajla

ava da direktno preko instace adaptera komunicirate sa bazom podataka.

$db = new Zend_Db_Adapter_Pdo_Mysql(array(

resources.db.adapter = "PDO_MYSQL" resources.db.params.host = "localhost" resources.db.params.username = "root" resources.db.params.password = "" resources.db.params.dbname = "zendtest" resources.db.params.charset="utf8"

"adapter=PDO_MYSQL&host=localhost&username=root&password=&dbname=nazivBazePodatala\"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Osnovna namena modela u okviru MVC arhitekture je da komunicira sa bazom podataka. Za ActiveRecord. Razlika izmeñu

in komunicira direktno sa tabelom/tabelama, dok entiteta u bazi podataka

ava nezavisnost od sistema

će baze podataka. To se

preko instace adaptera komunicirate sa bazom podataka.

&

Page 37: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Select upiti

$db=Zend_Db_Table::getDefaultAdapter(); Dohvatanje rezultata $sql = 'SELECT * FROM tabela $result = $db->fetchAll($sql, 2);//asocijativni niz redova Izvršavanje upita i dohvatanje rezultata$select=$db->select()->from('tabela'); //SELECT * FROM tabela$rezultat=$db->query($select);$rezultat->fetchAll(); Promena formata vraćenih podataka$db->setFetchMode(Zend_Db::FETCH_OBJ); // može još Zend_Db::FETCH_NUM, Zend_Db::FETCH_BOTH, Zend_Db::FETCH_COLUMN, Zend_Db::FETCH_OBJ$result = $db->fetchAll('SELECT * FROM // $result je niz objekata echo $result[0]->kolona3; Preuzimanje podataka u formi niz asocijativnih nizova$db->setFetchMode(Zend_Db$result = $db->fetchAssoc('SELECT kolona1echo $result[2]['kolona3']; echo $result[1]['kolona3']; // Preuzimanje podataka jedne kolone$db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchCol('SELECT kolona1, kolona2 FROMecho $result[0]; // vraca samo vrednost prve kolone $db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchPairs('SELECT kolona1, kolona2 FROM tabela'); echo $result[2];// red 3 gde su elementi u formi asocijativnog niza Preuzimanje jednog reda podataka$db->setFetchMode(Zend_Db::FETCH_OBJ); $result = $db->fetchRow('SELECT * FROM tabela WHERE tabela_id = 2');// $result je jedan objekat echo $result->kolona3;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

$db=Zend_Db_Table::getDefaultAdapter();

$sql = 'SELECT * FROM tabela WHERE tabela_id = ?'; >fetchAll($sql, 2);//asocijativni niz redova

Izvršavanje upita i dohvatanje rezultata >from('tabela'); //SELECT * FROM tabela

>query($select);

enih podataka >setFetchMode(Zend_Db::FETCH_OBJ); // može još Zend_Db::FETCH_NUM,

Zend_Db::FETCH_BOTH, Zend_Db::FETCH_COLUMN, Zend_Db::FETCH_OBJ>fetchAll('SELECT * FROM tabela WHERE tabela_id = ?', 2);

Preuzimanje podataka u formi niz asocijativnih nizova >setFetchMode(Zend_Db::FETCH_OBJ);

'SELECT kolona1, kolona2, kolona3 FROM tabela');

echo $result[1]['kolona3']; // $result je niz asocijativnih nizova

Preuzimanje podataka jedne kolone >setFetchMode(Zend_Db::FETCH_OBJ);

'SELECT kolona1, kolona2 FROM tabela WHERE kolona2 = ?', 2);vraca samo vrednost prve kolone

etFetchMode(Zend_Db::FETCH_OBJ); >fetchPairs('SELECT kolona1, kolona2 FROM tabela');

red 3 gde su elementi u formi asocijativnog niza

Preuzimanje jednog reda podataka >setFetchMode(Zend_Db::FETCH_OBJ);

>fetchRow('SELECT * FROM tabela WHERE tabela_id = 2');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

>setFetchMode(Zend_Db::FETCH_OBJ); // može još Zend_Db::FETCH_NUM, Zend_Db::FETCH_BOTH, Zend_Db::FETCH_COLUMN, Zend_Db::FETCH_OBJ

_id = ?', 2);

, kolona2, kolona3 FROM tabela');

tabela WHERE kolona2 = ?', 2);

>fetchRow('SELECT * FROM tabela WHERE tabela_id = 2');

Page 38: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Insert upit

Update upit

$data = array('updated_on' => '2007 'bug_status' => 'FIXED'); $n = $db->update('bugs', $data, 'bug_id = 2');$data = array('updated_on' => '2007 'bug_status' => 'FIXED'); $where[] = "reported_by = 'goofy'";$where[] = "bug_status = 'OPEN'"; $n = $db->update('bugs', $data, $where);// SQL upit: // UPDATE "bugs" SET "update_on" = '2007// WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')

//Unošenje podataka u tabelu$data = array( 'datum' => '2007-03-22', 'naslov' => 'Something wrong', 'status' => 'NEW' ); $db->insert('tabela', $data); //Unošenje sa MySql kodom$data = array( 'datum' => new Zend_Db_Expr('CURDATE()'), 'naslov' => 'Something wrong', 'status' => 'NEW' ); $db->insert('tabela', $data); // posledenja vrednost unesenog id$db->insert('tabela', $data); $id = $db->lastInsertId();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

'updated_on' => '2007-03-23', 'bug_status' => 'FIXED'

>update('bugs', $data, 'bug_id = 2'); ' => '2007-03-23',

'bug_status' => 'FIXED'

$where[] = "reported_by = 'goofy'"; $where[] = "bug_status = 'OPEN'";

>update('bugs', $data, $where);

// UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'// WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')

//Unošenje podataka u tabelu

22', 'naslov' => 'Something wrong',

//Unošenje sa MySql kodom

'datum' => new Zend_Db_Expr('CURDATE()'), 'naslov' => 'Something wrong',

denja vrednost unesenog id-a

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

"bug_status" = 'FIXED'

Page 39: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Update upiti (nastavak)

Delete upiti

Enkodovanje podataka Da bi sprečili da odreñene vrednosti u okviru promenljivih ugroze integritet baze podataka potrebno je sve vrednosti koje se prosle

//loše $name = "O'Reilly"; $sql = "SELECT * FROM bugs WHERE reported_by = '$name'"; echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O'Reilly' // dobro $name = $db->quote("O'Reilly");echo $name; // 'O\'Reilly' $sql = "SELECT * FROM bugs WHERE reported_by = $name"; echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O // dobro, konverzija u odgovaraju$value = '1234'; $sql = 'SELECT * FROM atable WHERE intColumn = '. $db

$n = $db->delete('bugs', 'bug_id = 3');

$data = array( 'updated_on' => '2007- 'bug_status' => 'FIXED'); $where['reported_by = ?'] = 'goofy';$where['bug_status = ?'] = 'OPEN'; $n = $db->update('bugs', $data, $where);// SQL upit: // UPDATE "bugs" SET "update_on" = '2007// WHERE ("reported_by" = 'goofy') AND

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

ene vrednosti u okviru promenljivih ugroze integritet baze podataka potrebno je sve vrednosti koje se prosleñuju u SQL upit dodatno obraditi.

ql = "SELECT * FROM bugs WHERE reported_by = '$name'";

// SELECT * FROM bugs WHERE reported_by = 'O'Reilly'

>quote("O'Reilly");

$sql = "SELECT * FROM bugs WHERE reported_by = $name";

// SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'

// dobro, konverzija u odgovarajući SQL tip

$sql = 'SELECT * FROM atable WHERE intColumn = '. $db->quote($value, 'INTEGER');

>delete('bugs', 'bug_id = 3');

-03-23', => 'FIXED'

$where['reported_by = ?'] = 'goofy'; $where['bug_status = ?'] = 'OPEN';

>update('bugs', $data, $where);

// UPDATE "bugs" SET "update_on" = '2007-03-23', "bug_status" = 'FIXED'// WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

ene vrednosti u okviru promenljivih ugroze integritet baze podataka

>quote($value, 'INTEGER');

23', "bug_status" = 'FIXED'

Page 40: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

enkodovanje (nastavak)

Metoda Active Record preko modela

class Application_Model_Kategorija{ protected $db;public $idKategorija;public $naziv;public $roditelj; public function __construct() { try{ $this->db=Zend_Db_Table::getDefaultAdapter(); }catch (Zend_Exception $ex){ print $ex->getMessage(); } } public function fetchAll(){ //$result=$this->db->query("SELECT * FROM kategorija"); $select=$this->db->select() $result=$this->db->query($select); return $result->fetchAll(); } public function insert(){ $data=array('naziv'=>$this $this->db->insert('kategorija', $data); }

// funkcija quoteInto $sql = $db->quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly"); echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O $sql = $db->quoteInto("SELECT * FROM bugs WHERE bug_id = echo $sql; // SELECT * FROM bugs WHERE reported_by = 1234 //enkodovanje SQL sintakse$tableName = $db->quoteIdentifier("order"); $sql = "SELECT * FROM $tableName"; echo $sql; // SELECT * FROM "order"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

preko modela

class Application_Model_Kategorija{ protected $db;public $idKategorija;public $naziv;public $roditelj; public function __construct() {

db=Zend_Db_Table::getDefaultAdapter(); }catch (Zend_Exception $ex){

>getMessage();

public function fetchAll(){ >query("SELECT * FROM kategorija");

>select()->from('kategorija'); >query($select);

>fetchAll();

$data=array('naziv'=>$this->naziv,'roditelj'=>$this->roditelj); >insert('kategorija', $data);

>quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");

// SELECT * FROM bugs WHERE reported_by = 'O\'Reilly'

>quoteInto("SELECT * FROM bugs WHERE bug_id = ?", '1234', 'INTEGER');

// SELECT * FROM bugs WHERE reported_by = 1234

//enkodovanje SQL sintakse >quoteIdentifier("order");

$sql = "SELECT * FROM $tableName";

// SELECT * FROM "order"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

>quoteInto("SELECT * FROM bugs WHERE reported_by = ?", "O'Reilly");

?", '1234', 'INTEGER');

Page 41: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Metoda DataMapper Ova metoda je znatno zastupljepoglavlja obezbeñuje interface Kada imate bazu podatka potrebno je da napravite kod kopodataka. Izrada koda uključuje izradu izvedena iz klase Zend_Db_Table_Abstract

Ova izvedena klasa ima nekoliko promenljivih koje se odnose na osnovne podatke o samoj tabeli kao što je ime tabele ($_nameako je ime kolone različito od Nakon kreiranja klase koja opisuje tabelu kreira se klasa koja predstavlja osnovni zadatak da vrši "prevoñOO jeziku. Ova klasa se sastoji od metoda koje baze podataka.

Na kraju se kreira model klasa koja opisuje jedan red tabele.

Ovako kreiran model se sada može koristiti u kontroleru preko instance klase Mapper.

zf create model ImeModela

zf create model ImeMapper

zf create db-table ImeKlase Imetabel

public function fetch(){ $id=$this->db->quote($this $select=$this->db->select() return $this->db->query($select) //return $this->db->query('SELECT * FROM kategorija WHERE idKategorija=?',array($id))->fetchObject(); } public function update(){ $data=array('naziv'=>$this $where['idKategorija=?']=$this $this->db->update('kategorija', $data, $where); } public function delete(){ $id=$this->db->quote($this $delete=$this->db->delete('kategorija','idKategorija='.$id); } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Ova metoda je znatno zastupljenija u aplikacijama jer kao što je rečeno u uvodom delu ovog interface izmeñu entiteta u OO jeziku i entiteta u bazi podataka.

podatka potrebno je da napravite kod koji će komunicirati sa podacima iz baze čuje izradu klase koja opisuje tabelu u bazi podataka i ta klasa je

Zend_Db_Table_Abstract.

Ova izvedena klasa ima nekoliko promenljivih koje se odnose na osnovne podatke o samoj tabeli ($_name) i primarnog ključa ($_id) . Promenljiva $_id

ito od id. Nakon kreiranja klase koja opisuje tabelu kreira se klasa koja predstavlja DataMapperosnovni zadatak da vrši "prevoñenje" izmeñu strukture podataka u tabeli i strukture podataka u

ku. Ova klasa se sastoji od metoda koje posreduju u razmeni podataka izme

Na kraju se kreira model klasa koja opisuje jedan red tabele.

Ovako kreiran model se sada može koristiti u kontroleru preko instance klase Mapper.

table ImeKlase Imetabele

>quote($this->id); >select()->from('kategorija')->where('idKategorija=?',$id);

>query($select)->fetchObject(); >query('SELECT * FROM kategorija WHERE

>fetchObject();

$data=array('naziv'=>$this->naziv,'roditelj'=>$this->roditelj); $where['idKategorija=?']=$this->idKategorija;

>update('kategorija', $data, $where);

>quote($this->idKategorija);

>delete('kategorija','idKategorija='.$id);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

eno u uvodom delu ovog i entiteta u bazi podataka.

e komunicirati sa podacima iz baze klase koja opisuje tabelu u bazi podataka i ta klasa je

Ova izvedena klasa ima nekoliko promenljivih koje se odnose na osnovne podatke o samoj tabeli

$_id se inicijalizuje samo

DataMapper i čiji je u strukture podataka u tabeli i strukture podataka u

u razmeni podataka izmeñu koda i

Ovako kreiran model se sada može koristiti u kontroleru preko instance klase Mapper.

>where('idKategorija=?',$id);

Page 42: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

U prilogu ovog materija dat je kod svih klasa

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Šema baze podataka

U prilogu ovog materija dat je kod svih klasa koje čine model.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 43: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Komponente Zend FrameworkZend_Db_Adapter Predstavlja klasu koja omoguć

Čitanje rezultata upita

$sql = 'SELECT * FROM $result = $db->fetchAll($sql

$db->setFetchMode(Zend_Db::$result = $db->fetchAll('SELECT// $result je niz objekata echo $result[0]->bug_description

$db->setFetchMode(Zend_Db::$result = $db->fetchAssoc('SELECT// $result je niz asocijativnihecho $result[2]['bug_description']echo $result[1]['bug_description']$db->setFetchMode(Zend_Db::$result = $db->fetchCol('SELECT= ?', 2); // vraca samo bug_description;echo $result[0]; $db->setFetchMode(Zend_Db::$result = $db->fetchRow('SELECT// $result je objekat echo $result->bug_description

$db = new Zend_Db_Adapter_Pdo_Mysql 'host' => '127.0.0.1' 'username' => 'webuser' 'password' => 'xxxxxxxx' 'dbname' => 'test' )); // isti efekat kao sa konstruktorom$db = Zend_Db::factory('Pdo_Mysql' 'host' => '127.0.0.1' 'username' => 'webuser' 'password' => 'xxxxxxxx' 'dbname' => 'test' ));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Komponente Zend Framework-a za rad sa bazom podataka

Predstavlja klasu koja omogućava komunikaciju vaše aplikacije sa bazom podataka.

FROM bugs WHERE bug_id = ?'; fetchAll($sql, 2);

Zend_Db::FETCH_OBJ); fetchAll('SELECT * FROM bugs WHERE bug_id = ?'

bug_description;

Zend_Db::FETCH_OBJ); fetchAssoc('SELECT bug_id, bug_description, bug_statusasocijativnih nizova

$result[2]['bug_description']; // opis Bug #2 $result[1]['bug_description']; // opis Bug #1

Zend_Db::FETCH_OBJ); fetchCol('SELECT bug_description, bug_id FROM bugs

bug_description;

Zend_Db::FETCH_OBJ); fetchRow('SELECT * FROM bugs WHERE bug_id =

bug_description;

Zend_Db_Adapter_Pdo_Mysql(array( '127.0.0.1',

'webuser', 'xxxxxxxx',

konstruktorom factory('Pdo_Mysql', array(

'127.0.0.1', 'webuser', 'xxxxxxxx',

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a komunikaciju vaše aplikacije sa bazom podataka.

?', 2);

bug_status FROM bugs');

bugs WHERE bug_id

= 2');

Page 44: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Upis promena u bazu podataka

$data = array( 'created_on' => '2007 'bug_description' => 'Something 'bug_status' => 'NEW')$db->insert('bugs', $data)

$data = array( 'created_on' => new 'bug_description' => 'Something 'bug_status' => 'NEW')$db->insert('bugs', $data)$db->insert('bugs', $data)// return the last value generated$id = $db->lastInsertId()

$db->insert('bugs', $data)// return the last value generated$id = $db->lastInsertId('bugs'// alternatively, return the$id = $db->lastInsertId('bugs')

$result = $db->fetchOne('SELECT// samo jedna vrednost echo $result;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Upis promena u bazu podataka

'2007-03-22', 'Something wrong',

'NEW'); $data);

new Zend_Db_Expr('CURDATE()'), 'Something wrong',

'NEW'); $data); $data);

generated by an auto-increment column lastInsertId();

$data); generated by sequence 'bugs_bug_id_seq'.

lastInsertId('bugs', 'bug_id'); the last value generated by sequence 'bugs_seq'.

lastInsertId('bugs');

fetchOne('SELECT bug_status FROM bugs WHERE

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

'bugs_seq'.

bug_id = 2');

Page 45: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Ažiriranje podataka

Brisanje podataka

Transakcije

Zatvaranje konekcije

$db->closeConnection();

// Start transakcije. $db->beginTransaction()try { //pokušaj izvršavanja više$db->query(...); $db->query(...); $db->query(...); $db->commit();

} catch (Exception $e) { $db->rollBack(); echo $e->getMessage()}

$n = $db->delete('bugs', 'bug_id

$data = array( 'updated_on' => '2007 'bug_status' => 'FIXED') $n = $db->update('bugs'

$data = array( 'updated_on' => '2007 'bug_status' => 'FIXED')$where[] = "reported_by$where[] = "bug_status =$n = $db->update('bugs',$data = array( 'updated_on' => '2007 'bug_status' => 'FIXED')$where['reported_by = ?']$where['bug_status = ?'] $n = $db->update('bugs',

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

beginTransaction();

više upita:

getMessage();

'bug_id = 3');

'2007-03-23', 'FIXED');

update('bugs', $data, 'bug_id = 2');

'2007-03-23', 'FIXED');

"reported_by = 'goofy'"; = 'OPEN'"; , $data, $where);

'2007-03-23', 'FIXED');

?'] = 'goofy'; = 'OPEN';

, $data, $where);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 46: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Db_Statement Svaki upit koji se izvrši vraća instancu objekta tipa metode query() koja može da sadrži dva parametra (sql upit i opcioni niz vrednosti koje se prosleñuju upitu)

Dohvatanje rezultata

Promena načina vraćanja podataka

$stmt = $db->query('SELECT$stmt->setFetchMode(Zend_Db::$rows = $stmt->fetchAll() echo $rows[0][0];

$stmt = $db->query('SELECT$bug_status = $stmt->fetchColumn(2)

$stmt = $db->query('SELECT$obj = $stmt->fetchObject() echo $obj->bug_description

$stmt = $db->query('SELECTwhile ($row = $stmt->fetch()) echo $row['bug_description']} $stmt = $db->query('SELECT$rows = $stmt->fetchAll() echo $rows[0]['bug_description']

$sql = 'SELECT * FROM$stmt = new Zend_Db_Statement_Mysqli$stmt->execute(array('goofy'$sql = 'SELECT * FROM 'reported_by = :reporter$stmt = new Zend_Db_Statement_Mysqli$stmt->execute (array(':reporter'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

ća instancu objekta tipa Zend_Db_Statement. Upit se izvršava preko koja može da sadrži dva parametra (sql upit i opcioni niz vrednosti koje se

anja podataka

query('SELECT * FROM bugs'); Zend_Db::FETCH_NUM);

fetchAll();

query('SELECT bug_id, bug_description, bug_status FROMfetchColumn(2);

query('SELECT bug_id, bug_description, bug_status FROMfetchObject();

bug_description;

query('SELECT * FROM bugs'); fetch()) {

$row['bug_description'];

query('SELECT * FROM bugs'); fetchAll();

$rows[0]['bug_description'];

FROM bugs WHERE reported_by = ? AND bug_statusZend_Db_Statement_Mysqli($db, $sql);

('goofy', 'FIXED')); FROM bugs WHERE ' . :reporter AND bug_status = :status';

Zend_Db_Statement_Mysqli($db, $sql); (':reporter' => 'goofy', ':status' => 'FIXED'));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

. Upit se izvršava preko koja može da sadrži dva parametra (sql upit i opcioni niz vrednosti koje se

FROM bugs');

FROM bugs');

bug_status = ?';

Page 47: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Db_Select Predstavlja klasu koja opisuje SELECT upit i poseduje metode neophodne za konstruisanje SELECT upita posredstvom PHP koda.

$db = Zend_Db::factory($select = $db->select(); // Kreiranje Zend_Db_Select$db = Zend_Db::factory($select = new Zend_Db_Select// Kreiranje upita $select = $db->select(); // dodavanje FROM klauzule$select->from( ...specify // dodavanje WHERE klauzule$select->where( ...specify search criteria...// dodavanje ORDER BY$select->order( ...specify sorting criteria...// ili $select = $db->select() ->from( ...specify table and columns... ->where( ...specify search criteria... ->order( ...specify sorting criteria...//form klauzula // SELECT * FROM "products"$select = $db->select()->// Build this query:SELECT$select = $db->select()->

//rad sa kolonama // Build this query: // SELECT p."product_id",// FROM "products" AS

$select = $db->select()

-> array('product_id'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Predstavlja klasu koja opisuje SELECT upit i poseduje metode neophodne za konstruisanje SELECT upita posredstvom PHP koda.

factory( ...options... );

Zend_Db_Select objekta factory( ...options... );

Zend_Db_Select($db);

klauzule

...specify table and columns... ) klauzule

...specify search criteria... ) BY klauzule

...specify sorting criteria... );

...specify table and columns... ) ...specify search criteria... )

...specify sorting criteria... );

"products" >from( 'products' );

query:SELECT p.* FROM "products" AS p >from( array('p' => 'products') );

p."product_id", p."product_name" AS p

>from(array('p' => 'products'), ('product_id', 'product_name'));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Predstavlja klasu koja opisuje SELECT upit i poseduje metode neophodne za konstruisanje

Page 48: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

// Build the same query, specifying// SELECT p."product_id",// FROM "products" AS

$select = $db->select()-> array('p.product_id'

// Build this query with an// SELECT p."product_id"// FROM "products" AS

$select = $db->select()-> array('prodno'// izrazi u kolonama //SELECT p."product_id",$select = $db->select()->array('product_id', 'LOWER(product_name)'))// SELECT p."product_id",// FROM "products" AS $select = $db->select()-array('product_id','cost_plus_tax'

//SELECT p."product_id",$select = $db->select()-> 'cost_plus_tax'// dodavanje kolona na postoje// SELECT p."product_id",$select = $db->select()-> -> columns('product_name')// SELECT p."product_$select = $db->select() ->from(array('p' ->columns('product_name' // Alternatively use// JOIN // SELECT p."product_id",// FROM "products" AS// ON p.product_id = $select = $db->select()-array('product_id', 'product_name'))l.product_id'); // joinUsing // SELECT * FROM "table1"WHERE column2 = 'foo'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

specifying correlation names: p."product_id", p."product_name"

AS p

>from(array('p' => 'products'), ('p.product_id', 'p.product_name'));

an alias for one column: p."product_id" AS prodno, p."product_name"

AS p

>from(array('p' => 'products'), ('prodno' => 'product_id', 'product_name'));

p."product_id", LOWER(product_name) FROM "products">from(array('p' => 'products'),

'LOWER(product_name)')); p."product_id", (p.cost * 1.08) AS cost_plus_tax

AS p ->from(array('p' => 'products'),

'cost_plus_tax' => '(p.cost * 1.08)'));

p."product_id", p.cost * 1.08 AS cost_plus_taxFROM "products">from(array('p' => 'products'),array('product_id'

'cost_plus_tax' =>new Zend_Db_Expr('p.cost * 1.08')))postojeće upite

p."product_id", p."product_name" FROM "products" AS>from(array('p' => 'products'), 'product_id')

columns('product_name'); p."product_id", p."product_name" FROM "products" AS

=> 'products'), 'p.product_id') columns('product_name', 'p');

use columns('p.product_name')

p."product_id", p."product_name", l.* AS p JOIN "line_items" AS l

l.product_id ->from(array('p' => 'products'),

'product_name')) ->join(array('l' => 'line_items'),'p.product_id

"table1" JOIN "table2" ON "table1".column1 ='foo'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

"products" AS p

"products" AS p ('product_id',

1.08')));

AS p

AS p

'p.product_id =

= "table2".column1

Page 49: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

$select = $db->select()->from('table1')?', 'foo');

//WHERE klauzula // SELECT product_id, // WHERE price > 100.00$select = $db->select()-> ->where('price > 100.00')//SELECT product_id, product_name,$minimumPrice = 100; $select = $db->select()->where('price > ?', $minimumPrice)// SELECT product_id, (1, 2, 3)) $productIds = array(1, 2, $select = $db->select()-where('product_id IN (?)'// SELECT product_id, // WHERE (price > 100.00)$minimumPrice = 100; $maximumPrice = 500; $select = $db->select()-> ->where('price > ->where('price <// SELECT product_id, 100.00) OR (price > 500.00) $minimumPrice = 100; $maximumPrice = 500; $select = $db->select()->> where('price < ?', $minimumPrice)// SELECT product_id, // WHERE (price < 100.00$minimumPrice = 100; $maximumPrice = 500; $prod = 'Apple'; $select = $db->select() - ->where("price <where('product_name = ?'//Group By // SELECT p."product_id",// FROM "products" ASGROUP BY p.product_id

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

from('table1')->joinUsing ('table2', 'column1')-

product_name, price FROM "products" 100.00

>from('products', array('product_id', 'product_name'100.00');

product_name, price FROM "products" WHERE

->from('products', array('product_id', 'product_name'$minimumPrice);

product_name, price FROM "products" WHERE

, 3); ->from('products',array('product_id', 'product_name'

(?)', $productIds); product_name, price FROM "products"

100.00) AND (price < 500.00)

>from('products', array('product_id', 'product_name'> ?', $minimumPrice) < ?', $maximumPrice); product_name, price FROM "products" WHERE

500.00) >from('products', array('product_id', 'product_name'

$minimumPrice)->orWhere('price > ?', $maximumPrice) product_name, price FROM "products"

100.00 OR price > 500.00) AND (product_name

->from('products', array('product_id', 'product< $minimumPrice OR price > $maximumPrice")?', $prod);

p."product_id", COUNT(*) AS line_items_per_product AS p JOIN "line_items" AS l ON p.product_id =

p.product_id

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

->where('column2 =

'product_name', 'price'))

WHERE (price > 100.00)

'product_name', 'price'))-

WHERE (product_id IN

'product_name', 'price'))->

'product_name', 'price'))

WHERE (price <

'product_name', 'price')) $maximumPrice);

(product_name = 'Apple')

'product_name', 'price')) $maximumPrice")->

= l.product_id

Page 50: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

$select = $db->select()->array('product_id'))-> join(arrayarray('line_items_per_product'

// HAVING // SELECT p."product_id",// FROM "products" ASGROUP BY p.product_id$select = $db->select()->join(array('l' => 'line_items')array('line_items_per_product'-> group('p.product_id')-// ORDER BY // SELECT p."product_id",// FROM "products" ASGROUP BY p.product_id $select = $db->select()->>join(array('l' => 'line_items')array('line_items_per_product'

->order(array('line_items_per_product// LIMIT // SELECT p."product_id",// FROM "products" AS// LIMIT 10, 20 $select = $db->select()->array('product_id', 'product_name'))

// LIMIT klauzula nema istuZend_Db_Adapter_Abstract

//SELECT p."product_id",$select = $db->select()->array('product_id', 'product_name'))

// SELECT DISTINCT p."product_name" $select = $db->select()->

$select = $db->select()->$stmt = $db->query($select)$result = $stmt->fetchAll()

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

>from(array('p' => 'products'), array('l' => 'line_items'),'p.product_id = l.product_id'

('line_items_per_product' => 'COUNT(*)'))-> group('p.product_id');

p."product_id", COUNT(*) AS line_items_per_product AS p JOIN "line_items" AS l ON p.product_id =

p.product_id HAVING line_items_per_product > 10 >from(array('p' => 'products'), array('product_id'))

'line_items'), 'p.product_id = l.product_id', ('line_items_per_product' => 'COUNT(*)'))

-> having('line_items_per_product > 10');

p."product_id", COUNT(*) AS line_items_per_product AS p JOIN "line_items" AS l ON p.product_id =

p.product_id ORDER BY "line_items_per_product" DESC,

>from(array('p' => 'products'), array('product_id'))'line_items'),'p.product_id = l.product_id',

('line_items_per_product' => 'COUNT(*)'))->group('p.product_id')('line_items_per_product DESC','product_id'));

p."product_id", p."product_name" AS p

>from(array('p' => 'products'), 'product_name'))->limit(20, 10);

istu sintaksu u svim sistemima baza podatakaZend_Db_Adapter_Abstract to sam prevodi

p."product_id", p."product_name" FROM "products" AS p>from(array('p' => 'products'),

'product_name'))->limitPage(2, 10); p."product_name" FROM "products" AS p

>distinct()-> from(array('p' => 'products'), 'product_name')>from('products');

query($select); fetchAll();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

l.product_id', ;

= l.product_id

('product_id'))->

= l.product_id DESC, "product_id"

('product_id'))-

group('p.product_id')

podataka ali

p LIMIT 10, 20

'product_name');

Page 51: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Izvršavanje upita

Zend_Db_Table Ova klasa predstavlja interface ka tabeli u bazi podataka. Sadrži i metode za operacije nad tabelama. Ova klasa se može nasleDa bi definisali klasu za proizvoljnu tabelu mora ta klasa da nasledi klasu Relacije izmeñu tabela biće opisane kasnije.

// Prva alternativa: class Bugs extends Zend_Db_Table_Abstract

protected $_schemaprotected $_name

} // Druga alternativa: class Bugs extends Zend_Db_Table_Abstractprotected $_name = 'bug_db.bugs'}

// prednost ima šema kojaclass Bugs extends Zend_Db_Table_Abstract

protected $_nameprotected $_schema

} // Definisanje preko konstruktora//Prva alternative: $tableBugs = new Bugs// Druga alternativa: $tableBugs = new Bugs// Treća alternativa: $tableBugs = new Bugs(

$select = $db->select()->$stmt = $select->query()$result = $stmt->fetchAll()

$select = $db->select()-> $sql = $select->__toStringecho "$sql\n"; // SELECT * FROM "products"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Ova klasa predstavlja interface ka tabeli u bazi podataka. Sadrži i metode za operacije nad tabelama. Ova klasa se može nasleñivati tako da se može dodati custom logika.Da bi definisali klasu za proizvoljnu tabelu mora ta klasa da nasledi klasu Zend_Db_Table

će opisane kasnije.

Zend_Db_Table_Abstract{ $_schema = 'bug_db'; $_name = 'bugs';

Zend_Db_Table_Abstract{ 'bug_db.bugs'; //sema i naziv na jednom mestu

koja je definisana u okviru promenljive $_nameZend_Db_Table_Abstract{

$_name = 'bug_db.bugs'; $_schema = 'ignored';

konstruktora

Bugs(array('name' => 'bugs', 'schema' => 'bug_db'))

Bugs(array('name' => 'bug_db.bugs'));

(array('name' => 'bug_db.bugs', 'schema' => 'ignored'))

>from('products'); query(); fetchAll();

>from('products');

>__toString();

"products"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Ova klasa predstavlja interface ka tabeli u bazi podataka. Sadrži i metode za operacije nad logika.

Zend_Db_Table.

$_name

'bug_db'));

'ignored'));

Page 52: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Ako se ime klase poklapa sa imenom tabele (mala i velika slova) onda se vrednost promenljivoj $_name Primarni ključ

Kreiranje instance

Upiti preko Zend_Db_Table instance

$table = new Bugs(); $data = array( 'created_on' => '2007 'bug_description' => 'Something 'bug_status' => 'NEW'); $table->insert($data); $table = new Bugs(); $data = array( 'updated_on' => '2007 'bug_status' => 'FIXED'); $where = $table->getAdapter()$table->update($data, $where)

// Izrada tabele preko Adaptera:$db = Zend_Db::factory('PDO_MYSQL'$table = new Bugs(array// Izrada tabele preko podrazumevanog$db = Zend_Db::factory('PDO_MYSQL'Zend_Db_Table_Abstract:://... // Izrada tabele preko Registry$table = new Bugs(); $db = Zend_Db::factory('PDO_MYSQL'Zend_Registry::set('my_db'//... $table = new Bugs(array

class Bugs extends Zend_Db_Table_Abstractprotected $_name = 'bugs'protected $_primary = 'bug_id'niza }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Ako se ime klase poklapa sa imenom tabele (mala i velika slova) onda se ne mora$_name.

instance

'2007-03-22', 'Something wrong',

'NEW'

'2007-03-23', 'FIXED'

getAdapter()->quoteInto('bug_id = ?', 1234); $where);

Adaptera: factory('PDO_MYSQL', $options);

array('db' => $db)); podrazumevanog Adaptera:

factory('PDO_MYSQL', $options); Zend_Db_Table_Abstract::setDefaultAdapter($db);

Registry-a

factory('PDO_MYSQL', $options); set('my_db', $db);

array('db' => 'my_db'));

Zend_Db_Table_Abstract{ 'bugs';

'bug_id'; //ako ima više primarni ključeva onda se navode u obliku

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

ne mora dodeljivati

eva onda se navode u obliku

Page 53: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Povratni tipovi Zend_Db_Table_Rowse

$table = new Bugs(); $select = $table->select()$select->where('bug_status// Pronañi jedan red, vrać$rows = $table->fetchAll($select)

$table = new Bugs(); // Pronañi jedan red, vrać$select = $table->select() ->order('bug_id') $row = $table->fetchRow($select)

class My_Row extends Zend_Db_Table_Row_Abstract class My_Rowset extends $table = new Bugs(array $where = $table->getAdapter() // Vraća My_Rowset,pojedini$rows = $table->fetchAll($where)

$table = new Bugs(); $where = $table->getAdapter()$table->delete($where);

$table = new Bugs(); // Pronañi jedan red, vrać$rows = $table->find(1234) // Pronañi više redova,vra$rows = $table->find(array

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend_Db_Table_Rowset i Zend_Db_Table_Row

select(); where('bug_status = ?', 'NEW');

vraća Zend_Db_Table_Rowset fetchAll($select);

vraća Zend_Db_Table_Rows select()->where('bug_status = ?', 'NEW') order('bug_id');

fetchRow($select);

Zend_Db_Table_Row_Abstract{...}

extends Zend_Db_Table_Rowset_Abstract{...}

array('rowClass' => 'My_Row','rowsetClass' =>

getAdapter()->quoteInto('bug_status = ?', 'NEW')

My_Rowset,pojedini elementi su My_Row fetchAll($where);

getAdapter()->quoteInto('bug_id = ?', 1235);

vraća Rowset find(1234);

,vraća Rowset array(1234, 5678));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

'My_Rowset'));

Page 54: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Definisanje metoda za Insert,Update i Delete

Zend_Db_Table_Row Predstavlja klasu koja opisuje jedan red u tabeli i sadrži svojstva i metode koje obrvezane za red.

$bugs = new Bugs(); $row = $bugs->fetchRow($bugs$bugs = new Bugs(); $rowset = $bugs->fetchAll($bugs$row = $rowset->current()$bugs = new Bugs(); $row = $bugs->fetchRow($bugs// Štampanje bug_descriptionecho $row->bug_description// Vraća kolona/rednost asocijativni$rowArray = $row->toArray()foreach ($rowArray as $column echo "Column: $column} // Promena vrednosti jednoj$row->bug_status = 'FIXED'// UPDATE reda $row->save();

class Bugs extends Zend_Db_Table_Abstract protected $_name = 'bugs' public function insert if (empty($data['created_on'])) $data['created_on'] } return parent::insert($data) } public function update(array if (empty($data['updated_on'])) $data['updated_on'] } return parent::update($data } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Insert,Update i Delete

Predstavlja klasu koja opisuje jedan red u tabeli i sadrži svojstva i metode koje obr

fetchRow($bugs->select()->where('bug_id = ?' , 1));

fetchAll($bugs->select()->where('bug_status = ?',1))current();

fetchRow($bugs->select()->where('bug_id = ?', 1)); bug_description reda bug_description;

asocijativni niz toArray();

$column => $value) { $column\n";echo "Value: $value\n";

jednoj ili više kolona 'FIXED';

Zend_Db_Table_Abstract{ 'bugs';

insert(array $data){ ($data['created_on'])) {

$data['created_on'] = time();

insert($data);

array $data, $where){ ($data['updated_on'])) {

$data['updated_on'] = time();

ate($data, $where);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Predstavlja klasu koja opisuje jedan red u tabeli i sadrži svojstva i metode koje obrañuju podatke

1));

Page 55: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Definisanje proizvoljnih redova

class MyRow extends Zend_Db_Table_Row_Abstract// Specifikacija reda za tabelu,prvi

class Products extends Zend_Db_Table_Abstract

protected $_name = 'products'protected $_rowClass =

}

// drugi način

$bugs = new Bugs(array

// INSERT novog reda $bugs = new Bugs(); $newRow = $bugs->createRow()// Inicijalizovanje vrednosti$newRow->bug_description$newRow->bug_status =$newRow->save();// ili $data = array('bug_description'$bugs = new Bugs(); $newRow = $bugs->createRow($data)// INSERT novog reda $newRow->save(); // Promena vrednosti nad$bugs = new Bugs(); $newRow = $bugs->createRow()$data = array( 'bug_description' => '...description...' 'bug_status' => 'NEW'); $newRow->setFromArray($data)$newRow->save(); // Brisanje reda $bugs = new Bugs(); $row = $bugs->fetchRow('bug_id$row->delete(); // Serializacija i deserializacija$bugs = new Bugs(); $row = $bugs->fetchRow('bug_id$serializedRow = serialize$rowClone = unserialize

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Definisanje proizvoljnih redova

Zend_Db_Table_Row_Abstract{ // ...sopstveni

tabelu,prvi način

Zend_Db_Table_Abstract{

'products'; 'MyRow';

array('rowClass' => 'MyRow'));

createRow(); vrednosti

bug_description = '...opis...'; = 'NEW';

('bug_description' => '...description...','bug_status' =>

createRow($data);

nad više kolona

createRow();

'...description...', 'NEW'

setFromArray($data);

fetchRow('bug_id = 1');

deserializacija

fetchRow('bug_id = 1'); serialize($row);

unserialize($serializedRow); echo $rowClone-> bug_description

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

...sopstveni kod}

=> 'NEW');

bug_description;

Page 56: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Db_Table_Rowset Predstavlja kolekciju redova u tabeli.

$rowset = $bugs->fetchAll("bug_status

$rowCount = count($rowset)

if ($rowCount > 0) { echo "found $rowCount

} else { echo 'no rows matched

}

$bugs = new Bugs();

$rowset = $bugs->fetchAll("bug_id

$row = $rowset->current()$bugs = new Bugs();

$rowset = $bugs->fetchAll()// nañi 9-ti element:

$rowset->seek(8);

$row9 = $rowset->current()

$row9->assigned_to = 'mmouse'

$row9->save(); // vraćanje podataka u obliku

$bugs = new Bugs();

$rowset = $bugs->fetchAll()$rowsetArray = $rowset-

$rowCount = 1;

foreach ($rowsetArray as

echo "row #$rowCount: foreach ($rowArray as

echo "\t$column =>

} ++$rowCount;

echo "\n";

}

// izvoñenje RowSet-a

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Predstavlja kolekciju redova u tabeli.

fetchAll("bug_status = 'FIXED'");

($rowset);

$rowCount rows";

matched the query';

fetchAll("bug_id = 1");

current();

fetchAll();

current();

'mmouse';

obliku niza:

fetchAll(); ->toArray();

as $rowArray) {

#$rowCount:\n"; as $column => $value) {

=> $value\n";

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 57: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Definisanje relacija izmeñu tabela

class MyRowset extends // Navoñenje sopstvenog

class Products extends Zend_Db_Table_Abstract

protected $_name = 'products' protected $_rowsetClass

} // Drugi način

$bugs = new Bugs(array

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Definisanje relacija izmeñu tabela

extends Zend_Db_Table_Rowset_Abstract{// ...}

sopstvenog RowSet-a za tabelu,prvi način

Zend_Db_Table_Abstract{

'products'; $_rowsetClass = 'MyRowset';

array('rowsetClass' => 'MyRowset'));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 58: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Relacije se definišu u okviru klasa koje opisuju tabele.

class Accounts extends Zend_Db_Table_Abstract protected $_name

protected $_dependentTables}

class Products extends Zend_Db_Table_Abstract protected $_name protected $_dependentTables

} class Bugs extends Zend_Db_Table_Abstract

protected $_name protected $_dependentTables protected $_referenceMap 'Reporter' => array( 'columns' => 'refTableClass' 'refColumns' ), 'Engineer' => array(

'columns''refTableClass''refColumns'), 'Verifier''columns''refTableClass''refColumns'

) ); } class BugsProducts extendsprotected $_name = 'bugs_products'protected $_referenceMap//naziv veze 'Bug' => array

'columns''refTableClass''refColumns'), 'Product''columns''refTableClass''refColumns'

) );

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Relacije se definišu u okviru klasa koje opisuju tabele.

Zend_Db_Table_Abstract{ = 'accounts';

$_dependentTables = array('Bugs');// lista tabela u kojima se nalazi strani klju

Zend_Db_Table_Abstract{ = 'products';

$_dependentTables = array('BugsProducts');

Zend_Db_Table_Abstract{ = 'bugs';

$_dependentTables = array('BugsProducts'); $_referenceMap = array(

( => 'reported_by', => 'Accounts', => 'account_name'

( 'columns' => 'assigned_to', 'refTableClass' => 'Accounts', 'refColumns' => 'account_name'

'Verifier' => array( 'columns' => array('verified_by'), 'refTableClass' => 'Accounts', 'refColumns' => array('account_name')

extends Zend_Db_Table_Abstract{ 'bugs_products';

$_referenceMap = array( array(

'columns' => array('bug_id'),//strani ključ 'refTableClass' => 'Bugs', 'refColumns' => array('bug_id')

'Product' => array( 'columns' => array('product_id'), 'refTableClass' => 'Products', 'refColumns' => array('product_id')

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

;// lista tabela u kojima se nalazi strani ključ

Page 59: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Vraćanje zavisnih vrednosti

$accountsTable = new Accounts$accountsRowset = $accountsTable$user1234 = $accountsRowset$bugsReportedByUser = $user1234

$accountsTable = new Accounts$accountsRowset = $accountsTable$user1234 = $accountsRowset

// Navoñenje pravila za $bugsAssignedToUser =

$accountsTable = new Accounts$accountsRowset = $accountsTable$user1234 = $accountsRowset$select = $accountsTable$bugsAssignedToUser =$select);

$accountsTable = new Accounts$accountsRowset = $accountsTable$user1234 = $accountsRowset // Specijalna metoda koja$bugsReportedBy = $user1234 // Specijalna metoda kojaEngineer $bugsAssignedTo = $user1234$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1 = $bugsRowset->$reporter = $bug1->findParentRow('Accounts')$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1 = $bugsRowset->$engineer = $bug1->findParentRow('Accounts'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Accounts(); $accountsTable->find(1234);

$accountsRowset->current(); $user1234->findDependentRowset('Bugs');

Accounts(); accountsTable->find(1234);

$accountsRowset->current();

vezivanje = $user1234->findDependentRowset('Bugs','Engineer')

Accounts(); $accountsTable->find(1234);

$accountsRowset->current(); $accountsTable->select()->order('name ASC')->limit(3);

= $user1234->findDependentRowset('Bugs','Engineer'

Accounts(); $accountsTable->find(1234);

$accountsRowset->current();

koja traži sve bagove za odreñeni account $user1234->findBugs();

koja traži sve bagove za odreñeni account po vezi

$user1234->findBugsByEngineer(); ();

$bugsTable->fetchAll(array('bug_status = ?' => 'NEW'))>current();

findParentRow('Accounts'); ();

$bugsTable->fetchAll(array('bug_status = ?', 'NEW'))>current();

findParentRow('Accounts', 'Engineer');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

'Engineer');

'Engineer',

vezi koja se zove

'NEW'));

'NEW'));

Page 60: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Vraćanje zavisnih vrednosti

Vraćanje podataka sa vezom n:n

Izvršavanje kaskadnih operacija

$productsTable = new Products$productsRowset = $productsTable$product1234 = $productsRowset$product1234->delete(); // Brisanje zavisnih redova

$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1234 = $bugsRowset// ime tabele,ime vezivne$productsRowset = $bug1234

$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1234 = $bugsRowset// ime tabele,ime vezivne$productsRowset = $bug1234'BugsProducts', 'Bug');

$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1234 = $bugsRowset // Upotreba podrazumevane$products = $bug1234-> // Specifikacija pravila po$products = $bug1234->

$bugsTable = new Bugs()$bugsRowset = $bugsTable$bug1 = $bugsRowset->$reporter = $bug1->findParentAccounts()$engineer = $bug1->findParentAccountsByEngineer()

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

anje podataka sa vezom n:n

Izvršavanje kaskadnih operacija

Products(); $productsTable->find(1234);

$productsRowset->current();

(); $bugsTable->find(1234);

$bugsRowset->current(); vezivne tabele

$bug1234->findManyToManyRowset('Products', 'BugsProducts');

(); $bugsTable->find(1234);

$bugsRowset->current(); vezivne tabele,ime pravila

$bug1234->findManyToManyRowset('Products',

(); $bugsTable->find(1234); gsRowset->current();

podrazumevane veze >findProductsViaBugsProducts();

po kojem se obavlja vezivanje >findProductsViaBugsProductsByBug();

(); $bugsTable->fetchAll(array('bug_status = ?', 'NEW'))

>current(); findParentAccounts(); findParentAccountsByEngineer();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

,

,

'NEW'));

Page 61: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Db_Table_Definition Predstavlja klasu koja sadrži podatke o tabeli.

$definition = new Zend_Db_Table_Definition 'author' => array( 'name' => 'author', 'dependentTables' => ), 'book' => array( 'name' => 'book', 'referenceMap' => array 'author' => array( 'columns' => 'author_id' 'refTableClass' 'refColumns' => ) ) ), 'genre' => null , 'book_to_genre' => array 'referenceMap' => array 'book' => array( 'columns' => 'book_id' 'refTableClass' 'refColumns' => ),

'genre' => array( 'columns' => 'genre_id' 'refTableClass' 'refColumns' => ) ) ) ));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Predstavlja klasu koja sadrži podatke o tabeli.

Zend_Db_Table_Definition(array(

=> array('book')

array( ( 'author_id',

'refTableClass' => 'author', => 'id'

array( array( 'book_id',

'refTableClass' => 'book', => 'id'

'genre_id',

'refTableClass' => 'genre', => 'id'

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 62: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

class MyBook extends Zend_Db_Table_Abstractprotected $_name = 'book'protected $_referenceMap'author' => array(

'columns' => 'author_id''refTableClass' =>'refColumns' => 'id')

); }

$definition = new Zend_Db_Table_Definition'author' => array( 'name' => 'author', 'dependentTables' => array), 'genre' => null , 'book_to_genre' => array'referenceMap' => array(

'book' => array( 'columns' 'refTableClass''refColumns'),

'genre' => array( 'columns' 'refTableClass''refColumns')

)))); $authorTable = new Zend_Db_Table

$authors = $authorTable foreach ($authors as $author)

echo $author->id. ': '. $books = $author->findDependentRowset(foreach ($books as $book)$genreOutputArray = array$genres = $book-> findManyToManyRowsetforeach ($genres as $genreRow)} echo 'Genre: ' . implode(',}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend_Db_Table_Abstract{ 'book';

$_referenceMap = array(

'author_id', => 'author', 'id'

Zend_Db_Table_Definition(array(

array('MyBook')

array( ( => 'book_id',

'refTableClass' => 'MyBook', 'refColumns' => 'id'

=> 'genre_id',

'refTableClass' => 'genre', 'refColumns' => 'id'

Zend_Db_Table('author', $definition); $authorTable->fetchAll();

$author) { $author->first_name. ' '. $author->last_name.

findDependentRowset(new MyBook()); $book) {echo ' Book: ' . $book->title . PHP_EOL;

array(); findManyToManyRowset ('genre' , 'book_to_genre')$genreRow) {$genreOutputArray[] = $genreRow

(', ', $genreOutputArray) . PHP_EOL;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

. PHP_EOL;

. PHP_EOL;

'book_to_genre'); $genreRow->name;

Page 63: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Paginator, stranič Ova komponenta se upotrebljava kada je potrebno realizovati funkcionalnost straninekom kolekciom podataka. Kolekcija može biti niz (array), DbSelect, DbTableSelect, Iterator.

Podaci iz baze podataka

Metoda

setCurrentPageNumbersetItemCountPerPage setPageRange setView

Paginacija u okviru view-a

<html><body> <h1>Example</h1> <?php if (count($this->paginator))<ul><?php foreach ($this<li><?php echo $item; ?></li><?php endforeach; ?></ul><?php endif; ?>

<?php echo $this->paginationControl($this>paginator,'Sliding','my_pagination_control.phtml')

</body></html>

// Paginacija podataka iz$adapter = new Zend_Paginator_Adapter_DbSelect$adapter->setRowCount($dbarray(Zend_Paginator_Adapter_DbSelect::

$paginator = new Zend_Paginator

// Kreiranje paginatora $paginator = new Zend_Paginator$paginator = Zend_Paginator::// Podešavanje trenutne strane$paginator->setCurrentPageNumber($page)// Broj stranice iz URL-a$paginator->setCurrentPageNumber($this$this->view->paginator =

1.

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

, straničenje

Ova komponenta se upotrebljava kada je potrebno realizovati funkcionalnost strani. Kolekcija može biti niz (array), DbSelect, DbTableSelect, Iterator.

Opis setCurrentPageNumber Podešavanje trenutnog broja strane (podrazumevano 1)

Broj elemenata po strani (podrazumevano 10)Broj elemenata u kontroli za straničenje (podrazumevano 10)

Podešavanje view-a za prikaz rezultata

paginator)): ?> ($this->paginator as $item): ?>

; ?></li> </ul>

paginationControl($this-'my_pagination_control.phtml'); ?>

iz baze Zend_Paginator_Adapter_DbSelect($db-> select()>from('posts'))

setRowCount($db->select()->from('item_counts', Zend_Paginator_Adapter_DbSelect::ROW_COUNT_COLUMN

Zend_Paginator($adapter);

Zend_Paginator(new Zend_Paginator_Adapter_Array

= Zend_Paginator::factory($array); strane

setCurrentPageNumber($page); a

setCurrentPageNumber($this->_getParam('page')); = $paginator;

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Ova komponenta se upotrebljava kada je potrebno realizovati funkcionalnost straničenja nad . Kolekcija može biti niz (array), DbSelect, DbTableSelect, Iterator.

Podešavanje trenutnog broja strane (podrazumevano 1) Broj elemenata po strani (podrazumevano 10)

(podrazumevano 10) a za prikaz rezultata

from('posts'));

ROW_COUNT_COLUMN =>'post_count')));

Zend_Paginator_Adapter_Array($array)); // ili

Page 64: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Prikaz stranica All Elastic Paginacija kao na Googlu, prikazuje nekoliko prethodnih i narednih stranica.Jumping Sliding

Svostvo Tip

first integerfirstItemNumber integerfirstPageInRange integercurrent integercurrentItemCount integeritemCountPerPage integerlast integerlastItemNumber integerlastPageInRange integernext integerpageCount integerpagesInRange arrayprevious integertotalItemCount integer

my_pagination_control.phtml

<?php if ($this->pageCount)

<div class="paginationControl"

<?php echo $this->firstItemNumber

lastItemNumber;?>of <?php

<!-- First page link -->

<?php if (isset($this->previous))

<a href="<?php echo $this

First</a> |

<?php else: ?>

<span class="disabled">First</span> |

<?php endif; ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Opis Vraća brojeve svih stranica iz kolekcije.

Paginacija kao na Googlu, prikazuje nekoliko prethodnih i narednih stranica.Prikazuje stranice iz opsega koji sledi.

Yahoo!

Tip Opis integer integer Apsolutni broj prvog elementa na straniinteger Prva stranica koju je vraćena od strane stila integer Tekuinteger Broj elemenata na straniinteger Maksimalni broj elemenata dostupan na svim stranamainteger Broj poslednje straneinteger Apsolutni broj poslednjeg elementa na straniinteger Poslednja stranica koju je vraćena od strane stila paginacijeinteger Broj sledeinteger array Niz stranica u zavisnosti od tipa paginacijeinteger Broj prethosnih stranicainteger Ukupan broj stranica

my_pagination_control.phtml

pageCount): ?>

"paginationControl">

firstItemNumber; ?> - <?php echo $this->

<?php echo $this->totalItemCount; ?>

previous)): ?>

$this->url(array('page' => $this->first)); ?>">

>First</span> |

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a brojeve svih stranica iz kolekcije. Paginacija kao na Googlu, prikazuje nekoliko prethodnih i narednih stranica.

stranice iz opsega koji sledi. Yahoo!-like paginacija.

Prva strana Apsolutni broj prvog elementa na strani

ena od strane stila paginacije Tekući broj strane

Broj elemenata na strani ksimalni broj elemenata dostupan na svim stranama

Broj poslednje strane poslednjeg elementa na strani ena od strane stila paginacije

Broj sledeće strane Broj stranica

Niz stranica u zavisnosti od tipa paginacije Broj prethosnih stranica

Ukupan broj stranica

Page 65: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

<!-- Previous page link -->

<?php if (isset($this->previous))

<a href="<?php echo $this

</a> |<?php else: ?>

<span class="disabled">&lt; Previous</span> |

<?php endif; ?>

<!-- Next page link -->

<?php if (isset($this->next))

<a href="<?php echo

|<?php else: ?>

<span class="disabled">Next &gt;</span> |

<?php endif; ?>

<!-- Last page link -->

<?php if (isset($this->next))

<a href="<?php echo $this

Last

</a>

<?php else: ?>

<span class="disabled">Last</span>

<?php endif; ?>

</div>

<?php endif; ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

previous)): ?>

$this->url(array('page' => $this->previous)); ?>">&l

>&lt; Previous</span> |

next)): ?>

$this->url(array('page' => $this->next));

>Next &gt;</span> |

next)): ?>

$this->url(array('page' => $this->last)); ?>">

>Last</span>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

>&l t; Previous

>next)); ?>">Next &gt;</a>

Page 66: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Session Sesija se u Zend Framework-u realizuje kao instanca objekta objekat obezbeñuje kompletnu

Ako želite da se sesija startuje na svim zahtevima u vašoj aplikaciji onda je potrebo u u dodati sledeće:

$myNamespace = new Zend_Session_Namespace

// $myNamespace je isto kao// ako se u konstruktoru ne navede $defaultNamespace = new Zend_Session_Namespace

if (isset($defaultNamespace-$defaultNamespace->numberOfPageRequests} else { $defaultNamespace->numberOfPageRequests} echo "Zahtevi za stranim u ovoj$defaultNamespace->numberOfPageRequests// Korišćenje imenskih prostora

$authNamespace = new Zend_Session_Namespace $authNamespace->user = "myusername" // komponenta Web servisa $webServiceNamespace = new $webServiceNamespace->user // klasičan način

$_SESSION['Zend_Auth']['user']$_SESSION['Some_Web_Service']['user']// iteracija kroz sesiju $aNamespace =new Zend_Session_Namespace

foreach ($aNamespace as $index echo "aNamespace->$index

} // pristup pdacima u sesiji

$namespace = new Zend_Session_Namespace$namespace->foo = 100;echo "\$namespace->fooif (!isset($namespace->bar)) echo "\$namespace->bar} unset($namespace->foo)

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

u realizuje kao instanca objekta Zend_Session_Namespaceuje kompletnu logiku za upravljanje sesijama i odgovarajuć

Ako želite da se sesija startuje na svim zahtevima u vašoj aplikaciji onda je potrebo u

Zend_Session_Namespace('myNamespace');

kao $_SESSION['myNamespace'] navede onda se koristi imenski proctor “default”

Zend_Session_Namespace('Default');

->numberOfPageRequests)) { numberOfPageRequests++;

numberOfPageRequests = 1;

ovoj sesiji:", numberOfPageRequests; prostora u sesijama Zend_Auth komponenta

Zend_Session_Namespace('Zend_Auth'); "myusername";

new Zend_Session_Namespace('Some_Web_Service')user = "mywebusername";

$_SESSION['Zend_Auth']['user'] = "myusername"; $_SESSION['Some_Web_Service']['user'] = "mywebusername";

Zend_Session_Namespace('some_namespace'); $index => $value) {

>$index = '$value';\n";

Zend_Session_Namespace(); // default namespace

; >foo = $namespace->foo\n";

bar)) { >bar not set\n";

foo);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Session_Namespace. Ovaj logiku za upravljanje sesijama i odgovarajući API.

Ako želite da se sesija startuje na svim zahtevima u vašoj aplikaciji onda je potrebo u bootstrap-

“default”

('Some_Web_Service');

namespace

Page 67: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Startovanjem sesije u ovom delu zaglavlju. Postoji nekoliko načina na koji možete startovati sesiju od kojih su dva pogrešna:

1. Pogrešno. Nemojte u okviru 2. Pogrrešno. Nemojte da koristite funkciju

okviru Zend Frameworkjer konstruktor u takoñ

3. Ispravno. Upotreba Zend_Session::start()kao što smo i rekli to se smešta u zahtevima sesija nije ni potrebna onda:

• Bezuslovno podesite opciju Zend_Session::setOptions()

• Pozivajte Zend_Session::start()inicijalizovanja objekta preko kompo

4. Ispravno. Inicijalizacijom sesijama.

Videli smo do sada da se sesije grupišu u tzv. imenske prostore. Postoji moguu jednom imenskom prostoru sesije „zakljkoje se koriste za „zaključavanje“ i „otkljukoristiti metoda isLocked(). Zakljunema efekta na _set() metode objekata koji su venad imenskim prostorom da bi uklonili ili zamenili objekte koji su smešteni u imenskom prostoru.

$userProfileNamespace = new $userProfileNamespace->lock() if ($userProfileNamespace-> $userProfileNamespace-> }

Zend_Session::start();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Startovanjem sesije u ovom delu Framework-a izbegavate da vam se desi greška o ve

ina na koji možete startovati sesiju od kojih su dva pogrešna:Pogrešno. Nemojte u okviru php.ini fajla da postavite direktivu session.auto_start 1Pogrrešno. Nemojte da koristite funkciju session_start() direktno iz razloga što

Zend Framework-a koristiti Zend_Session_Namespace koji ćjer konstruktor u takoñe poziva istoimenu metodu.

Zend_Session::start(). Ako hoćete da svi zahtevi koriste sesiju onda kao što smo i rekli to se smešta u bootstrap fajl. Može se desiti slučaj da u nekim

vima sesija nije ni potrebna onda: Bezuslovno podesite opciju strict na TRUE upotrebom metode Zend_Session::setOptions() u okviru bootstrap-a

Zend_Session::start() samo za zahteve koji zahtevaju sesiju ali pre inicijalizovanja objekta preko komponente Zend_Session_Namespace

Ispravno. Inicijalizacijom Zend_Session_Namespace-a kad god je potreban rad sa

Videli smo do sada da se sesije grupišu u tzv. imenske prostore. Postoji moguu jednom imenskom prostoru sesije „zaključaju“ kako bi se sprečilo njihovo menjanje. Metode

čavanje“ i „otključavanje“ su lock() i unlock(). Za proveru može se . Zaključavanje se ne prenosi sa jednog zahteva na drugi, tako

metode objekata koji su već u sesiji, ali omogućava upotrebu nad imenskim prostorom da bi uklonili ili zamenili objekte koji su smešteni u imenskom

newZend_Session_Namespace('userProfileNamespace')lock();

>isLocked()) { >unLock();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a izbegavate da vam se desi greška o već poslatom

ina na koji možete startovati sesiju od kojih su dva pogrešna: session.auto_start 1

direktno iz razloga što će te u koji će generisati izuzetak

ete da svi zahtevi koriste sesiju onda fajl. Može se desiti slučaj da u nekim

upotrebom metode

samo za zahteve koji zahtevaju sesiju ali pre Zend_Session_Namespace.

a kad god je potreban rad sa

Videli smo do sada da se sesije grupišu u tzv. imenske prostore. Postoji mogućnost da se podaci ilo njihovo menjanje. Metode

. Za proveru može se se ne prenosi sa jednog zahteva na drugi, takoñe

ava upotrebu _set() metoda nad imenskim prostorom da bi uklonili ili zamenili objekte koji su smešteni u imenskom

('userProfileNamespace');

Page 68: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Podatke u okviru sesije možemo da obrišemo u nekom trenutku, zbog ra

Odreñivanje isteka važenja podatka u sesiji

// ... $testSpace = new Zend_Session_Namespace// promenljiva accept_answer$testSpace->setExpirationSeconds(300$testSpace->accept_answer//... $testSpace = new Zend_Session_Namespaceif ($testSpace->accept_answer

// odogovereno jeelse { // nije odogovereno je u periodu// ... $authSpaceAccessor1 = // sprečavanje kreiranje $authSpaceAccessor2 = // mogućnost izrade reference$authSpaceAccessor3 = $authSpaceAccessor1->fooassert($authSpaceAccessor2try { $aNamespaceObject =} catch (Zend_Session_Exception echo 'Cannot instantiate '$authSpaceAccessor2}

$s = new Zend_Session_Namespace$s->a = 'apple'; $s->p = 'pear'; $s->o = 'orange';

$s->setExpirationSeconds(5

// ceo namespace ističe za$s->setExpirationHops(5)

$s->setExpirationSeconds(60)// "expireAll" namespace// posle prvog zahteva koji// za 5 hopova. Šta će prvo

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Podatke u okviru sesije možemo da obrišemo u nekom trenutku, zbog različ

ivanje isteka važenja podatka u sesiji

Zend_Session_Namespace('testSpace'); accept_answer ističe za 300 sekundi

setExpirationSeconds(300, 'accept_answer'); accept_answer = true;

Zend_Session_Namespace('testSpace'); accept_answer === true) {

je u period od 300s}

periodu od 300s }

new Zend_Session_Namespace('Zend_Auth') dodatnih instance imenskog prostora new Zend_Session_Namespace('Zend_Auth'

reference $authSpaceAccessor2; foo = 'bar';

($authSpaceAccessor2->foo, 'bar');

= new Zend_Session_Namespace('Zend_Auth')Zend_Session_Exception $e) {

instantiate this namespace since ' . '$authSpaceAccessor2 was created\n';

Zend_Session_Namespace('expireAll');

setExpirationSeconds(5, 'a'); // podatak "a" ističe za 5 sekundi

za 5 "hopova" setExpirationHops(5);

setExpirationSeconds(60); namespace je označen kao nevažeći

koji se pojavio posle 60 sekundi ili prvo da se primeni zavisi od toga šta se pre desi

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

zličitih razloga.

('Zend_Auth');

('Zend_Auth', true);

('Zend_Auth');

desi

Page 69: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Nizovi u okviru sesija

Napomena: Objekti se u sesiji č rememberMe($seconds) forgetMe() sessionExists() destroy() stop()

expireSessionCookie()

Podaci o sesiji se mogu smestiti u odgovaraju

$sessionNamespace = new$sessionNamespace->array

// sledeći kod možda neće raditi$sessionNamespace->array['testKey']echo $sessionNamespace $sessionNamespace = new$sessionNamespace->array // promena niza u sesiji $sessionNamespace = new$sessionNamespace->array

// kopija niza $tmp = $sessionNamespace

// promena u kopiji $tmp['fruit'] = 'peach';

// dodela kopije originalu $sessionNamespace->arrayecho $sessionNamespace // dodela niza sa referencom$myNamespace = new Zend_Session_Namespace$a = array(1, 2, 3); $myNamespace->someArray$a['foo'] = 'bar'; echo $myNamespace->someArray['foo']

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Objekti se u sesiji čuvaju kao serializovani podaci.

Pamti podatke o sesiji u okviru kolaBriše podatke o sesiji u okviru kolaUtvrñuje postojanje sesije. Uništava sve podatke o sesijiStopira dodavanje podataka za sesiju u okviru tabele Nareñuje da se na klijentu uništi kolapodacima o sesiji

Podaci o sesiji se mogu smestiti u odgovarajuću tabelu u bazi podataka.

new Zend_Session_Namespace(); array = array();

raditi u verzijama pre PHP 5.2.1 array['testKey'] = 1;

$sessionNamespace->array['testKey'];

new Zend_Session_Namespace('Foo'); array = array('a', 'b', 'c');

new Zend_Session_Namespace(); array = array('tree' => 'apple');

$sessionNamespace->array;

array = $tmp;

$sessionNamespace->array['fruit']; // štampa "peach"

referencom Zend_Session_Namespace('myNamespace');

someArray = array( &$a );

someArray['foo']; // prints "bar"

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Pamti podatke o sesiji u okviru kolačića. Briše podatke o sesiji u okviru kolačića.

Uništava sve podatke o sesiji Stopira dodavanje podataka za sesiju u okviru

uje da se na klijentu uništi kolačić sa

Page 70: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Struktura tabele za čuvanje sesije

Podešavanje čuvanja sesije u tabeli

Autentifikacija Zend_Auth Ova komponenta obezbeñuje API za realizaciju autentifikacije pomosadrži adaptere koji rešavaju veisključivo bavi procesom autentifikacije a ne autorizacije.Adapteri koji se ovde mogu koristiti zavise od tipa servisa koji se koriste za autentifikaciju na primer LDAP, baza podataka, datoteka. Svaka klasa koje opisuje adapter je izvedena izinterface-a Zend_Auth_Adapter_Interface

$db = Zend_Db::factory('Pdo_Mysql''host' =>'example.com''username' => 'dbuser','password' => '******''dbname' => 'dbname' )); Zend_Db_Table_Abstract::$config = array( 'name' => 'session''primary' => 'id', 'modifiedColumn' => 'modified''dataColumn' => 'data''lifetimeColumn' => 'lifetime'); //kreiranje Zend_Session_SaveHandler_DbTable//podešavanje čuvanja podatakaZend_Session::setSaveHandler(//start session! Zend_Session::start();

//upotreba sesije

CREATE TABLE `session``id` char(32), `modified` int, `lifetime` int, `data` text, PRIMARY KEY (`id`))

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

uvanje sesije

uvanja sesije u tabeli

Autentifikacija Zend_Auth

ñuje API za realizaciju autentifikacije pomoću Zend Frameworksadrži adaptere koji rešavaju većinu problema vezanih za proces autentifikacije.

ivo bavi procesom autentifikacije a ne autorizacije. Adapteri koji se ovde mogu koristiti zavise od tipa servisa koji se koriste za autentifikaciju na

baza podataka, datoteka. Svaka klasa koje opisuje adapter je izvedena izZend_Auth_Adapter_Interface.

factory('Pdo_Mysql', array( 'example.com',

, '******' ,

Zend_Db_Table_Abstract::setDefaultAdapter($db);

'session',

'modified', 'data', 'lifetime'

Zend_Session_SaveHandler_DbTable i podataka o Zend_Session

setSaveHandler(new Zend_Session_SaveHandler_DbTable

`session ̀(

(`id`));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend Framework-a i inu problema vezanih za proces autentifikacije. Komponeta se

Adapteri koji se ovde mogu koristiti zavise od tipa servisa koji se koriste za autentifikaciju na baza podataka, datoteka. Svaka klasa koje opisuje adapter je izvedena iz

Zend_Session_SaveHandler_DbTable($config));

Page 71: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Nakon uspešne provere podataka o korisniku kao rezultat metode instanca klase Zend_Auth_Result

• isValid()- vraća TRUE ako i samo ako je korisnik uspešno autentifikovan

• getCode() – vraća kod prilikom pokušaja autentifikacije• getIdentity() – vraća identitet autentifikovanog korisnika

• getMessages()- vraćaju se poruke o nesuspešnom pokušaju autentifikacije Kodovi vezani za autentifikaciju

Zend_Auth_Result::SUCCESSZend_Auth_Result::FAILUREZend_Auth_Result::FAILURE_IDENTITY_NOT_FOUNDZend_Auth_Result::FAILURE_IDENTITY_AMBIGUOUSZend_Auth_Result::FAILURE_CREDENTIAL_INVALIDZend_Auth_Result::FAILURE_UNCATEGORIZED/** primer obrade kodova// unutar AuthController$result = $this->_auth->

switch ($result->getCode()) case Zend_Auth_Result::

/** uradi nešto **/ break;

case Zend_Auth_Result::/** uradi nešto **/ break;

case Zend_Auth_Result::/** uradi nešto **/ break;

default: /** uradi nešto **/ break;

}

class MyAuthAdapter implements Zend_Auth_Adapter_Interface/**Sets username and password

@return void */ public function __construct/**Performs an authentication*@throws Zend_Auth_Adapter_Exception

@return Zend_Auth_Result*/ public function authenticate}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

spešne provere podataka o korisniku kao rezultat metode authenticate() Zend_Auth_Result. U okviru instance mogu se koristi sledeć

a TRUE ako i samo ako je korisnik uspešno autentifikovan

d prilikom pokušaja autentifikacije ća identitet autentifikovanog korisnika

ćaju se poruke o nesuspešnom pokušaju autentifikacije

Kodovi vezani za autentifikaciju

SUCCESS FAILURE FAILURE_IDENTITY_NOT_FOUND FAILURE_IDENTITY_AMBIGUOUS FAILURE_CREDENTIAL_INVALID FAILURE_UNCATEGORIZED

kodova **/ AuthController / loginAction

>authenticate($adapter); getCode()) {

Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND:

Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:

Zend_Auth_Result::SUCCESS:

MyAuthAdapter implements Zend_Auth_Adapter_Interface{ password for authentication

__construct($username, $password){// ...} authentication attempt

Zend_Auth_Adapter_Exception Zend_Auth_Result

authenticate(){ // ...}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

authenticate() dobija se

. U okviru instance mogu se koristi sledeće metode: a TRUE ako i samo ako je korisnik uspešno autentifikovan

aju se poruke o nesuspešnom pokušaju autentifikacije

Page 72: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Čuvanje podataka o autentifikaciji Nakon izvršene uspešne autentifikacije podaci se smeštaju u okviru sesije. Podrazumevena imenski prostor u okviru sesije nosi naziv

Implementacija proizvoljnog skladišta podataka o autentifikaciji

class MyStorage implements /**

Returns true if and*

@throws Zend_Auth_Storage_Exceptiondetermine whether@return boolean

*/ public function isEmpty/**

@todo implementation*/ }

/** Returns the contents

* Behavior is undefined

* @throws Zend_Auth_Storage_Exceptionstorage is impossible@return mixed

*/

// Sačuvaj reference ka Singleton$auth = Zend_Auth::getInstance()// Koristi 'someNamespace'$auth->setStorage(new Zend_Auth_Storage_Session/**

@todo Set up the*/ // Autentifikacija, čuvanje$result = $auth->authenticate($authAdapter)

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

podataka o autentifikaciji

Nakon izvršene uspešne autentifikacije podaci se smeštaju u okviru sesije. Podrazumevena imenski prostor u okviru sesije nosi naziv Zend_Auth.

proizvoljnog skladišta podataka o autentifikaciji

MyStorage implements Zend_Auth_Storage_Interface{

and only if storage is empty

Zend_Auth_Storage_Exception If it is impossible to whether storage is empty

boolean

isEmpty(){

implementation

contents of storage

undefined when storage is empty.

Zend_Auth_Storage_Exception If reading contents fromimpossible

Singleton instanci Zend_Auth getInstance();

'someNamespace' umesto 'Zend_Auth' Zend_Auth_Storage_Session('someNamespace'))

the auth adapter, $authAdapter

uvanje rezultata,iI prikaz rezultata autentifikacije authenticate($authAdapter);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Nakon izvršene uspešne autentifikacije podaci se smeštaju u okviru sesije. Podrazumevena

from

('someNamespace'));

Page 73: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

public function read(){ /**

@todo implementation*/ }

*/

} /**

Writes $contents *

@param mixed $contents@throws Zend_Auth_Storage_Exceptionstorage is impossible@return void

*/ public function write($contents){/**

@todo implementation*/ }

/** Clears contents from

* @throws Zend_Auth_Storage_Exceptionstorage is impossible@return void

*/ public function clear(){/**

@todo implementation*/ } } // Upotreba MyStorage-a// Instruct Zend_Auth to Zend_Auth::getInstance()

/** @todo Set up the

*/ // Authenticate, saving the// success $result = Zend_Auth::getInstance()

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

implementation

to storage

$contents Zend_Auth_Storage_Exception If writing $contents impossible

($contents){

implementation

from storage

Zend_Auth_Storage_Exception If clearing contents fromimpossible

(){

implementation

a use the custom storage class

getInstance()->setStorage(new MyStorage());

the auth adapter, $authAdapter

the result, and persisting the identity on

getInstance()->authenticate($authAdapter);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

to

from

Page 74: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Upotreba

Ako je upotreba skladišta podataka neophodnih za autentifilaciju nije zahtevana programer može da upotrebljava direktno klasu adaptera.

// Get a reference to the $auth = Zend_Auth::getInstance()

// Set up the authentication$authAdapter = new MyAuthAdapter

// Attempt authentication,$result = $auth->authenticate($authAdapter)

if (!$result->isValid()) {// Authentication failed; printforeach ($result->getMessages() echo "$message\n";} } else { // Authentication succeeded;// in the session // $result->getIdentity() // $result->getIdentity() } // Provera da li je korisnik

$auth = Zend_Auth::getInstance() if ($auth->hasIdentity()) { // Identity exists; get it $identity = $auth->getIdentity() }

// logout Zend_Auth::getInstance()->clearIdentity()

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Ako je upotreba skladišta podataka neophodnih za autentifilaciju nije zahtevana programer može da upotrebljava direktno klasu adaptera.

singleton instance of Zend_Auth getInstance();

authentication adapter MyAuthAdapter($username, $password);

authentication, saving the result authenticate($authAdapter);

print the reasons why

getMessages() as $message) { ;

succeeded; the identity ($username) is stored

=== $auth->getIdentity() === $username

korisnik ulogovan getInstance();

getIdentity();

clearIdentity();

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Ako je upotreba skladišta podataka neophodnih za autentifilaciju nije zahtevana programer može

Page 75: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Autentifikacija preko baze podataka Autentifikacija se može izvršiti na osnovu podataka koji su smešteni u odogovarpodataka. Komponenta Zend Frameworkautentifikacije je Zend_Auth_Adapter_DbTableprosledi instanca klase Zend_Db_Adapter_Abstractkonfiguraciju:

• tableName predstavlja ime tabele u kojoj se • identityColumn , ime kolone koja predstavlja indentitet tj. primarni klju

• credentialColumn, ime kolone koja

• credentialTreatment, na

$authAdapter = new Zend_Auth_Adapter_DbTable'password');

$authAdapter = new Zend_Auth_Adapter_DbTable $authAdapter->setTableName('users')

->setCredentialColumn('password') $authAdapter->setIdentity('my_username')

// proveri podatke $result=$authAdapter->authenticate();// Print the identity echo $result->getIdentity()// Print the result row print_r($authAdapter->getResultRowObject())/* Output:my_username Array ( [id] => 1, [username] [password] => my_password)

// inicijalizacija autentifikacionog$authAdapter = new MyAuthAdapter

// pokušaj autentifikacije $result = $authAdapter->if (!$result->isValid()) {// nema korisnika foreach ($result->getMessages() echo "$message\n";} } else { // uspešna autentifikacija// $result->getIdentity()

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Autentifikacija preko baze podataka

Autentifikacija se može izvršiti na osnovu podataka koji su smešteni u odogovarZend Framework-a koja je zadužena za realizaciju ove vrste

Zend_Auth_Adapter_DbTable. Konstruktor ove klase zahteva da joj se Zend_Db_Adapter_Abstract. Pored toga dostupne su i

predstavlja ime tabele u kojoj se čuvaju podaci za autentifikaciju, ime kolone koja predstavlja indentitet tj. primarni klju

, ime kolone koja čuva lozinku

, način na koji se menja podatak lozinke tj. šifruje

Zend_Auth_Adapter_DbTable($dbAdapter,'users'

Zend_Auth_Adapter_DbTable($dbAdapter); setTableName('users')->setIdentityColumn('username')

setCredentialColumn('password'); setIdentity('my_username')->setCredential('my_password')

authenticate();

getIdentity() . "\n\n";

getResultRowObject());

[username] => my_username my_password,[real_name] => My Real Name

autentifikacionog adaptera MyAuthAdapter($username, $password);

>authenticate();

getMessages() as $message) { ;

autentifikacija === $username}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Autentifikacija se može izvršiti na osnovu podataka koji su smešteni u odogovarajućoj bazi a koja je zadužena za realizaciju ove vrste

. Konstruktor ove klase zahteva da joj se . Pored toga dostupne su i sledeće opcije za

uvaju podaci za autentifikaciju , ime kolone koja predstavlja indentitet tj. primarni ključ

in na koji se menja podatak lozinke tj. šifruje MD5(?)

'users','username',

setCredential('my_password');

Page 76: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Acl Predstavljaju pravila pristupa resursima. Pojmovi koji se koriste u okviru su:

• resurs (resource), predstavlja objekat nad kojim se kontroliše pristup• uloga (role), predstavlja objekat koji pristupa resursu

Da bi kreirali resurs potrebno je da implementirate interface sadrži samo jednu metodu getResourceId()se i klasa Zend_Acl_ResourceKao i kod resursa, uloge (role)Zend_Acl_Role_Interface koji se isto sastoji od jedne metode koristiti klasu Zend_Acl_Role

$acl = new Zend_Acl();

$acl->addRole(new Zend_Acl_Role->addRole(new Zend_Acl_Role->addRole(new Zend_Acl_Role

$parents = array('guest', $acl->addRole(new Zend_Acl_Role

$acl->add(new Zend_Acl_Resource

$acl->deny('guest', 'someResource')$acl->allow('member', 'someResource')

echo $acl-> isAllowed('someUser'

// autentifikacija sa Zend_Auth_Adapter_DbTable$result = $this->_auth->

if ($result->isValid()) { $storage = $this->_auth-// vraća odgovarajuće kolone$storage->write($adapter)));

// identitek kao objekat, gde$storage->write($adapter

/* ... */ } else {/* ... */}

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Predstavljaju pravila pristupa resursima. Pojmovi koji se koriste u okviru Zend_Acl

, predstavlja objekat nad kojim se kontroliše pristup), predstavlja objekat koji pristupa resursu

Da bi kreirali resurs potrebno je da implementirate interface Zend_Acl_Resource_InterfacegetResourceId(). Pored toga u okviru Zend_Acl

Zend_Acl_Resource koja se može naslediti. role) možete kreirati tako što će te implementirati interface

koji se isto sastoji od jedne metode getRoleId() Zend_Acl_Role .

Zend_Acl_Role('guest')) Zend_Acl_Role('member')) Zend_Acl_Role('admin'));

'member', 'admin'); Zend_Acl_Role('someUser'), $parents);

Zend_Acl_Resource('someResource'));

'someResource'); 'someResource');

isAllowed('someUser', 'someResource') ? 'allowed' :'denied'

Zend_Auth_Adapter_DbTable >authenticate($adapter);

->getStorage(); kolone iz tabele

write($adapter->getResultRowObject(array('username','real_name'

gde je uklonjena lozinka write($adapter->getResultRowObject(null ,'password'));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Acl komponente

, predstavlja objekat nad kojim se kontroliše pristup

Zend_Acl_Resource_Interface koji Zend_Acl komponente nalazi

e te implementirati interface . Takoñe moguće je i

'denied';

'real_name',

Page 77: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Definisanje pristupa

$acl = new Zend_Acl(); $roleGuest = new Zend_Acl_Role

$acl->addRole($roleGuest)$acl->addRole(new Zend_Acl_Role$acl->addRole(new Zend_Acl_Role$acl->addRole(new Zend_Acl_Role

// Guest may only view content$acl->allow($roleGuest,

/*Alternatively, the above could$acl->allow('guest', null,

// Staff inherits view privilege$acl->allow('staff', null ,

// Editor inherits view, edit,additional privileges $acl-> allow('editor', null

// Administrator inherits nothing,$acl->allow('administrator')

$acl = new Zend_Acl();

// Add groups to the Role// Guest does not inherit $roleGuest = new Zend_Acl_Role$acl->addRole($roleGuest)

// Staff inherits from guest$acl->addRole(new Zend_Acl_Role

/* Alternatively, the above $acl->addRole(new Zend_Acl_Role('staff'),*/

// Editor inherits from staff$acl->addRole(new Zend_Acl_Role

// Administrator does not$acl->addRole(new Zend_Acl_Role

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Zend_Acl_Role('guest');

addRole($roleGuest); Zend_Acl_Role('staff'), $roleGuest); Zend_Acl_Role('editor'), 'staff'); Zend_Acl_Role('administrator'));

content null , 'view');

could be written: null, 'view');//*/

privilege from guest, but also needs additional privileges array('edit', 'submit', 'revise'));

edit, submit, and revise privileges from staff, but

null , array('publish', 'archive', 'delete')); nothing, but is allowed all privileges

allow('administrator');

Role registry using Zend_Acl_Role access controls

Zend_Acl_Role('guest'); addRole($roleGuest);

guest Zend_Acl_Role('staff'), $roleGuest);

could be written: Zend_Acl_Role('staff'), 'guest');

staff Zend_Acl_Role('editor'), 'staff');

not inherit access controls Zend_Acl_Role('administrator'));

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

privileges

but also needs

Page 78: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Provera

echo $acl->isAllowed('guest'"allowed" : "denied"; // allowed

echo $acl->isAllowed('staff'"allowed" : "denied"; // denied

echo $acl->isAllowed('staff'"allowed" : "denied"; // allowed

echo $acl->isAllowed('editor'"allowed" : "denied"; // allowed because of inheritance

echo $acl->isAllowed('editor'"allowed" : "denied"; // denied because no allow

echo $acl->isAllowed('administrator'"allowed" : "denied"; // allowed because administrator

echo $acl->isAllowed('administrator')"allowed" : "denied"; // allowed because administrator

echo $acl->isAllowed('administrator'"allowed" : "denied"; // allowed because administrator

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

isAllowed('guest', null , 'view') ?

isAllowed('staff', null , 'publish') ?

isAllowed('staff', null , 'revise') ?

isAllowed('editor', null , 'view') ?

inheritance from guest

isAllowed('editor', null , 'update') ?

allow rule for 'update'

isAllowed('administrator', null , 'view') ?

administrator is allowed all privileges

isAllowed('administrator') ?

administrator is allowed all privileges

isAllowed('administrator', null , 'update') ?

administrator is allowed all privileges

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 79: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primer realizacije autorizacije

class AuthController extends Zend_Controller_Action{ public function loginAction() { $users = new Application_Model_DbTable_User(); $form = new Application_Form_LoginForm();//instanca forme za logovanje $this->view->form = $form; if($this->getRequest()->isPost()) { if($form->isValid($_POST)) { $data = $form->getValues(); $auth = Zend_Auth::getInstance(); $authAdapter = new Zend_Auth_Adapter_DbTable($users $authAdapter->setIdentityColumn('email') $authAdapter->setIdentity($data['email']) $result = $auth->authenticate($authAdapter); if($result->isValid()) { $storage = new Zend_Auth_Storage_Session(); $storage->write($authAdapter $mysession = new Zend_Session_Namespace('mysession'); if(isset($mysession $url = $mysession unset($mysession $this->_redirect($url); } $this->_redirect('index/index'); } else { $this->view->err } } } } public function logoutAction() { $storage = new Zend_Auth_Storage_Session(); $storage->clear(); $this->_redirect('index/index'); } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

imer realizacije autorizacije sa ACL-om (preuzeto sa sajta Zend-a)

class AuthController extends Zend_Controller_Action{ public function loginAction()

Application_Model_DbTable_User(); $form = new Application_Form_LoginForm();//instanca forme za logovanje

>form = $form; >isPost()) {

>isValid($_POST)) { >getValues();

$auth = Zend_Auth::getInstance(); $authAdapter = new Zend_Auth_Adapter_DbTable($users->getAdapter(),'user');

>setIdentityColumn('email')->setCredentialColumn('password');>setIdentity($data['email'])->setCredential($data['password']);>authenticate($authAdapter);

>isValid()) { $storage = new Zend_Auth_Storage_Session();

>write($authAdapter->getResultRowObject()); $mysession = new Zend_Session_Namespace('mysession'); if(isset($mysession->destination_url)) {

$url = $mysession->destination_url; unset($mysession->destination_url);

>_redirect($url);

>_redirect('index/index');

>errorMessage = "Invalid email or password. Please try again.";

public function logoutAction()

$storage = new Zend_Auth_Storage_Session();

index/index');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

$form = new Application_Form_LoginForm();//instanca forme za logovanje

>getAdapter(),'user'); >setCredentialColumn('password');

>setCredential($data['password']);

orMessage = "Invalid email or password. Please try again.";

Page 80: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

// library/My/Controller/Plugin/ACL.phpclass My_Controller_Plugin_ACL extends Zend_Controller_Plugin_Abstract{ protected $_defaultRole = 'guest'; public function preDispatch(Zend_Controller_Request_Abstract $request) { $auth = Zend_Auth::getInstance(); $acl = new My_Acl(); $mysession = new Zend_Session_Namespace('mysession'); if($auth->hasIdentity()) { $user = $auth->getIdentity(); if(!$acl->isAllowed($user>getActionName())) { $mysession->destination_url = $request return Zend_Controller_Act>setGotoUrl('auth/noauth'); } } else { if(!$acl->isAllowed($this$request->getActionName())) { $mysession->destination_url = $request return Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')>setGotoUrl('auth/login'); } } } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

// library/My/Controller/Plugin/ACL.php class My_Controller_Plugin_ACL extends Zend_Controller_Plugin_Abstract

protected $_defaultRole = 'guest';

function preDispatch(Zend_Controller_Request_Abstract $request)

$auth = Zend_Auth::getInstance();

$mysession = new Zend_Session_Namespace('mysession');

>hasIdentity()) { >getIdentity();

>isAllowed($user->role, $request->getControllerName() . '::' . $request

>destination_url = $request->getPathInfo();

return Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')

>isAllowed($this->_defaultRole, $request->getControllerName() . '::' . >getActionName())) {

>destination_url = $request->getPathInfo();

return Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

class My_Controller_Plugin_ACL extends Zend_Controller_Plugin_Abstract

function preDispatch(Zend_Controller_Request_Abstract $request)

>getControllerName() . '::' . $request-

ion_HelperBroker::getStaticHelper('redirector')-

>getControllerName() . '::' .

return Zend_Controller_Action_HelperBroker::getStaticHelper('redirector')-

Page 81: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

// library/My/Acl.php class My_Acl extends Zend_Acl{ public function __construct() { // Add a new role called "guest" $this->addRole(new Zend_Acl_Role('guest')); // Add a role called user, which inherits from $this->addRole(new Zend_Acl_Role('user'), 'guest'); // Add a role called admin, which inherits from user $this->addRole(new Zend_Acl_Role('admin'), 'user'); // Add some resources in the form controller::action $this->add(new Zend_Acl_Resource('error::error')); $this->add(new Zend_Acl_Resource('auth::login')); $this->add(new Zend_Acl_Resource('auth::logout')); $this->add(new Zend_Acl_Resource('index::index')); // Allow guests to see the error, login and index pages $this->allow('guest', 'error::error'); $this->allow('guest', 'auth::login'); $this->allow('guest', 'index::index'); // Allow users to access logout and the index action from the user $this->allow('user', 'auth::logout'); $this->allow('user', 'user::index'); // Allow admin to access admin controller, index action $this->allow('user', 'admin::index'); // You will add here roles, resourabove are some examples } } // application/Bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ protected function _initPlugins(){ $autoloader = Zend_Loader_Auto $autoloader->registerNamespace('My_'); $objFront = Zend_Controller_Front::getInstance(); $objFront->registerPlugin(new My_Controller_Plugin_ACL(), 1); return $objFront; } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

class My_Acl extends Zend_Acl

public function __construct()

// Add a new role called "guest" >addRole(new Zend_Acl_Role('guest'));

// Add a role called user, which inherits from guest >addRole(new Zend_Acl_Role('user'), 'guest');

// Add a role called admin, which inherits from user >addRole(new Zend_Acl_Role('admin'), 'user');

// Add some resources in the form controller::action >add(new Zend_Acl_Resource('error::error')); >add(new Zend_Acl_Resource('auth::login')); >add(new Zend_Acl_Resource('auth::logout')); >add(new Zend_Acl_Resource('index::index'));

o see the error, login and index pages >allow('guest', 'error::error'); >allow('guest', 'auth::login'); >allow('guest', 'index::index');

// Allow users to access logout and the index action from the user controller>allow('user', 'auth::logout'); >allow('user', 'user::index');

// Allow admin to access admin controller, index action >allow('user', 'admin::index');

// You will add here roles, resources and authorization specific to your application, the

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{

protected function _initPlugins(){ $autoloader = Zend_Loader_Autoloader::getInstance();

>registerNamespace('My_');

$objFront = Zend_Controller_Front::getInstance(); >registerPlugin(new My_Controller_Plugin_ACL(), 1);

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

controller

ces and authorization specific to your application, the

Page 82: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Web servisi Web servisi omogućavaju interakciju izmenamenjen za meñusobnu komunikaciju i razmenu informacija izmepokrenute ili realizovane u razlivezuje za URI (Uniforme Resource LocatorKomunikacija izmeñu web servisa i aplikacije obalja se putem otvorenih protokola u formi XML-a i JSON-a. Osnovna karakteristika web servisa je da je to sebe može da opiše. Pored toga, oni se nalaze. Ovim je omogućeno da desktop aplikacija komunicira i dobije podatkaplikacije na udaljenom serveruElementi web servisa su:

� SOAP (Simple Object Access Protocol)� UDDI (Universal Description, Discovery and Integration)� WSDL (Web Services Description Language)

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

avaju interakciju izmeñu različitih jezika i tehnologija. usobnu komunikaciju i razmenu informacija izmeñu različ

pokrenute ili realizovane u različitim programskim jezicima tj. platformamaUniforme Resource Locator).

u web servisa i aplikacije obalja se putem otvorenih protokola u formi

eb servisa je da je to software koji je logička celina za sebe i koji sam . Pored toga, oni su nezavisni od platforme na kojoj rade, i lokacije na kojoj

ćeno da desktop aplikacija komunicira i dobije podatkaplikacije na udaljenom serveru.

SOAP (Simple Object Access Protocol) UDDI (Universal Description, Discovery and Integration) WSDL (Web Services Description Language)

Slika – Šema upotrebe web servisa

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

itih jezika i tehnologija. Predstavlja software u različitih aplikacija koje su

itim programskim jezicima tj. platformama. Web servis se

u web servisa i aplikacije obalja se putem otvorenih protokola u formi

ka celina za sebe i koji sam su nezavisni od platforme na kojoj rade, i lokacije na kojoj

eno da desktop aplikacija komunicira i dobije podatke od web

Page 83: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Šta je SOAP?

� Simple Object Access Protocol� Protokol baziran na XML

HTTP protokola � Jasno definisan format� Nezavisan od platforme i jezika� Jednostavan i proširiv

Soap zahtev

Soap odgovor

HTTP/1.1 200 OK Content-Type: application/soap+xml; chContent-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soapsoap:encodingStyle="http://www.w3.org/2001/12/soap <soap:Body xmlns:m="http://www.example.org/stoc <m:GetStockPriceResponse> <m:Price>34.5</m:Price> </m:GetStockPriceResponse></soap:Body> </soap:Envelope>

POST /InStock HTTP/1.1 Host: www.example.org Content-Type: application/soap+xml; chContent-Length: nnn <?xml version="1.0"?> <soap:Envelope xmlns:soap=“http://www.w3.org/2001/12/soapsoap:encodingStyle="http://www<soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPrice> <m:StockName>IBM</m:StockName> </m:GetStockPrice> </soap:Body> </soap:Envelope>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Simple Object Access Protocol Protokol baziran na XML-u i omogućava aplikacijama da razmenjuju poruke preko

Jasno definisan format Nezavisan od platforme i jezika

application/soap+xml; charset=utf-8

xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

<soap:Body xmlns:m="http://www.example.org/stock"> <m:GetStockPriceResponse> <m:Price>34.5</m:Price>

</m:GetStockPriceResponse>

Type: application/soap+xml; charset=utf-8

xmlns:soap=“http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding">

tp://www.example.org/stock">

<m:StockName>IBM</m:StockName>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

ava aplikacijama da razmenjuju poruke preko

Page 84: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Šta je WSDL?

� Protokol baziran na XML� Web Service Description Lenguage� Omogućava klijentima “

Element

<types>

<message>

<portType>

<binding>

Struktura WSDL poruke

<definitions> <types> def. tipova podataka </types> <message> tipizirana poruka </message> <portType> skup operacija </portType> <binding> specifikacija protokola i formata podataka</binding> </definitions>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Protokol baziran na XML-u i omogućava opisivanje i lociranje servisaWeb Service Description Lenguage

ava klijentima “auto-discover” (otkrivanje funkcionalnosti web servisa)

Opis

Sadrži opise tipova podataka u okviru servisa

Sadrži tipiziranu poruku o elementima operacije

Skup operacija podržanih od strane komunikaciji

Specifikacija protokola i formata podataka

specifikacija protokola i formata podataka

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

nje servisa

(otkrivanje funkcionalnosti web servisa)

Sadrži opise tipova podataka u okviru servisa

Sadrži tipiziranu poruku o elementima

Skup operacija podržanih od strane tačaka u

Specifikacija protokola i formata podataka

Page 85: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Element

<types>

<message>

<portType>

<binding>

Primer WSDL poruke

Tip

One-way

Request-response

Solicit-response

Notification

<message name="getTermRequest"> <part name="term" type="xs:string"/></message> <message name="getTermResponse"> <part name="value" type="xs:string"/></message> <portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/> </operation> </portType>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Opis

Sadrži opise tipova podataka u

Sadrži tipiziranu poruku o elementima operacije

Skup operacija podržanih od strane komunikaciji

Specifikacija protokola i formata podataka

Definicija

Operacija prihvata poruku ali ne vra

Operacija prihvata poruku i vra

Operacija šalje zahtev i čeka odgovor

Operacija salje poruku ali ne

Tabela – WSDL tipovi operacija

name="getTermRequest"> type="xs:string"/>

<message name="getTermResponse"> type="xs:string"/>

<portType name="glossaryTerms"> <operation name="getTerm"> <input message="getTermRequest"/> <output message="getTermResponse"/>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Sadrži opise tipova podataka u okviru servisa

Sadrži tipiziranu poruku o elementima

Skup operacija podržanih od strane tačaka u

Specifikacija protokola i formata podataka

Operacija prihvata poruku ali ne vraća ništa

Operacija prihvata poruku i vraća poruku

Operacija šalje zahtev i čeka odgovor

poruku ali ne čeka odgovor

Page 86: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Standardni PHP i SOAP

� Standardni PHP poseduje funkcije za rad sa servisima � Takodje postoje i dodatne biblioteke za rad sa sevisima � Biblioteke su:

� SOAP Server i Client u okviru standardne � Nusoap

Soap server

Soap klijent

Primer Soap web servisa u Zend Framewrok

class WebServisController extends Zend_Controller_Action{ public function init(){ /* Initialize action controller here */ } public function indexAction(){ // action body }

$podatak = $client->__soapCall('hello', array('Marko'));print "Ime je: "$podatak; Ime je Marko

<?php function hello($someone) { return "Hello " . $someone . "!";} $server = new SoapServer(null, array('uri' => "http://www.herong.home/set")); //ako posedujete wsdl samo se navodi $server->addFunction("hello"); $server->handle(); ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Standardni PHP poseduje funkcije za rad sa servisima Takodje postoje i dodatne biblioteke za rad sa sevisima

SOAP Server i Client u okviru standardne biblioteke php-a (php_soap.dll)

Primer Soap web servisa u Zend Framewrok-u

class WebServisController extends Zend_Controller_Action{

/* Initialize action controller here */

public function indexAction(){

>__soapCall('hello', array('Marko'));

function hello($someone) { return "Hello " . $someone . "!";

$server = new SoapServer(null, array('uri' => "http://www.herong.home/set"));

//ako posedujete wsdl samo se navodi lokacija wsdl fajla >addFunction("hello");

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

a (php_soap.dll)

Page 87: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primer Soap web servisa u Zend Framewrok

library/Servis/Exception.php

<?php /** * Description of Exception * * @author markos */ class Servis_Exception extends Zend_Exception { //put your code here } ?>

public function soapAction(){ // action body $this->_helper->viewRenderer $this->_helper->layout() $server=new Zend_Soap_Server(null,array('uri'=>'http://vezba2.nawp.ict/WebServis/soap')); $server->setClass('Servis_Postovi'); $server->registerFaultException(array('Servis_Exception')); $server->handle(); } public function wsdlAction(){ // action body $this->_helper->viewRenderer $this->_helper->layout() $wsdl=new Zend_Soap_AutoDiscover(); $wsdl->setClass('Servis_Postovi'); $wsdl->setUri('http://vezba2.nawp.ict/WebServis/soap'); $wsdl->handle(); } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Primer Soap web servisa u Zend Framewrok-u (nastavak)

class Servis_Exception extends Zend_Exception {

public function soapAction(){

>viewRenderer->setNoRender(true); >layout()->disableLayout();

Zend_Soap_Server(null,array('uri'=>'http://vezba2.nawp.ict/WebServis/soap'));

>setClass('Servis_Postovi'); >registerFaultException(array('Servis_Exception'));

public function wsdlAction(){

>viewRenderer->setNoRender(true); >layout()->disableLayout();

$wsdl=new Zend_Soap_AutoDiscover(); >setClass('Servis_Postovi'); >setUri('http://vezba2.nawp.ict/WebServis/soap');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Zend_Soap_Server(null,array('uri'=>'http://vezba2.nawp.ict/WebServis/soap'));

Page 88: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

library/Servis/Postovi.php

<?php /** * Description of Postovi * * @author markos */ class Servis_Postovi { //put your code here /** * Vraca niz postova * @return array */ public function listaPostova(){ $podaci=array('Post 1','Post 2','Post 3'); return $podaci; } /** * * @param string $podatak * @return boolean */ public function unesiPost($podatak){ $ok=false; if($podatak!=""){ $ok=true; } return $ok; } } ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

public function listaPostova(){ $podaci=array('Post 1','Post 2','Post 3');

* @param string $podatak

public function unesiPost($podatak){

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 89: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

PHP skripta koja koristi servis

REST servisi Predstavlja vrstu web servisa koji komunikaciju obavljaju preko HTTP protokola. Komunikacija se obavlja preko komandi HTTP protokola. SadrJSON. Komande HTTP protokola su:

� GET => READ � POST => CREATE� PUT => UPDATE� DELETE => DELETE

U Zend Framework-u postoje dve komponente za rad sa REST servisima a to su Zend_Rest_Server i Zend_Rest_Client

<?php require_once 'Zend/Loader.php';Zend_Loader::loadClass('Zend_Soap_Client'); $opcije=array( 'location'=>'http://vezba2.nawp.ict/WebServis/soap', 'uri'=>'http://vezba2.nawp.ict/WebServis/soap'); try{ $klijent=new Zend_Soap_Client(null,$opcije); print_r($klijent->listaPostova()); print_r($klijent->unesiPost('Marko')); }catch(SoapFault $s){ die('Error['.$s->faultcode.']'.$s}catch(Exception $e){ die('Error:'.$e->getMessage());} ?>

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

PHP skripta koja koristi servis

Predstavlja vrstu web servisa koji komunikaciju obavljaju preko HTTP protokola. Komunikacija komandi HTTP protokola. Sadržaj REST odgovora može biti XML, CSV,

Komande HTTP protokola su:

GET => READ POST => CREATE PUT => UPDATE DELETE => DELETE

u postoje dve komponente za rad sa REST servisima a to su Zend_Rest_Client

require_once 'Zend/Loader.php'; Zend_Loader::loadClass('Zend_Soap_Client');

'location'=>'http://vezba2.nawp.ict/WebServis/soap', 'http://vezba2.nawp.ict/WebServis/soap'

$klijent=new Zend_Soap_Client(null,$opcije);

>listaPostova());

>unesiPost('Marko'));

>faultcode.']'.$s->faultstring);

>getMessage());

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Predstavlja vrstu web servisa koji komunikaciju obavljaju preko HTTP protokola. Komunikacija žaj REST odgovora može biti XML, CSV,

u postoje dve komponente za rad sa REST servisima a to su

Page 90: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primer REST servisa u Zend Framework

//Bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function _initRoutes(){ $front = Zend_Controller_Front::getInstance() $router = $front->getRouter(); $restRoute = new Zend_Rest_Route($front); $router->addRoute('default', $restRoute); } } class ApiController extends Zend_Controller_Action{ public function headAction(){ $this->getResponse()->setBody(null); } public function init(){ /* Initialize action controller here */ $this->_helper->viewRenderer $this->_vesti = array ( "1" => "Vest 1", "2" => "Vest 2", "3" => "Vest 3" ); } public function indexAction(){ echo Zend_Json::encode($this } public function getAction(){ $request=$this->getRequest(); //print $request->getParam('test'); print "Get action"; }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Primer REST servisa u Zend Framework-u (potpuno samostalni projekat)

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ public function _initRoutes(){

$front = Zend_Controller_Front::getInstance(); >getRouter();

$restRoute = new Zend_Rest_Route($front); >addRoute('default', $restRoute);

class ApiController extends Zend_Controller_Action{

public function headAction(){ >setBody(null);

/* Initialize action controller here */ >viewRenderer->setNoRender(true);

public function indexAction(){ echo Zend_Json::encode($this->_vesti);

public function getAction(){ >getRequest(); >getParam('test');

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Page 91: Napredno web programiranje · -u -a sa sajta spakovati preuzeti fajl u okviru download php –v u bilo gde u konzoli ako ne onda php.exe u Environment Variables->path->Dugme Evironmet

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Primer REST servisa u Zend Framework

Primer upotrebe Zend Rest servisa

class IndexController extends Zend_Controller_Action{ public function init(){ /* Initialize action controller here */ } public function indexAction(){ // action body $client = new Zend_Rest_Client('http://ws3.vezba.ict'); print $client->restGet('/api'); $client->arg('4'); $odgovor=$client->restPost('/api') print_r(Zend_Json::decode($odgovor)); print $client->restPut('/api'); print $client }

public function postAction(){ // action body $item = $this->_request $this->_vesti[count($this $json= Zend_Json::encode($this $this->getResponse() ->setHeader('Content>appendBody($json); // print "Post action"; } public function putAction(){ // action body print "Put action"; } public function deleteAction(){ // action body print "Delete action"; } }

Visoka škola strukovnih studija za informacione i komunikacione tehnologije, Beograd, Zdravka Čelara 16

Primer REST servisa u Zend Framework-u (potpuno samostalni projekat)

Primer upotrebe Zend Rest servisa

class IndexController extends Zend_Controller_Action{

/* Initialize action controller here */

public function indexAction(){

$client = new Zend_Rest_Client('http://ws3.vezba.ict'); >restGet('/api');

>restPost('/api')->getRawBody(); print_r(Zend_Json::decode($odgovor));

>restPut('/api'); print $client->restDelete('/api');

public function postAction(){

_request->getPost('item'); >_vesti[count($this->_vesti) + 1] = $item;

$json= Zend_Json::encode($this->_vesti); >setHeader('Content-Type', 'application/json')

public function putAction(){

public function deleteAction(){

Visoka škola strukovnih studija za informacione i komunikacione tehnologije,

Type', 'application/json')-