Visoka škola strukovnih studija za informacione i ... · Server, PostgreSQL, SQLite, MariaDB i...

61
Dr Nenad Kojić Visoka škola strukovnih studija za informacione i komunikacione tehnologije

Transcript of Visoka škola strukovnih studija za informacione i ... · Server, PostgreSQL, SQLite, MariaDB i...

Dr Nenad Koji

Visoka kola strukovnih studija zainformacione i komunikacione tehnologije

Framework

Predstavlja softver namenjen za podrku kreiranju razliitih vrsta aplikacija

Prednosti frameworka su postojanje velikog broja biblioteka i koda za veliki broj standardnih funkcionalnosti softvera (npr. rad sa bazama podataka, upravljanje sesijama, logovanje, stranienje, pravljenje template-a, ...)

Bolji framework-ci imaju ugraene elemente zatite U cilju zatite i standardizovane organizacije aplikacije,

koriste MVC patern design Danas se najvei broj koda koji je web orijentisan pie u

nekom framework-u Problem je razliita sintaksa kod pojedinih frameworka, i jo

nekoliko neusklaenih naina rada(podrke za AJAX, validaciju, module, autentifikaciju, vie baza podataka i sl. )

PHP framework

Zend FrameworkZend Framework je: Baziran na PHP kodu Objektno orijentisan Koristi MVC arhitekturu Ima doprinos u open source kodu, New BSD License Kreiran za rad sa veim brojem baza podataka

(MySQL, Oracle, IBM DB2, Microsoft SQL Server, PostgreSQL, SQLite, MariaDB i Informix Dynamic Server)

Ovaj framework je postao vrlo atraktivan od verzije PHP5 kada se ukljuuje u bazine elemente objektne verzije PHP-a

Ima veliki zajednicu i veliki broj klasa, metoda i gotovog koda

Zend frameworkZend Framework komponente ukljuuju: Zend_Controller Ovaj modul omoguava kompletnu kontrolu nad aplikacijom. On prevodi

zahteve u specifine akcije i izvrava date aktivnosti. Zend_Db Ova komponenta je bazirana na PHP Data Objects (PDO) i omoguava pristup

bazi podataka na generiki nain. Zend_Feed Ova komponenta omoguava lak nain upotrebe RSS i Atom feeds. Zend_Filter Omoguavanje string-filtering funkcija kao to je isEmail() and getAlpha(). Zend_InputFilter Omoguava rad sa nizovima kao to su elementi forme. Zend_HttpClient Ovim se omoguava lak rad sa HTTP request-ovima. Zend_Json Omoguava se prebacivanja podataka iz PHP objekta u JSON format i obratno. Zend_Log Ovim se omoguava uoptena funkcija logovanja. Zend_Mail Omoguava slanje mail-ova. Zend_Mime Koristi se sa Zend_Mail da omogui dekodovanje MIME poruka. Zend_Pdf Omoguava kreiranje PDF dokumenata, kao i editovanje postojeih PDF fajlova. Zend_Search Omoguava se napredna pretraga. Zend_Service Sadri nekoliko podmodula koji omoguavaju pristup svim popularnim web

servisima. Zend_View Vri obradu delova koda koji se nalaze u view sekciji MVC paterna.

http://framework.zend.com/

http://www.zend.com/en/

Pre instalacije

Nakon preuzimanja framework-a, dobija se struktura foldera prikazana na slici

Nakon instalacije

Nakon uspene instalacije, posebna prezentacija, dobija se nova struktura

Za razliku od inicijalne, sada postoje dodatno kreirani folderi, osim Bin i Library i to: Application Docs Public Tests i XML fajl zfproject

application

Jedan od najbitnijih foldera je application U njemu se nalaze etiri foldera koja sadre kljuni

deo aplikacije: Configs Controllers Models Views i Fajl Bootstrap.php

application Configs sadri sva podaavanja za aplikaciju (putanje do

kontrolera, putanje do biblioteka, putanju do Bootstrap fajla, naine obrade greaka...)

Controllers Sadri spisak svih kontrolera aplikacije. Inicijalno se dobijaju dva (Index i Error), a svi koji se kasnije dodaju se smetaju ovde u formatu ImeController.php

Models Sadri spisak svih modela. Inicijalno nema ni jednog.

Views Sadri dva inicijalna foldera(Helpers i Scripts). U Helperima se smetaju odreene kompleksne funkcionalnosti, koje se uobiajeno koriste(formatiranje datuma, generisanje elementa forme, ...) dok se u Scripts nalaze view-ovi za napravljane kontrolere

Fajl Bootstrap.php Koristi se za inicijalizaciju komponenti u aplikaciji

bin Ovo je jedan od dva foldera koji se dobija prilikom

preuzimanja framework-a Inicijalno, ima etiri fajla

Poslednja tri fajla se koriste za pokretanje Zend framework-a, s tim to se za Windows koriste zf.bat izf.php dok se za Linux koriste zf.sh i zf.php.

Ovi fajlovi su inicijalno kopirani na mesto gde je php.exe fajl odreenog web servera.

docs

Ovaj folder slui za smetanje svih propratnih uputstava i dokumentacije, i nema upravljaku funkciju

library

U folderu library se nalazi folder Zend sa svimkomponentama framework-a, i predstavlja jezgro framework-a

Putanja do ovog foldera je ukljuena u sve bitnije konfiguracione fajlove

Spisak Zend componenti u folderu Library

public

U folderu public inicijalno se nalaze dva fajla .htaccess i index.php

Preporuljivo je da se u ovaj folder smeste svi dodatni statiki fajlovi aplikacije CSS, JavaScript, Images, ...

Fajl .htaccess upuuje korisnika koji pristupi aplikaciji na kontroler index.php

Inicijalni sadraj .htaccess-a je

Problemi sa .htaccess

esto se deava, da ba ovaj fajl pravi probleme prilikom inicijalnog rutiranja, ime se ne dobija akcija Index kontrolera, a ak i sakriva Public folder u web serveru

Reenje se moe pronai u dve opcije

1. Odkomentarisati opcijuLoadModule rewrite_module modules/mod_rewrite.so

u C:\xampp\apache\conf u httpd.conf

2. Promeniti sadraj .htaccess-a sa dodatnim uslovima

Unapreeni .htaccessSetEnv APPLICATION_ENV

development

RewriteEngine OnRewriteCond %{REQUEST_FILENAME} -s [OR]RewriteCond %{REQUEST_FILENAME} -l [OR]RewriteCond %{REQUEST_FILENAME} dRewriteRule ^.*$ - [NC,L]RewriteRule ^.*$ index.php [NC,L]

DirectoryIndex alert.phpDirectoryIndex alert.php

php_value include_path ".;C:\xampp\htdocs\zend\library"

index.php

Fajl index.php definie sve putanje (include paths) i za foldere aplikacije ali i Zend library-ja, i pokretanje aplikacije

Inicijalna struktura index.php fajla je data sa

index.php - Front controller pattern

Ovo je prvi (front) controller MVC Svi PHP zahtevi (requests) realizuju se kroz index.php stranu

(bootstrap file)

Ova stranica inicijalizuje pokretanje aplikacije i to: Inicijalizuje request/response objekte Obrauje standardne funkcionalnosti kao to su: Include paths Konfiguracije Lociranje MVC komponente Logovanje, rad sa bazama podataka, autorizaciju...

Konvertuje URL adresu u request objekat sa pojedinanim delovima

Rutira requests ka odgovarajuem kontroleru i njegovom metodu

Dohvata izuzetke

tests

Ovaj folder nudi mogunost da se kroz njega realizuje aplikacija u aplikaciji

Unutar njega se nalazi struktura foldera kao na slici

I predstavlja osnovno jezgro Zend okruenja da bi se unutar njega testirale pojedini delovi aplikacije koje programer pie, a eli da ih testira pre ukljuenja u finalni projekat

.zfproject

Ovaj XML fajl nalazi se u root-u kreiranog projekta Namena ovog fajla je da opie kompletnu strukturu aplikacije To podrazumeva definisanje svih kontrolera, svih metoda unutar

tih kontrolera, itd. Njegov update se realizuje ukoliko se koristi skup zf komandi iz

command-prompt moda

1. Korisnik ne poznaje strukturu aplikacije2. Korisnik zna URL adresu3. Controller zna da razume URL adresu i da aktivira sve bitne segmente4. URL adresa sadri domen, ime kontrolera(klasu) koji se poziva i ime metoda(action) u tom kontroleru5. Na osnovu ovih podataka Kontroler zna koji deo koda da aktivira

1. Nakon uspenog prepoznavanja delova URL adrese, i pokretanja odgovarajueg koda, korisnik eka da dobije odgovor od aplikacije2. Najee ovaj odgovor definie odreeni view, koji serverkom php procesoru dostavlja PHP kod, i nakon toga, procesor ga prevodi i vraa u formi HTML koda browseru korisnika

Princip rada framework-a

Da bi sve ovo funkionisalo kako je opisano, postoji veliki brojaaktivnosti koji treba uraditi

Da bi se programeru olakao rad, zato se koristi framework, koji najvei deo procedure oko komunikacije i prevoenja koda ima u svom jezgru

Da bi programer ispravno koristio framework, mora striktno da potuje organizaciju i nain ureenja koda

To podrazumeva pisanje sopstvenog koda u skladu sa predvienim nainima komunikacije izmeu razliitih fajlova, definisanje imena fajlova u skladu sa pravilima, snimanje fajlova u definisane foldere i korienje predvienih sintaksnih pravila za komunkaciju sa framework-om

ta prvo?Za poetak:

0. Organizovati aplikaciju, definisati HTML organizaciju, pratei CSS, definisati statike sadraje divova i jasno definisati koji divovi dobijaju dinamiki sadraj i ta on konkretno predstavlja. Ovo je opisano u posebnoj prezentaciji.

1. Napraviti kontroler(e)2. Napraviti metodu(e) u kontrolerima3. Realizovati rutiranje ako je potrebno4. Kreirati view-ove5. Ispravno prihvatiti sve podatke od korisnika i pripremiti ih za

obradu6. Kreirati stranice sa sopstvenim obavetenjima o grekama7. Kreirati modele

Kreiranje novog kontrolera pod imenom account je: zf create controller account Ovo se kuca nakon pozicioniranje u folder gde se nalazi

ceo projekat( u ovom sluaju folder zend u htdocs-u)

Kreiranje novog kontrolera

1

Nakon kreiranja kontrolera...

Kreiranje sopstvenog kontrolera, dobijaju se inicijalno dva metoda init() i indexAction. Ukoliko se prilikom prozivanja url adrese ne precizira metod, nego samo kontroler account, prvo se realizuje kod metoda init() pa index().

Dodavanje metoda(action)

Nakon definisanje jednog ili veeg broja kontrolera, potrebno je definisati konkretne metode tj. action-e u tim kontrolerima

Ovo kreiranje se takoe realizuje kodom U sluaju da se kontroleru account eli dodeliti metod

success, pie se ta se kreira (action), njegovo ime(success) i ime kontrolera kome se pridodaje(account)

zf create action success account

Kreiranje novog metoda(action)

2

Dodavanje vie metoda...

Ukucavanjem jo dve linije kodazf create action new accountzf create action activate account

kontroleru account dodaju se jo dva metoda

Routing u Zend Framework-u

Rutiranje je sastavni deo Zend framework-a i definie pozadinsku logiku koja definie koji deo koda pozvati u kome trenutku, a nakon inicijalizacije URL adrese

Meutim, vrlo esto se u realnim situacijama programeru namee potreba da vrlo opisnim imenima definie imena kontrolera, a jo ee metoda, da bi jasno znao ta koji metod radi

Ovo je sa druge strane loe da vidi i korisnik Pretpostavimo da postoji kontroler Korisnici, i metod

prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa

Ovako rogobatno ime je vrlo dobro za programera ali nona mora za korisnika

Rutiranje unutar framework-a

3

Ovo se moe reiti naprednim rutiranjem Naime, Front Controller, koji je za nas stranica index.php, definie i

inicijalno rutira sve pristigle zahteve Ideja:

Ovom kontroleru naglasiti da korisnik moe da unese neki lepi naziv tipa prikaz_studenata, a da posebna logika ovo rutira ka kontroleru i metodu koji je napisao programer

Reenje:Zend je kreirao posebnu klasu Zend_Controller_Router_Route, koja ima dva ulazna parametra, i koja se koristi za interno rutiranje

Da bi se ovo reenje realizovalo, potrebno je dodati poseban deo koda u index.php stranu, i naglasiti da dolazna URL adresa 127.0.0.1/korisnici/ prikaz_studenata treba da uita kodKorisnici::Prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programaAction()

Dodatni deo koda pie se na dnu strane index.php a pre linije koda $application->bootstrap()->run();

Unapreeni index.php...// Create application, bootstrap, and run$application = new

Zend_Application(APPLICATION_ENV, APPLICATION_PATH . '/configs/application.ini');

$FrontController = Zend_Controller_Front::getInstance();$Router = $FrontController->getRouter();

$Router->addRoute("prikazStudenata",new Zend_Controller_Router_Route

("korisnici/prikaz_studenata", array

("controller" => "korisnici","action" =>

"prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa)

));

$application->bootstrap()->run();

Efekat rutiranja Ukucavanjem od strane korisnika

127.0.0.1/korisnici/ prikaz_studenata

Front kontroler pronalazi instancu Zend_Controller_Router_Routei saznaje da se umesto oekivanog metoda prikaz_studenata(kontrolera korisnici), uitava sadraj drugog metoda, istog kontrolera, sa nazivom prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa

Ako pretpostavimo da je programer napisao view, za originalni metod, i snimio ga u application/views/scripts/korisnici/ pod oekivanim imenom prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa.phtml, korisniku e se u browseru prikazati sav sadraj koji ovaj view generie, a da pri tome korisnik ni jednog trenutke nee znati da je kontaktirao metod prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa

Rutiranje sa parametrima U realnim sluajevima, obraanje metodu je sa prosleivanjem

nekog (ili vie) parametra URL adresa za prikaz studenta na smeru IT bi bila

127.0.0.1/korisnici/ prikaz_studenata/IT Na ovaj nain mogu se dohvatiti samo studenti tom smera, jer

postoji definisan parametar metoda U sluaju rutiranja, ovo je potrebno definisati

PrimerZend_Controller_Router_Route("korisnici/:smer",array("smer" => "IT","controller" => "korisnici","action" =>

"prikaz_svih_korisnika_za_unetu_oznaku_studijskog_programa"))

Podrazumevana vrednost atributa

Jo malo o rutiranju Do sada definisano rutiranje bilo je kroz fajl index.php U velikom delu kodova, ovo je realitovano na slian naina ali

kroz fajl Bootstrap.php u application/Bootstrap.php Obzirom da se ovaj deo koda eli uitati pre uitavanja strane,

mora se pisati u metodi _initRoutes

Primerpublic function _initRoutes(){

$frontController=Zend_Controller_Front::getInstance();$router=$frontController->getRouter();

$route=new Zend_Controller_Router_Route_Static('pocetna', array('controller'=>'Prvi','action'=>'index'));

$router->addRoute('pocetna',$route);}

View Prilikom kreiranja kontrolera, obzirom da framework pretpostavlja

da se neki rezultat negde mora prikazati, automatski se kreiraju tri bitna objekta: ViewRenderer Request (dohvata i obrauje sve podatke od korisnika - forma) Response

Svaki view se pie u phtml eksenziji i smeta u fajl koji ima ime metoda i snima se u

application/views/scripts/ pa u folder koji nosi ime kontrolera

Primer:C:\xampp\htdocs\zend\application\views\scripts\account\index.phtml

4

Kreiranje view-a Kao i kod kontrolera i action-a, i view se kreira kroz kod

Nakon kreiranja, automatski se kreira pomenuti phtmlfajl sa sadrajem kao na slici

Ovaj sadraj je statiki, i njega programer menja. Ovako definisano, ovom view-u se nita ne prosleuje, pa moe da da samo statiki sadraj

Sintaksa kodova za kreiranje

Prikaz korisniku

Ukoliko se view kreirana na ovakav nain, i sadraj eventualno modifikuje, kao na slici

Nije potrebna posebna komanda kojom se kontroleru ukazuje da treba nakon njegovog prozivanja da pozove svoj view

Prosleivanje sadraja view-u

U sluaju da se view-u prosleuje jedan ili vie podataka, koristi se sintaksa

$this->view->assign(index, value)

Npr.

Dohvatanje podatka iz metoda u view-u

Request object

Jedan od tri inicijalna view objekta je i Request object Primarna uloga ovog objekta je prihvatanje podataka koji su

prosleeni od strane korisnika(kroz URL adresu, formu, ...) HTML kod ove podatke struktuira i alje automatski, nakon

submit-ovanja forme Svaki od prosleenih podataka ima ime i vrednost Ime je name atribut u HTML formi, a vrednost ono to je

definisao korisnik ili programer Cilj je ove podatke od korisnika, prihvatiti i dalje obraivati U Zendu postoje definisani metodi kojima se direktno pristupa

Request objektu, i podaci struktuiraju

5

Metodi Request objekta

Primer index.php...

public function successAction(){$email = $this->_request->getParam('email');$username = $this->_request->getParam('username');$password = $this->_request->getParam('password');//Save the user into the system.}

Ili

public function successAction(){$email = $this->_request->getPost("email");$username = $this->_request->getPost("username");$password = $this->_request->getPost("password");//Save the user into the system.}public function activateAction(){$emailToActivate = $this->_request->getQuery("email");}

Zbog sogurnosti ga treba

izbegavati.

Provere Request objekta

Primer index.php...public function successAction(){if($this->_request->isPost()){

$email = $this->_request->getPost("email");$username = $this->_request->getPost("username");$password = $this->_request->getPost("password");

}else{ throw new Exception(Greka."); }}.....if($this->_request->isGet()){

$email = $this->_request->getQuery("email");}.....if($this->_request->isXmlHttpRequest()){

$email = $this->_request->getQuery("email");}

Prosleivanje prihvaenih parametara view-u

//Kontroler index.php

...public function nameAction(){//prosleivanje fiksnog stringa

$this->view->assign('ime', 'Pera');

//prosleivanje prihvaenog stringa od strane korisnika$request = $this->getRequest();$this->view->assign('email', $request->getParam('email'));$this->view->assign('smer', $request->getParam('smer'));

}

errors Prilikom inicijalizacije projekta, dobija se kontroler

ErrorController.php koji ve obrauje vei broj standardnih tipova greaka

Shodno ovom kontroleru, postoji i kreiran view, u folderu error, sa generikim tipom ispisa greaka

Pored definisanih tipova greaka i metoda kojima se dohvataju propratne greke, mogue je definisati i svoj dodatni kod

6

ErrorController

ErrorController

error.phtml

Cilj pisanja modela Smetanje biznis logike aplikacije

7

Primer Model za snimanje podataka u bazu podataka

SaveAccount.php

Veza kontrolera i modelapublic function successAction(){

if($this->_request->isPost()){$email = $this->_request->getParam("email");$username = $this->_request->getParam("username");$password = $this->_request->getParam("password");

require_once "SaveAccount.php";

$SaveAccount = new SaveAccount();$SaveAccount->saveAccount($username, $password, $email);}

else{throw new Exception("Greska.");

}}

Dr Nenad Koji

Visoka kola strukovnih studija zainformacione i komunikacione tehnologije