Visoka škola strukovnih studija za informacione i komunikacione tehnologije Napredno web programiranje Materijal za auditorne i laboratorijske vežbe dr Nenad Kojić Marko M Spasojević 2013
Priprema za rad u zend framework-u 1. Potrebno je preuzeti verziju 1.12.0 zend framework-a sa sajta http://framework.zend..com/downloads/latest 2. Nakon toga potrebno je raspakovati preuzeti fajl u okviru downloadd direktorijuma 3. Proverite 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 promenljivu (podešava se u okviru Windows operativnog sistema MyComputer (desni taster)-> Properties-> Tab Advanced->Dugme Evironmet Variables->System Variables->Pathse razdvajaju sa ;). >Edit i na postojeći tekst dopisati putanju do php.exe fajla. Putanje 4. Nakon toga je potrebnoo datoteke zf.bat i zf.php (nalaze se u okviru Zend biblioteke u poddirektorijumu bin) prekopirati u direktorijum u kome se nalazi php.exe (ako se koristi XAMPP onda se nalazi u xampp/php). Naime, zf.bat predstavlja pomoćnu skriptu koja automatizuje neke zadatke u okviru Zend Framework-a recimo izradu kontrolera itd. Ako koristite XAMPPP Zend Framework najčešće dolazi zajedno u paketu i nalazi se u php/pear 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 Framework-a. Ako se dvoumite oko verzije koju želite da koristite možete se odlučiti za sledeće opcije: a. da koristite postojeći pri čemu će vam biti nedostupan onaj koji se nalazi u okviru vašeg direktorijuma library ili b. da koristite novi koji se nalazi u okviru library tako što se u fajlu php.ini doda putanja u okviru direktive include_path ili c. se izvrši kopiranje Zend Frameworka iz Zend/library u direktorijum xampp/php/pear 5. Ozvršite komandu zf show version (bilo gde u konzoli) 6. Ako dobijete rezultat kao na slici onda je sve urañeno kako treba Slika 1 provera da li je Zend instaliran
Kreiranje projekta 1. Pozicionirajte se na xampp/htdocs direktorijum ako koristite XAMPP 2. Izvršiti komandu zf create project sajt.nawp.ict, nakon čege se kreira projekat sa kompletnom strukturom zf create project vezba1.nawp.ict 3. Nakon toga potrebno je kreirati vhost (omogućava da se na jednom serveru postavi više sajtova). Na apache-uu je potrebno u fajl xampp/apache/config/extra/httpd-vhosts.conf upisati sledeće i omogućiti direktivu (ukloniti # ) NameVirtualHost *:80 <VirtualHost *:80> DocumentRoot "[X]:/xampp/htdocs/sajt.nawp.ict/public" ServerName v1.nawp.ict <Directory "[X]:/xampp/htdocs/sajt.nawp.ict/public"> DirectoryIndex index.php AllowOverride All Order allow,deny Allow from all </Directory> </VirtualHost> <VirtualHost *:80> ServerName localhost DocumentRoot "[X]:\xampp\htdocs" </VirtualHost> 4. Potrebno je izvršiti editovanje hosts fajla u okviru windows-a kako bi windows mogao da poveže vaš novi fiktivni domen sa ip adresom lokalnog računara. Fajl se nalazi u c:\windows\system32\drivers\etc\hosts. 127.0.0.1 vezba1.nawp.ict Napomena: Ako menjate ovaj fajl na Windows-u 7 morate to raditii 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ćeg) na mesto u okviru direktorijuma etc. 5. Nakon toga je potrebnoo restartovati server (isključiti/uključiti apache servis). Pokušajte da startujete sajt vezba.nawp.ict, trebalo bi da dobijete prikaz kao na slici.
Slika 2 Izgled poöetne stranice na blanko aplikaciji Slika 3 - Struktura Zend aplikacije
Napomena: Ako niste uključili Zend Framework u okviru promenljive include_path onda je preporljučljivo da Zend direktorijum koji sadrži sve biblioteke prekopirate u okviru library direktorijuma. Nakon što ste kreirali projekat u okviru direktorijuma koji nosi ime projekta kreirana je sledeća struktura: application: predstavlja direktorijum o kome se nalazi kod vaše aplikacije (vaši kontroleri, modeli i view-i). Takoñe pored toga tu se nalazi fajl koji se naziva Bootstrap.php koji je odgovoran za početnu inicijalizaciju vašeg projekta docs: sadrži dokumentaciju sajta library: sadrži sporedne biblioteke koje se koriste u aplikaciji public: sadrži fajlove koji se ne obrañuju od strne glavnog kontrolera, css, slike, javascript 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.htaccess u 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.
Razvojno okruženje Za razvoj aplikacija pomoću 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 instalacije odabrati opciju razvoja PHP aplikacija. Podešavanje okružennja U glavnom meniju odaberite Tools->Options i zatim tab PHP pa zatip tab Zend, i dobijate sledeći prikaz: Slika 4 Podešavanje zf scripte Potrebno je da u polje Zend script upišete putanju do fajla zf.bat ili da pronañete isti preko Browse. Kliknite na Ok. Kreiranje projekta Projekat se kreira odabiromstavki File->New Project i odaberite PHP iz liste Categories kao na slici ispod. Slika 5 Odabir vrste aplikacije
Kliknite na Next > i u novom prozor trebate da navedete ime projekta (polje Project Name). Slika 6 Definisanje imena projekta Nakon što ste zadali ime projekta koje bi trebalo da bude isto kao domensko ime preko kojeg će aplikacija biti dostupna, kliknite na Next i u sledećem prozoru obratite pažnju na putanju projekta tj. Project URL. (mora da bude lokalna) Nakon podešavanja lokalnog URL-a kliknite na Next, i zatim se pojavljuje prozor u kome birate Framework u kome želite da radite (izaberite Zend) i kliknite na Finish. Slika 7 Odabir framework-a Klikom Finish kreira se projekt u htdocs folderu server.
Omogućavanje AutoComplete-a Ako se kompletna biblioteka Zend Framework-a nalazi van vašeg projekta onda bi bilo dobro da je uključite kako bi razvojno oruženje moglo da ima uvid u metode i svojstva Zend klasa. U stablu projekta odaberite folder Include Path kliknite desnim tasterom miša na taj folder i odaverite Properties. Otvara dijalog u kome trebate dodati putanju do Zend Framework-a. Slika 8 Uključivanje InteliSense-a za Zend Framework Osnovni pojmovi Bootstrap Predstavlja klasu (fajl) smešten u folderu application i definiše resurse i komponente koji treba inicijalizovati prilikom pokretanja aplikacije kao i kod svakog zahteva (request). Tipičan primer je definicija proizvoljnih putanja. Podrazumevano se inicijalizuje FrontController čiji je zadatak da traži akcije u okviru direktorijuma application/controllers/ Konfiguracija Sam Zend Framework nije konfigurabilan ali vaša aplikacija jeste. Podaci o konfiguraciji se smeštaju u fajl application/configs/application.ini. Sastoji se od direktiva pomoću kojih podešavate promenljive PHP okruženja.
U okviru fajla može se primetiti da je fajl podeljen na nekoliko celina production, starting, testing, development. Ove celine omogućavaju da se odreñene promenljivee menjaju u zavisnosti od stanja u kome se nalazi aplikacija. Stanje se definiše kroz konstantu APPLICATION_PATH i definišete je u okviru servera, načešće u.htaccess fajlu ili u okviru fajla za podešavanje virtuelnih hostova na web serveru. Podešavanja mogu i da se redefinišu u okviru narednih sekcija. Kontroleri Kontroleri su realizovani kao klase i sastoje se od metoda (akcija) čija se imena završavaju sa Action. Na osnovu podatakaa u URL-u odreñuje se kontroler i akcija (metoda) koja će biti pozvana. Naime, URL-ovi u MVC arhitekturi imaju sledeću strukturu /controller/action gde je controller ime klase, a action je ime metode bez sufiksa Action. Svaka aplikacija poseduje podrazumevani kontroler IndexController i ErrorController koji je namenjen obradi grešaka kao što je recimo greška 404. Glavni kontroler u svakoj aplikaciji realizovanoj putem Zend-a je Front Controller I ima zadataka da obradi podatke iz URL-a.
Slika 9 Šema obrade zahteva i generisanje odgovora
Pravila za realizaciju kontrolera: 1. Savko ime kontrolera mora početi velikim slovom i predstavlja klasu koja mora imati sledeći format imena Ime_kontroleraController. Tako kreirana klasa izvodi se iz klase Zend_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 zf create controler Prvi (komandu izvršiti u okviru direktorijuma projekta tj. na root-u projekta). Nakon njenog izvršavanja u application/controllers kreira se kontroler sa datim imenom i pratećim podrazumevanim kodom.
U okviru razvojnog okruženja NetBeans da bi kreirali kontroler kliknite desnim tastrom miša na projekat i u novootvorenom meniju izaberite Zend->Run Command... kako bi se otvorio dijalog za izvršavanje komande. Slika 10 NetBeans dijalog za ivršvanje komande U polju Filter kucate ime komande koju tražite i za to vreme u polju Matching Tasks prikazuju se pronañene 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() koja ima ulogu 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: 1. Ime akcije mora početi malim slovom. 2. Format: ime_akcijeaction. Komanda koja kreira akciju u okviru kontrolera je: zf create action ime_akcije ime_kontrolera Prilikom kreiranja akcije podrazumevano se kreira i fajl ime_akcije.phtml u okviru foldera 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.
Views 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/. U okviru navedenog foldera prave se posebni folderi koji predstavljaju imena kontrolera i ovako kreirani folderi sadrže fajlove sa ekstenziom.phtml čija imena odgovaraju imenima akcijaa u okviru tekućeg kontrolera. Tako na primer za kontrolere Index i Error postojali bi direktorijumi index/ i error/ sa fajlovima index/index.phtml error/error.phtml. Ove fajlove možete i zasebno kreirati komadom zf create view controller filename. index/index.phtml <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-align: center; div#more-information{ background-image: url( (http://framework.zend.com/images/bkg_body-bottom.gif); height: 100%; </style> <div id="welcome"> <h1>welcome to the <span id="zf-name">zend Framework!</span>< </h1> <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 Framework Manual</a> </p> </div> </div> error/error.phtml <!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">
error/error.phtml(nastavak) <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <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->exception->getmessage()?>< </p> <h3>stack trace:</h3> <pre><?php echo $this->exception->gettraceasstring()?></pre> <h3>request Parameters:< </h3> <pre><?php echo $this->escape(var_export($this->request->getparams( (), true))?> </pre> <?php endif?> </body> </html> Sigurno se pitate kako da prosledim nešto u pripadajući view fajl i naravno to nije teško potrebno je da u okviru akcije uradite sledeće: // fajl PrviController.php public function indexaction(){ $this->view-> >imeprezime="marko Spasojevic"; 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 print $this->imeprezime;?></p></div> </div>
Upravljanje prikazom (view) Prilikom pozivanja akcije unutar kontrolera, prikaz podataka se obavlja putem unapred kreiranog prikaza (view) koji predstavljaa 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 prikaz $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'); Isključivanje prikaza Ako želite da isključite generisanje prikaza to možete uraditi pomoću koda koji trebate staviti u odgovarajuće telo akcije: $this->_helper->viewrenderer->setnorender(true); //deo koda ako želite da onemogućite i prikaz strukture $this->_helper->layout()->disablelayout(); $this->_helper->viewrenderer->setnorender(); Helper metode za prikaz (View Helpers) View Helper-i su namenjeni lakšem generisaje prikaza pojedinih elemenata, kao na primer generisanje linkova na osnovu osnovnih podataka o linku. To su funkcije/metode koje generišu odreñeni HTML sadržaj. Za generisanje linkova koristi se metoda url i to na sledeći način: <a href="<?= $this->url(array('controller' => 'naziv','action' => 'anaziv','ime_paremetra' => 'vrednost','ime_custom_putanje'));?>">naziv linka</a> Tabela 1- Neki View Helper-i Naziv Currency Cycle Doctype HeadLink HeadMeta HeadScript HeadStyle 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 Generisanje meta tagova Generisanje dela za script Generisanje style taga
Kreiranje sopstvenih View Helper-a Da bi napravili sopstvene View Helper-e morate napraviti izvedenu iz Zend_View_Helper_Abstractt. application/views/helpers/pol.php <?php class Zend_View_Helper_Pol extends Zend_View_Helper_Abstract{ public function Pol($oz_pol){ if ($oz_pol== m ){return On ;else{ return Ona ; Za generisanje elemenata formulara mogu se koristi i helper-i. Detaljnu listu ovh helper-a možete naći na stranici 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 komponentu koja se zove Zend Layout. Zend Framework koristi dva šablona za generisanje prikaza (view): Two Step View, aplikacija kreira prikaz (view) koji se kasnije ubacuje u glavni prikaz Composite View, prikaz se sastoji iz više manjih prikaza (view) koji zajedno grade strukturu Da bi se kreirao layout neophodno je da izvršite komandu: zf enable layout. Izvrš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. Od PHP-a pojavljuje se samo jedna linija koda: <?php echo $this->layout()->content;?> Sadržaj ove promenljive jer sadržaj view-a koji je pozvan. layout.phtml <html> <head><title>ovo je proba layout-a</title></head> <body> <div id="test"> <h1>naslov iz glavnog layout-a</h1> <?php echo $this->layout()->content;?> </div> </body> </html>
Manipulacija strukturom stranice Instanci Zend_Layout klase možete pristupiti na nekoliko načina: U okviru view script-a <?php $layout = $this->layout();?> U okviru akcije kontrolera $layout = $this->_helper->layout(); // ili $helper = $this->_helper->gethelper('layout'); $layout = $helper->getlayoutinstance(); Upotrebom statičke metode $layout = Zend_Layout::getMvcInstance(); Preko bootstrap-a $layout = $bootstrap->getresource('layout'); Takoñe mogu se i izvršiti sledeće operacije: Podešavanje promenljivih u layout-u $layout->somekey = "foo" echo $layout->somekey; // 'foo' $layout->assign('someotherkey', 'bar'); echo $layout->someotherkey; // 'bar' disablelayout(). Ako imate potreba da isključite generisanje strukture onda koristite ovu metodu. Na primer jedna od situacija je odgovor na AJAX zahtev. $layout->disablelayout(); Odabir drugog prikazaa // upotreba script "alternate.phtml": $layout->setlayout(' 'alternate'); Parcijalni šabloni (Partial View) Mnoge stranice se sastoje iz delova koji su u pogledu HTML koda indentični tako da se nameće potreba da se definiše šablom kojim će ovaj deo ili delovi generisati. Ovaj šablon se u Zend Framework-u naziva Partial View.Imena pomenljivih u okviru parcijalnih šablona mogu biti ista
kao i imena u glavnom prikazu (view-u) jer parcijalni šabloni predstavljaju zasebne poddomene i bilo bi dobro da usvojite načinn za imenovanje fajlova parcijalnih šablona. Fajlovi se smeštaju u application/views/scripts. application/views/scripts/_post.phtml <?= $this->partial( _post.phtml,array( naslov =>$post->title, telo =>$po ost->body));?> Ako doñe do slučaja da je potrebno da se parcijalni šablom ponavlja više puta može se primeniti sledeća sintaksa: <div class= posts > <?=$this->partialloop( posts.phtml,array( array( naslov => Post 1, telo = => Ovo je post ), array( naslov => Post 2, telo = => Ovo je post ), )); </div> Putanje do spoljnih resursa Putanje do odgovarajućih resursa (slike,css i javascript) zadaju se relativno u odnosu na index.php fajl. Praksa je da se ovi resursi postave u posebne foldere u okviru public direktorijuma. Upotreba placeholder-a Placeholder predstavlja jedinstvenu celinu čija struktura i sadržaj zavisi od stanja aplikacije. Svaka stranica sadrži jedan ilii više placeholeder-a (deklaracija DOCTYPE, naslov dokumenta itd.). Placeholedr-i predstavljaju kontejnere koji se mogu posmatrati kao kolekcije što vodi do zaključka da se sanjima može raditi sledeće: Dodavanje stavki na kraj ili početak Zamena cele kolekcijee sa jednom vrednošću Dodavanje sadržaja na kraj i početak elementa kolekcije Definisanje stringa koji razdvaja elemente Ubacivanje sadržaja u kolekciju
Standardni placeholder-i Većina standardnih placeholder-a se odnosi na generisanje sadržaja za <head> sekciju html strane. Podešavanje DOCTYPE $this->doctype('xhtml1_strict'); //XHTML1_TRANSITIONAL HTML4_STRICT HTML4_Loose HTML5 Ovaj podataka možete štampati na klasičan način kao rezultat neke funkcije ali je praksa da se to radi u okviru Bootstrap klase class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ protected function _initdoctype(){ // da bi naredna naredba fukcionisala potrebno je u application..ini fajlu dodati resources.view[]= $this->bootstrap('view') ); $view = $this->getresource('view'); $view->doctype('xhtml1_strict'); <?php echo $this->doctype( ()?> <html>.. Generisanje sadržaja taga <title> bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ //... protected function _initplaceholders(){ $this->bootstrap('view'); $view = $this->getresource('view'); $view->doctype('xhtml1_strict'); // Definisanje title i separatora: $view->headtitle('moj Sajt')->setSeparator(' :: '); Kod u nekoj akciji <?php $this->headtitle( ()->append('neka strana'); //dodavanje na kraj?> <?php $this->headtitle( ()->prepend('neka strana'); // dodavanje pre?>
. layout.phtml <?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 :: Moj sajt</title> </html> Generisanje linkova ka stilovma Postavljanje stilova se obavljaa preko placeholder-a headlink(). Povratni objekat metode headlink() sadrži nekoliko virtuelnih metoda koji nam pomažu prilikom generisanja linkova. Dve metode koje najviše koriste su appendstylesheet() i prependstylesheet(). Svaka od ovih metoda uzima četiri argumenta $href (relativna putanja do css-a), $media (MIME tip, podrazumevano text/css), $conditionalstylesheet (uslov pod kojim se koristi dati css fajl), $extras (asocijativni niz koji služi za podešavanje atributa media). bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ //... protected function _initplaceholders(){ $this->bootstrap('view'); $view = $this->getresource('view'); $view->doctype('xhtml1_strict'); $view->headtitle('my Site')->setSeparator(' :: '); $view->headlink()->prependstylesheet('/styles/site.css'); //... Kod u nekoj akciji <?php $this->headlink( ()->appendstylesheet('/styles/user-list.css')?>
layout.phtml <?php echo $this->doctype()?> <html> <?php echo $this->headtitle()?> <?php echo $this->headlink()?> </html> Generisanje script dela Placeholder za script se definiše preko headscript() metode tj. objekta koga vrća ova metoda. Ovaj objekat poseduje nekoliko metoda: prependfile(), appendfile(), prependscript() i appendscript(). Prve dve metode omogućavaju da dodate script fajlove pre i posle, dok druge dve služe za eksplicitno ubacivanje skripta pre ili posle. bootstrap.php class Bootstrap extends Zend_Application_Bootstrap_Bootstrap{ //... protected function _initplaceholders(){ $this->bootstrap('view'); $view = $this->getresource('view'); $view->doctype('xhtml1_strict'); // Podesiti inicijalni title i separator: $view->headtitle('my Site')->setSeparator(' :: '); $view->headlink()->prependstylesheet('/styles/site.css'); $view->headscript()->prependfile('/js/site.js'); Kod u nekoj akciji <?php $this->headscript()->appendfile('/js/user-list.js')?> Definisanje script dela kroz kod <?php $this->headscript()->capturestart()?> site = {baseurl: "<?php echo $this->baseurl()?>"; <?php $this->headscript()->captureend()?>
layout.phtml <?php echo $this->doctype( ()?> <html> <?php echo $this->headtitle()?> <?php echo $this->headlink()?> <?php echo $this->headscript()?> </html> Html kod nakon renderovanjaa <script type="text/javascript" src="/js/site.js"></script> <script type="text/javascript" src="/js/user-list.js"></script> <script type="text/javascript"> site = { baseurl: "<?php echo $this->baseurl()?>" ; </script> Izrada sopstvenih placeholder-a _sidebar.phtml <?php print $this->placeholder('sidebar')->capturestart();?> <?php print $this->placeholder('sidebar')->menu;?> <?php print $this->placeholder('sidebar')->captureend();?> layout.phtml <?php if(is_array($this->sidebar_menu) &&!empty($this->sidebar_menu)):?> <?php print $this->placeholder('sidebar')->menu=$this->htmllist($th his->sidebar_menu, false,false,false);?> <?php endif;?> kontroler public function predispatch( (){ $this->view->render(' sidebar.phtml');
Prosleñivanje parametaraa Parametri se mogu prosleñivati preko GET i POST zahteva. Kada se parametri prosleñuju preko GET zahteva oni su sastavni deo URL-a. U samom URL-u nalaze se podaci o tome koji se kontroler 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 način http://v1.nawp.ict/prvi/proba/ime/marko/prezime/spasojevic što znači da se poziva kontroler prvi i njegova akcija proba kojoj se prosleñuju ime marko i prezime spasojevic. Da bi ovako prosleñene podatke mogli da dohvatimo u metodi koja se odnosi na akciju moramo da koristimo sledeći kod: $this->getparam( ime_parametra ); PrviController.php public function probaaction(){ // action body $ime=$this-> >getparam('ime'); $prezime=$this->getparam('prezime'); $this->view-> >imeprezime=$ime." ".$prezime; proba.phtml <br /><br /> <div id="view-content"> <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> </div> Da bi prikazali kako se prenose podaci putem POST zahteva pretpostavimoo da imamo akciju koja se zove prenos u okviru kontrolera prvi. U novokreiranom prezentacionom fajlu (view-u) prenos.phtml napravićemo html formular sa jednim tekstualnim poljem gde unosimo odreñeni string koji treba da prenesemo preko POST zahteva. Ako taj podatak postoji onda ga ispisujemo ako ne pojavljuje se forma.
PrviController.php public function prenosaction(){ $dugme=$this->getparam("btnsubmit"); $request=$this->getrequest(); if(isset($dugme) &&& $request->ispost()){ $email=$this->getparam("tbemail"); $this->view->email=$email; prenos.html <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->email)){?> <form action="/prvi/prenos" method="post"> <label for="email"> E-mail adresa:</label><input type="text" name="tbemail" value="" size="25" /><br /> <input type="submit" name="btnsubmit" value="posalji" /> </form> <?php else {?> <p>email je: <?php print $this->email;?> </p> <?php?> </div> </div> Flash Messanger Funkcija Flasg Messanger-a je da prenosi poruke izmeñu zahteva. Podaci se čuvaju u sesiji. $this->_helper->flashmessenger->addmessage('ova poruka je dodata'); // šta se prosleñuje $this->_helper->redirector('index', 'index'); //kome se prosleñuje kom contoller-u kojoj akciji //ispis poruke,ovaj deo koda se može ubaciti i u init() metod if ($this->_helper->flashmessenger->hasmessages()) { $this->view->messages = $this->_helper->flashmessenger->getmessages();
Kreiranje proizvoljnih putanja Da bi kreirali proizvoljnu putanju, moramo da otvorimo fajl application/bootstrap.php i u njemu putem metode definisati proizvoljnu putanju. Sve metode koje morate pozivati prilikom svakog poziva strane moraku počinjati sa _init. Tako na primer, naša metoda za proizvoljne putanje nosiće naziv _initroutes. Napravićemo proizvoljnu putanju koja se zove početna i koja će voditi na početnu stranu sajta. application/bootstrap.php public function _initroutes(){ $frontcontroller= Zend Controller_Front::getInstance(); $router=$frontcontroller->getrouter(); //statička ruta bez promenljivih parametara $route=new Zend_Controller_Router_Route_Static('pocetna', array('controller'=>'index','action'=>'index')); //dodaje u tabelu putanjaa rutu sa jedinstvenim imenom $router->addroute('pocetna',$route); Meñutim, šta ako vaša proizvoljna putanja zahteva promenljivi deo tj. parametar. Onda je potrebno da na umesto klase Zend_Controller_Router_Route_Static upotrebite klasu Zend_Controller_Router application/bootstrap.php public function _initroutes(){ $routegalerija=new Zend_Controller_Router_Route('galerija/:im me', array('controller'=>'galerija' ','action'=>'pregled','ime'=>''),array('ime'=>'\w w+')); $router->addroute('galerija',$routegalerija);
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 = Formulari resources.router.routes.login.defaults.action = login resources.router.routes.galerija.route="galerija/:ime" resources.router.routes.galerija.defaults.controller = Slike resources.router.routes.galerija.defaults.action = galerija resources.router.routes.galerija.defaults.ime = sve resources.router.routes.galerija.reqs.year = "[a-z]+"
Formulari Formulari u okviru Zend Framework-a se konstruišu preko objekata instance objekta Zend_Form. Ova klasa omogućava sledeće: Filtraciju i validaciju podataka Redosled elemenata Renderovanje formulara i elemenata Grupisanje elemenata i formulara Kada želite da napravite formular imate dve mogućnosti da kreirate instancu klase Zend_Form ili da napravite sopstvenu klasu koja nasleñuje klasu Zend_Form. $form = new Zend_Form; $form->setaction('/resource/process')->setmethod('post'); $form->setattrib('id', 'login');
Primeri koda za formular i njegove elemente // Kreiranje elemenata,prvi način $username =$form-> addelement(new Zend_Form_Element_Text('username')); //drugi način $username =$form->addelement('text', 'username'); $username->setlabel('username'); // vrednosti iz forme u obliku asocijativnog niza name =>vrednost $values = $form->getvalues(); // samo validne vrednosti $values = $form->getvalidvalues($_post); // ako je došlo do greške if (!$form->isvalid($_post)) {echo $form; // ili $this->view->form = $form; return $this->render('form'); // podaci o greškama $form->geterrors();// asocijativni niz ime/kodovi $form->getmessages();// / asocijativni niz name/poruke //dodela vrednosti $username->setvalue('korisničko ime'); //poruka o grešci $username-> adderrormessage( Vasa poruka ); $form = new Registracija_Forma(); //asocijativni niz name =>vrednost $data = array('username' => 'wjgilmore',//name/value 'email' => 'wj@example.com', '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);
Primeri koda za formular i njegove elemente (nastavak) //dodavanje validatora $username->addvalidator(new Zend_Validate_Alnum());//ili $username->addvalidator('alnum'); //drugi parameter označava da li se validacija zaustavlja na elementu ili ne $username->addvalidator('regex', false, array('/^[a-z]/i')) -> adderrormessage( Vasa poruka ); //obavezan element $username->setrequired(true); $username->addfilter('stringtolower'); //dodavanje filetera //kraći zapisi prethodnog $username->addvalidator('alnum') ->addvalidator('regex', false, array('/^[a-z]/')) ->setrequired(true)->addfilter('stringtolower'); $username->addvalidators(array('alnum', array('regex', false, '/^[a-z]/i')))) - >setrequired(true)->addfilters(array('stringtolower')); $form->addelement('text', 'username', array( 'validators' => array( 'alnum',array('regex', false, '/^[a-z]/i')), 'required' => true, 'filters' => array('stringtolower'), )); //poruka o grešci $username-> adderrormessage( Vasa poruka ); if ($form->isvalid($this->getrequest()->ispost())) {//uredu else {// greška // validacija preko AJAX-a if ($form->isvalidpartial($_post)) {// uredu else {//greška // podaci o greškama $form->geterrors();// asocijativni niz ime/kodovi $form->getmessages();// asocijativni niz name/poruke // 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 non-alpha characters", Zend_Validate_Alpha::STRING_EMPTY => "ERROR: Name cannot be empty") ));
Tabela - Filteri Tabela-Validatori
Tabela-Validatori (nastavak)
Primer formulara- Forma za logovanje $form = new Zend_Form(); $form->setaction('/user/ /login')->setmethod('post'); // element za korisničko ime $username = $form->createelement('text', 'username'); $username->addvalidator('alnum') ->addvalidator('regex', false, array('/^[a-z]+/')) ->addvalidator('stringlength', false, array(6, 20)) ->setrequired(true) ->addfilter('stringtolower'); // Element za lozinku: $password = $form->createelement('password', 'password'); $password->addvalidator('stringlength', false, array(6)) ->setrequired(true); // Dodavanje elemenata formulara $form->addelement($username)->addelement($password) ->addelement('submit', 'login', array('label' => 'Login')); // kreiranje kontrolera class UserController extends Zend_Controller_Action{ public function getform(){return $form; public function indexaction(){ // render user/form.phtml $this->view->form = $this->getform(); $this->render('form'); public function loginaction(){ if (!$this->getrequest()->ispost()) { return $this->_forward('index'); $form = $this->getform( (); if (!$form->isvalid($_post)) { $this->view->form = $form; return $this->render('form'); $values = $form->getvalues(); // a sada autentifikacija // user/form.phtml <h2>login:</h2> <?php echo $this->form;?>
Realizacija forme preko nasleñivanja <?php class Application_Model_FormTest extends Zend_Form { 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 Element_Text('tbEmail'); $email->setattrib('size',35); $submit=new Zend_Form_Element_Submit("btnSubmit"); $submit->setattrib('value','prijavi'); $this->setdecorators(array(array('viewscript',array('viewscript'=>'_fo orm_test.phtml')))); $this->addelements(array($ime_prezime,$email,$submit)); application/view/scripts/_form_test.phtml (prikaz-renderovanje pojedinih delova formulara) <form id="test" action="<?php print $this->element->getaction();?>" method="<?php print $this->element->getmethod( ();?>"> <p>ime i prezime:<?php print $this->element->tbimeprezime;?></p> > <p>email:<?php print $this->element->tbemail;?></p> <p><?php print $this->element->btnsubmit;?></p> </form>
Dekoratori 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> Input elementi izmeñ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: adddecorators() uzima niz imena dekoratora koji se trebaju primeniti i uvek se primenjuje poslednji dodati cleardecorators() uklanja sve dekoratore sa elementa setdecorators() uklanja sve postojeće i postavlja nove Prikazivanje formulara pomoću dekoratora // eksplicinto pozivanje metode render() echo $form->render($view);// ili echo $form; // u.phtml fajlu <?php echo $this->form?> // dekoratori su metode koje vrše renderovanje elemenata $element->adddecorators(array('viewhelper','errors', array('htmltag', array('tag' => 'dd')), array('label', array('tag' => 'dt')), ));
Prikazivanje formulara pomoću dekoratora (nastavak) // podešavanje redosleda $element->setorder(10); // ili $form->addelement('text', 'username', array('order' => 10)); // gupisanje elemenata // adddisplaygroup(niz imena elemenata,ime grupe) $this ili $form $this->adddisplaygroup(array('name', 'email', 'tel', 'address'),'contact'); $this->getdisplaygroup('contact')->setlegend('contact Information'); $loginform->setelementdecorators( array('viewhelper',array(array('data'=>'htmltag'),array('tag'=>'div')), array('label',array('tag'=>'div','class'=>'test')), array('description',array('tag'=>'div')) )); $loginform->setdecorators( array('formelements',array ('HtmlTag',array('tag'=>'div')),'Form') ); Prikaz forme za logovanje u formi tabele, primenom dekoratora $this->setelementdecorators(array( 'ViewHelper', 'Errors', array(array('data'=>'htmltag'),array('tag'=>'td','class'=>'elem ment')), 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')) ));
Rad sa bazama podataka Osnovna namena modela u okviru MVC arhitekture je da komunicira sa bazom podataka. Za realizaciju modela postoje dva načina realizacije: DataMapper i ActiveRecord. Razlika izmeñu ova dva načina je u tome što ActiveRecord način komunicira direktno sa abelom/tabelama, dok DataMapper koristi sloj koji omogućava komunikaciju entiteta u kodu i entiteta u bazi podataka tj. obavlja odgovarajuće mapiranje podataka. Poslednji način omogućava nezavisnost od sistema baza podataka i jako je imun na promene sistema baze podataka. Podešavanje adaptera Prva stvar koju trebate uradite je podešavanje veze adaptera i odgovarajuće baze podataka. To se može uraditi sledećom komandom: zf configure db-adapter \"adapter=pdo_mysql&host=localhost&username=root&password=& & dbname=nazivbazepodatala\" Podešavanje adaptera u okviru application.ini fajla resources.db.adapter = "PDO_MYSQL" resources.db.params.host = "localhost" resources.db.params.username = "root" resources.db.params.password = "" resources.db.params.dbnamee = "zendtest" resources.db.params.charset= ="utf8" Podešavanje adaptera u kodu $db = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => '127.0.0.1', 'username' => 'koirsnik', 'password' => 'lozinka', 'dbname' => 'test' )); Metoda ActiveRecord Ovaj metod omogućava da direktno preko instace adaptera komunicirate sa bazom podataka.
Select upiti $db=zend_db_table::getdefaultadapter(); Dohvatanje rezultata $sql = 'SELECT * FROM tabela WHERE tabela_id =?'; $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 tabela WHERE tabela_id =?', 2); // $result je niz objekata echo $result[0]->kolona3; Preuzimanje podataka u formi niz asocijativnih nizova $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchassoc('select kolona1, kolona2, kolona3 FROM tabela'); echo $result[2]['kolona3']; echo $result[1]['kolona3']; /// $result je niz asocijativnih nizova Preuzimanje podataka jednee kolone $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchcol('select kolona1, kolona2 FROM tabela WHERE kolona2 =?', 2); echo $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;
Insert upit //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-a $db->insert('tabela', $data); $id = $db->lastinsertid(); Update upit $data = array('updated_on' => '2007-03-23', 'bug_status' => 'FIXED' ); $n = $db->update('bugs', $data, 'bug_id = 2'); $data = array('updated_on' => '2007-03-23', '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-03-23', "bug_status" = 'FIXED' // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN')
Update upiti (nastavak) $data = array( 'updated_on' => '2007-03-23', '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-03-23', "bug_status" = 'FIXED' // WHERE ("reported_by" = 'goofy') AND ("bug_status" = 'OPEN') Delete upiti $n = $db->delete('bugs', 'bug_id = 3'); Enkodovanje podataka Da bi sprečili da odreñene vrednosti u okviru promenljivih ugroze integritet baze podataka potrebno je sve vrednosti koje se prosleñuju u SQL upit dodatno obraditi. //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\'Reilly' // dobro, konverzija u odgovarajući SQL tip $value = '1234'; $sql = 'SELECT * FROM atable WHERE intcolumn = '. $db->quote($value, 'INTEGER');
enkodovanje (nastavak) // funkcija quoteinto $sql = $db->quoteinto("select * FROM bugs WHERE reported_by =?", "O'Reilly"); echo $sql; // SELECT * FROM bugs WHERE reported_by = 'O\'Reilly' $sql = $db->quoteinto("select * FROM bugs WHERE bug_id =?", '1234', 'INTEGER'); 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"" 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()->from('kategorija'); $result=$this->db->query($select); return $result->fetchall( (); public function insert(){ $data=array('naziv'=>$ $this->naziv,'roditelj'=>$this->roditelj); $this->db->insert('kategorija', $data);
public function fetch(){ $id=$this->db->quote($ $this->id); $select=$this->db->select()->from('kategorija')->where('idkategorij ja=?',$id); return $this->db->query($select)->fetchobject(); //return $this->db->query('select * FROM kategorija WHERE idkategorija=?',array($id))-> >fetchobject(); public function update(){ $data=array('naziv'=>$ $this->naziv,'roditelj'=>$this->roditelj); $where['idkategorija=??']=$this->idkategorija; $this->db->update('kategorija', $data, $where); public function delete(){ $id=$this->db->quote($this->idkategorija); $delete=$this->db->delete('kategorija','idkategorija='.$id); Metoda DataMapper Ova metoda je znatno zastupljenija u aplikacijama jer kao što je rečeno u uvodom delu ovog poglavlja obezbeñuje interfacee izmeñu entiteta u OO jeziku i entiteta u bazi podataka. Kada imate bazu podatka potrebno je da napravite kod koji će komuniciratii sa podacima iz baze podataka. Izrada koda uključuje izradu klase koja opisuje tabelu u bazi podataka i ta klasa je izvedena iz klase Zend_Db_Table_Abstract. zf create db-table ImeKlase Imetabele Ova izvedena klasa ima nekoliko promenljivih koje se odnose na osnovne podatke o samoj tabeli kao što je ime tabele ($_name) i primarnog ključa ($_id). Promenljiva $_id se inicijalizuje samo ako je ime kolone različito od id. Nakon kreiranja klase koja opisuje tabelu kreira se klasa koja predstavlja DataMapper i čiji je osnovni zadatak da vrši "prevoñenje" izmeñu strukture podataka u tabeli i strukture podataka u OO jeziku. Ova klasa se sastoji od metoda koje posreduju u razmeni podataka izmeñu koda i baze podataka. zf create model ImeMapper Na kraju se kreira model klasaa koja opisuje jedan red tabele. zf create model ImeModela Ovako kreiran model se sada može koristiti u kontroleru preko instance klase Mapper.
Šema baze podataka U prilogu ovog materija dat je kod svih klasa koje čine model.
Komponente Zend Framework-a za rad sa bazom podataka Zend_Db_Adapter Predstavlja klasu koja omogućava komunikaciju vaše aplikacije sa bazom podataka. $db = new Zend_Db_Adapter_Pdo_Mysql(array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' )); // isti efekat kao sa konstruktorom $db = Zend_Db::factory( ('Pdo_Mysql', array( 'host' => '127.0.0.1', 'username' => 'webuser', 'password' => 'xxxxxxxx', 'dbname' => 'test' )); Čitanje rezultata upita $sql = 'SELECT * FROM bugs WHERE bug_id =?'; $result = $db->fetchall( ($sql, 2); $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchall( ('SELECT * FROM bugs WHERE bug_id =?', 2); // $result je niz objekata echo $result[0]->bug_description; $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchassoc('select bug_id, bug_description, bug_status FROM bugs'); // $result je niz asocijativnih nizova echo $result[2]['bug_description']; // opis Bug #2 echo $result[1]['bug_description']; // opis Bug #1 $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchcol( ('SELECT bug_description, bug_id FROM bugs WHERE bug_id =?', 2); // vraca samo bug_description; echo $result[0]; $db->setfetchmode(zend_db::fetch_obj); $result = $db->fetchrow('select * FROM bugs WHERE bug_id = 2'); // $result je objekat echo $result->bug_description;
$result = $db->fetchone('select bug_status FROM bugs WHERE bug_id = 2'); // samo jedna vrednost echo $result; Upis promena u bazu podataka $data = array( 'created_on' => '2007-03-22', 'bug_description' => 'Something wrong', 'bug_status' => 'NEW'); $db->insert('bugs', $data); $data = array( 'created_on' => new Zend_Db_Expr('CURDATE()'), 'bug_description' => 'Something wrong', 'bug_status' => 'NEW'); $db->insert('bugs', $data); $db->insert('bugs', $data); // return the last value generated by an auto-increment column $id = $db->lastinsertid() ); $db->insert('bugs', $data); // return the last value generated by sequence 'bugs_bug_id_seq'. $id = $db->lastinsertid('bugs', 'bug_id'); // alternatively, return the last value generated by sequence 'bugs_seq'. $id = $db->lastinsertid('bugs');
Ažiriranje podataka $data = array( 'updated_on' => '2007-03-23', 'bug_status' => 'FIXED'); $n = $db->update('bugs', $data, 'bug_id = 2'); $data = array( 'updated_on' => '2007-03-23', 'bug_status' => 'FIXED'); $where[] = "reported_by = 'goofy'"; $where[] = "bug_status = 'OPEN'"; $n = $db->update('bugs', $data, $where); $data = array( 'updated_on' => '2007-03-23', 'bug_status' => 'FIXED'); $where['reported_by =?'] = 'goofy'; $where['bug_status =?'] = 'OPEN'; $n = $db->update('bugs', $data, $where); Brisanje podataka $n = $db->delete('bugs', 'bug_id = 3'); Transakcije // Start transakcije. $db->begintransaction() ); try { //pokušaj izvršavanja više upita: $db->query(...); $db->query(...); $db->query(...); $db->commit(); catch (Exception $e) { $db->rollback(); echo $e->getmessage( (); Zatvaranje konekcije $db->closeconnection();
Zend_Db_Statement Svaki upit koji se izvrši vraća metode query() koja može da prosleñuju upitu) instancu objekta tipa Zend_Db_Statement. Upit se izvršava preko sadrži dva parametra (sql upit i opcioni niz vrednosti koje se $sql = 'SELECT * FROM bugs WHERE reported_by =? AND bug_status =?'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql); $stmt->execute(array('goofy', 'FIXED')); $sql = 'SELECT * FROM bugs WHERE '. 'reported_by = :reporter AND bug_status = :status'; $stmt = new Zend_Db_Statement_Mysqli($db, $sql); $stmt->execute (array(':reporter' => 'goofy', ':status' => 'FIXED')); Dohvatanje rezultata $stmt = $db->query('select * FROM bugs'); while ($row = $stmt->fetch()) { echo $row['bug_description']; $stmt = $db->query('select * FROM bugs'); $rows = $stmt->fetchall(); echo $rows[0]['bug_description']; Promena načina vraćanja podataka $stmt = $db->query('select * FROM bugs'); $stmt->setfetchmode(zend_db::fetch_num); $rows = $stmt->fetchall(); echo $rows[0][0]; $stmt = $db->query('select bug_id, bug_description, bug_status FROM bugs'); $bug_status = $stmt->fetchcolumn(2); $stmt = $db->query('select bug_id, bug_description, bug_status FROM bugs'); $obj = $stmt->fetchobject(); echo $obj->bug_description;
Zend_Db_Select Predstavlja klasu koja opisuje SELECT upit i poseduje metode neophodne za konstruisanje SELECT upita posredstvom PHP koda. $db = Zend_Db::factory(...options... ); $select = $db->select(); // Kreiranje Zend_Db_Select objekta $db = Zend_Db::factory(...options... ); $select = new Zend_Db Select($db); // Kreiranje upita $select = $db->select(); // dodavanje FROM klauzule $select->from(...specify table and columns... ) // dodavanje WHERE klauzule $select->where(...specify search criteria... ) // dodavanje ORDER BY klauzule $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()-> >from( 'products' ); // Build this query:select p.* FROM "products" AS p $select = $db->select()-> >from( array('p' => 'products') ); //rad sa kolonama // Build this query: // SELECT p."product id", p."product_name" // FROM "products" AS p $select = $db->select() -> >from(array('p' => 'products'), array('product_id', 'product_name'));
// Build the same query, specifying correlation names: // SELECT p."product id", p."product_name" // FROM "products" AS p $select = $db->select()-> >from(array('p' => 'products'), array('p.product_id', 'p.product_name')); // Build this query with an alias for one column: // SELECT p."product id" AS prodno, p."product_name" // FROM "products" AS p $select = $db->select()-> >from(array('p' => 'products'), array('prodno' => 'product_id', 'product_name')); // izrazi u kolonama //SELECT p."product_id", LOWER(product_name) FROM "products" AS p $select = $db->select()-> >from(array('p' => 'products'), array('product_id', 'LOWER(product_name)')); // SELECT p."product id", (p.cost * 1.08) AS cost_plus_tax // FROM "products" AS p $select = $db->select()->from(array('p' => 'products'), array('product_id','cost_plus_tax' => '(p.cost * 1.08)')); //SELECT p."product_id", p.cost * 1.08 AS cost_plus_taxfrom "products" AS p $select = $db->select()-> >from(array('p' => 'products'),array('product_id', 'cost_plus_tax' =>new Zend_Db_Expr('p.cost * 1.08' '))); // dodavanje kolona na postojeće upite // SELECT p."product id", p."product_name" FROM "products" AS p $select = $db->select()-> >from(array('p' => 'products'), 'product_id') -> columns('product_name'); // SELECT p."product id", p."product_name" FROM "products" AS p $select = $db->select() ->from(array('p' => 'products'), 'p.product_id') ->columns('product_name', 'p'); // Alternatively use columns('p.product_name') // JOIN // SELECT p."product id", p."product_name", l.* // FROM "products" AS p JOIN "line_items" AS l // ON p.product_id = l.product_id $select = $db->select()->from(array('p' => 'products'), array('product_id', 'product_name')) ->join(array('l' => 'line_items'),'p.product_id = l.product_id'); // joinusing // SELECT * FROM "table1" JOIN "table2" ON "table1".column1 = "table2".column1 WHERE column2 = 'foo''