Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


Zadaci-Vezbe-Web programiranje-Informatika (13), Vežbe od Web programiranje

web programiranje, informatika, vezbe iz web programiranja, zadaci sa vezbi, zadaci, zadaci iz web programiranja,Nizovi u jeziku PHP, Nizovi sa numeričkim indeksiranjem, Veza sa bazom podataka, Pristup MySQL bazi na lokalnom serveru, Rad sa sesijama i cookies, Funkcije, Sintaksa Regularnih Izraza

Tipologija: Vežbe

2012/2013

Učitan datuma 08.07.2013.

dcplover
dcplover 🇸🇷

4.5

(164)

799 dokumenti

1 / 10

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
Materijal za vežbe iz Web programiranja, IMI PMF Kragujevac
Regularni izrazi u PHP-u 1/10
Web programiranje
Vežbe 13 Objektno-relacioni maper Doctrine
Doctrine je objektno-relacioni maper (ORM) za PHP 5.2.3+ i baziran je na DBAL (Database
Abstraction Layer) koji se pak bazira na standardnom PDO (PHP Data Objects). Kao što sam akro-
nim ORM ukazuje, svrha Doctrine je da obezbedi automatsko prevođenje iz objekta u relacije neke
baze podataka i obrnuto. Na ovaj način, moguće je operisati “virtuelnom objektnom bazom podata-
ka” prilagođenom objektnom programskom jeziku. Doctrine je po konceptu sličan ORM-u Hiber-
nate za programski jezik Java i ASP.NET.
Slika. Struktura Doctrine ORM-a
Kako ORM olakšava pisanje web aplikacija i aplikacija koje rade sa podacima uopšte?
Najveći problem su, svakako, različiti načini za operisanje podacima u OO modelu i relacionom
modelu. U OO modelu, normalno je operisati objektima koji imaju svoje atribute i metode.
Na primer, klasa objekata Osoba sadržala bi atribute ime, prezime, adresu, listu (ili niz) tele-
fonskih brojeva itd. Sa druge strane, relacioni model se sastoji od tabela koje su ispunjene skalarnim
podacima (nema nizova, listi...). Pored toga, OO model sadrži i metode kao recimo, promeniTele-
fonskiBroj(string novi_broj), o čemu nema govora u relacionom modelu. Zadatak ORM-a je da
premosti tu razliku i omogući direktno mapiranje objekata sa svim svojim atributima i metodama u
relacioni model, pri čemu se, u opštem slučaju, klase reprezentuju tabelama u bazi, objekti
pojedinačnim vrstama u tabeli, a atributi objekta kolonama. Ovde će na primeru web aplikacije za
ankete biti u kratkim crtama opisane glavne osobine ORM-a Doctrine.
Web aplikacija za sprovođenje anketa
Zadatak je razviti web aplikaciju koja omogućava svim posetiocima da izaberu jedan od
ponuđenih odgovora na aktuelno anketno pitanje. U bazi može biti više anketnih pitanja, svako sa
svojim ponuđenim odgovorima, ali se na glavnoj strani pojavljuje samo najnovija anketa, dok se
rezultati glasanja za sve stare ankete čuvaju. Administratorski deo sadrži stranice za pregled rezulta-
ta svih aneketa, mogućnost brisanja pojedinačnih anketa, kao i mogućnost dodavanja ankete sa
ponuđenim odgovorima.
pf3
pf4
pf5
pf8
pf9
pfa

Delimični pregled teksta

Preuzmite Zadaci-Vezbe-Web programiranje-Informatika (13) i više Vežbe u PDF od Web programiranje samo na Docsity!

Web programiranje

Vežbe 1 3 Objektno-relacioni maper Doctrine

Doctrine je objektno-relacioni maper (ORM) za PHP 5.2.3+ i baziran je na DBAL ( Database

Abstraction Layer ) koji se pak bazira na standardnom PDO ( PHP Data Objects ). Kao što sam akro-

nim ORM ukazuje, svrha Doctrine je da obezbedi automatsko prevođenje iz objekta u relacije neke

baze podataka i obrnuto. Na ovaj način, moguće je operisati “virtuelnom objektnom bazom podata-

ka” prilagođenom objektnom programskom jeziku. Doctrine je po konceptu sličan ORM-u Hiber-

nate za programski jezik Java i ASP.NET.

Slika. Struktura Doctrine ORM-a

Kako ORM olakšava pisanje web aplikacija i aplikacija koje rade sa podacima uopšte?

Najveći problem su, svakako, različiti načini za operisanje podacima u OO modelu i relacionom

modelu. U OO modelu, normalno je operisati objektima koji imaju svoje atribute i metode.

Na primer, klasa objekata Osoba sadržala bi atribute ime, prezime, adresu, listu (ili niz) tele-

fonskih brojeva itd. Sa druge strane, relacioni model se sastoji od tabela koje su ispunjene skalarnim

podacima (nema nizova, listi...). Pored toga, OO model sadrži i metode kao recimo, promeniTele-

fonskiBroj(string novi_broj) , o čemu nema govora u relacionom modelu. Zadatak ORM-a je da

premosti tu razliku i omogući direktno mapiranje objekata sa svim svojim atributima i metodama u

relacioni model, pri čemu se, u opštem slučaju, klase reprezentuju tabelama u bazi, objekti

pojedinačnim vrstama u tabeli, a atributi objekta kolonama. Ovde će na primeru web aplikacije za

ankete biti u kratkim crtama opisane glavne osobine ORM-a Doctrine.

Web aplikacija za sprovođenje anketa

Zadatak je razviti web aplikaciju koja omogućava svim posetiocima da izaberu jedan od

ponuđenih odgovora na aktuelno anketno pitanje. U bazi može biti više anketnih pitanja, svako sa

svojim ponuđenim odgovorima, ali se na glavnoj strani pojavljuje samo najnovija anketa, dok se

rezultati glasanja za sve stare ankete čuvaju. Administratorski deo sadrži stranice za pregled rezulta-

ta svih aneketa, mogućnost brisanja pojedinačnih anketa, kao i mogućnost dodavanja ankete sa

ponuđenim odgovorima.

Postavljanje okruženja

Prvo što treba uraditi, nakon otvaranja novog projekta, je preuzimanje verzije PHP biblioteke

Doctrine 1.2.4 i kopiranje na odgovarajuće mesto u projektu. Aktuelna verzija se može preuzeti sa

http://www.doctrine-project.org/projects/orm. Preuzeti arhivu sa IMI-ja, raspakovati je u direktori-

jumu projekta.

Takođe, dobra praksa je da se što više razdvoji kod koji radi sa modelom podatka od koda ko-

ji služi za prikaz HTML strane. U svrhu ove vrste razdvajanja, formiraćemo poseban direktorijum

poda nazivom modeli unutar projekta u kome će se nalaziti klase koje definišu model podataka za

web aplikaciju.

Model podataka

Model podataka web aplikacije sadržaće dve tabele (u ORM klase), Pitanje i Odgovor , pri

čemu za svako pitanje postoji više ponuđenih odgovora. U svrhu formiranja tabela, u direktorijumu

modeli sada treba napraviti nove fajlove Pitanje.php i Odgovor.php sa sledećim sadržajem:

Pitanje.php

setTableName(‘pitanje’); // Setovanje kolona sa nazivom, tipom i duzinom $this->hasColumn(‘tekst’, ‘string’, 255); $this->hasColumn(‘datum’, ‘date’); } // Inicijalizacija tabele public function setUp() { // Svakom slogu se dodaje polje za vreme modifikacije $this->actAs(‘Timestampable’); // definisanje relacije prema tabeli Odgovor $this->hasMany(‘Odgovor’, array(‘local’ => ‘id’, ‘foreign’ => ‘pitanje_id’)); } }

?>

http://docs.doctrine-project.org/projects/doctrine1/en/latest/en/manual/defining-

models.html

Odgovor.php

setTableName(‘odgovor’); // Setovanje kolona sa nazivom, tipom i duzinom $this->hasColumn(‘pitanje_id’, ‘integer’, 20); $this->hasColumn(‘tekst’, ‘string’, 255); $this->hasColumn(‘broj’, ‘integer’, 20); }

// Punjenje tabela podacima (primer) $pitanje = new Pitanje(); $pitanje->tekst = "Koju Web platformu za razvoj koristite?"; $pitanje->datum = date(‘Y-m-d’); $pitanje->save();

$odgovor1 = new Odgovor(); $odgovor1->tekst = ‘PHP’; $odgovor1->broj = 0; // Odredjivanje relacije (iza strelice ide naziv korelirane klase) $odgovor1->Pitanje = $pitanje; $odgovor1->save();

$odgovor2 = new Odgovor(); $odgovor2->tekst = ‘Java EE’; $odgovor2->broj = 0; // Odredjivanje relacije (iza strelice ide naziv korelirane klase) $odgovor2->Pitanje = $pitanje; $odgovor2->save();

?>

Vrednosti atributa objekata se navode na standardni način, dok se konkretne relacije među ob-

jektima postavljaju navođenjem imena klase iza operatora “->” i direktnim pridruživanjem korelira-

nog objekta. ORM automatski postavi vrednosti primarnih i stranih ključeva. Kada su postavl-

jeni i atributi i relacije, poziva se metoda save() klase Doctrine_Record koja unete podatke pohran-

juje u bazu sa kojom je uspostavljena konekcija.

Skript kreiraj-tabele.php treba pozvati samo jednom, i to najbolje iz komandne linije:

C:\wamp\bin\php\php5.3.0>php C:\wamp\www\Doctrine\kreiraj-tabele.php

Ukoliko je sve ispravno prošlo, skripta ne vraća nikakav izlaz.

Stranica za anketno glasanje

Zadatak stranice anketa.php je da omogući korisniku glasanje na najnovije anketno pitanje.

Stranica anketa.php demonstrira kako se u Doctrine postavljaju normalni SQL upiti koji zahtevaju

složenije WHERE, GROUP BY, HAVING,... klauzule. U ovom primeru, kreira se upit korišćenjem

fabričke metode create() klase Doctrine_Query. Upit se izvršava pozivom metode fetchOne() koja

vraća samo prvi zapis.

Takođe, ovde je demonstirano i kako se, bez postavljanja klasičnog upita može doći do svih

ponuđenih odgovora koji koreliraju sa aktuelnim anketnim pitanjem. Naime, u atributu objekta $pi-

tanje pod nazivom Odgovor (ime klase), nalazi se niz odgovora na dato pitanje.

anketa.php

Anketa

php include ‘konfiguracija.php’;

// Kreiranje standardnog upita u Doctrine, // vraca pitanja poredjana od najnovijeg ka najstarijem

$upit = Doctrine_Query::create()

  • >select(‘id,tekst’)
  • >from(‘Pitanje’)
  • >orderBy(‘datum desc’);

// Uzmi samo najnovije pitanje $pitanje = $upit->fetchOne(Doctrine_Core::HYDRATE_ARRAY);

if (!isset ($pitanje)) die (‘GRESKA: Nema nijedne ankete u bazi!’);

echo " {$pitanje[‘tekst’]} ";

// Doctrine vraca niz odgovora koji su ponudjeni za dato pitanje $odgovori = $pitanje->Odgovor;

// Stampa se forma sa pitanjem i ponudjenim odgovorima na njega echo "";

if ( count($odgovori) > 0 ) {

foreach ($odgovori as $odgovor) { echo " {$odgovor[‘tekst’]} "; }

echo ""; echo ""; } else { echo ‘GRESKA: Nema ponudjenih odgovora u ovoj anketi!’; }

echo ‘‘; ?>

Stranica za obradu glasanja

Stranica anketa_submit.php obrađuje odgovor poslat od anketa.php , preko kolačića prove-

rava da li je na toj anketi već glasano, pa ako nije, pronalazi odgovor preko primarnog ključa meto-

dom find() klase Doctrine_Table čiju instancu vraća statička metoda Doctrine::getTable().

anketa_submit.php

Glasano na anketi

// Ako ima rezultata ispisi pitanja sa linkovima ka skriptovima // za pregled rezultata i brisanje if ( count($pitanja)>0 ) { foreach ($pitanja as $pitanje) { echo ‘‘; echo " {$pitanje[‘tekst’]} "; echo "

pogledaj izvestaj

"; echo "

obrisi

"; echo ‘‘; } } else { echo "

Trenutno nema nijedne ankete u bazi.

"; } ?>

Dodavanje nove ankete:

Pitanje

Odgovor #1

Odgovor #2

Odgovor #3

Odgovor #4

Odgovor #5

Brisanje ankete

Skripta za brisanje ankete je vrlo jednostavna, naročito zbog povoljnosti koje pruža Doctrine

ORM. Dakle, prvo se pronađe odgovarajuće pitanje preko primarnog ključa (koji se prosleđuje GET

metodom), zatim se obrišu svi odgovori vezani za dato pitanje i na kraju se obriše samo pitanje.

obrisi.php

Brisanje ankete

Administracija find($_GET[‘pitanje_id’]); // Prvo obrisi sve odgovore vezane za to pitanje $pitanje->Odgovor->delete(); // zatim obrisi samo pitanje $pitanje->delete();

echo "Anketa uspesno obrisana! Klikni ovde za po- vratak na admin stranicu."; } else { die (‘GRESKA: Podaci nisu uspesno poslati!’); } ?>

Dodavanje nove ankete

Skripti dodaj.php se GET metodom šalje pitanje sa ponuđenim odgovorima iz forme unutar

skripte admin.php. Na početku se proverava da li je slučajno anketno pitanje prazan string i formi-

ra se niz validnih odgovora (onih koji nisu prazan string). Svako anketno pitanje mora imati makar

dva validna ponuđena odgovora.

U daljem kodu skripte, pokazuju se neke od naprednih mogućnosti Doctrine ORM-a. Pravi se

novi objekat klase Pitanje , i odgovarajući broj objekata klase Odgovor. Odgovori se sa pitanjem

povezuju dodavanjem na niz $pitanje->Odgovor , pomoću operatora [].

dodaj.php

Dodavanje ankete

Administracija anketa

tekst = $_GET[‘pitanje_tekst’]; $pitanje->datum = date(‘Y-m-d’);

// Prodji kroz validne odgovore i dodaj ih // povezujuci ih sa odgovarajucim pitanjem foreach ($validni_odgovori as $odgovor_tekst) { $odgovor = new Odgovor(); $odgovor->tekst = $odgovor_tekst; $odgovor->broj = 0; $pitanje->Odgovor[] = $odgovor; }

// Doctrine ne postavlja uslov da se svaki odgovor snimi posebno // Dovoljan je jedan poziv save() za pitanje i korelirani odgovori ce se /// pravilno sacuvati u bazi $pitanje->save(); echo "Anketa uspesno dodata! Klikni ovde za povratak na admin stranicu.";

?>