You are on page 1of 39

PHP XML SKRIPTA

Sadraj
Sadraj........................................................................................................................ 2 PHP i XML....................................................................................................................3 Upravljanje XML-om u PHP-u......................................................................................3 Biblioteka SimpleXML.................................................................................................5 SimpleXML - itanje XML fajla..................................................................................6 SImpleXML - Modifikacija XML dokumenata............................................................9 SimpleXML - itanje XML dokumenta nepoznate strukture...................................10 Biblioteka DOM.........................................................................................................11 DOM XML itanje XML dokumenta i prikaz.........................................................14 DOM XML Kreiranje XML dokumenta i modifikacija.............................................15 DOM XML Obrada i uitavanje XML fajla preko AJAX-a..........................................17 Xpath biblioteka....................................................................................................... 20 SimpleXML i Xpath....................................................................................................23 DOM XML i Xpath......................................................................................................24 Dodavanje novog elementa...................................................................................24 Promena podataka................................................................................................ 25 Brisanje podataka..................................................................................................26 Prikaz podatka uz korienje Google Chart API-a......................................................28

PHP i XML
Hypertext Preprocessor (PHP) je cross-platform skriptni jezik koji se koristi za pisanje dinamikih Web aplikacija, aplikacije koje se izvravaju na strani servera. Kompanija Zend Technologies jo uvek od njenog osnivanja upravlja razvojem PHP. PHP5 od svog objavljivanja doprineo je poboljanju: Nova podrka za objektno orijentisano programiranje Nova podrka za MySql bazu podataka Bolja podrka za upravljanje XML-om, to od svega navedenog u ovoj skripti nas najvie zanima. Iako je PHP jo u svojim ranijim verzijama imao podrku za XML, tek od verije PHP5 oseaju se ekplicitna poboljanja kada je re o upravljanju XML-om. U verziji PHP4 rad sa XML-om je bio donekle ogranien, to nije sluaj sa verzijom PHP5, gde se koriste veliki broj standarda. PHP5 ukljuuje prepisane ekstenzije kao i nova proirenja, ukljuujui SAX parser, DOM, SimpleXML, XMLReader, XMLWriter i XSLT procesiranje. Sve ove ekstenzije su sada ukljuene na osnovu biblioteke libxml2. Zajedno sa SAX podrkom poboljanu u verzijama PHP4 i PHP5 takoe podrava i DOM u skladu sa W3C standardom i SimpleXML ekstenzijom. SAX, DOM i SimpleXML su podrazumevane ekstenzije za manipulaciju.

Upravljanje XML-om u PHP-u


PHP ima veliku podrku za manipulaciju XML dokumentima. Postoji vei broj ugraenih biblioteka koji na neki nain upravljaju XML fajlovima. U nastavku, prikazan je spisak biblioteka i dat je kratak opis kako se moe upravljati XMLom. Naziv biblioteke DOM DOM XML (PHP4) Opis DOM (Document Object Model) proirenje omoguava rad sa XML dokumentima koje je zasnovano na W3C standardu DOM XML je revidiran u PHP 4.3.0. verziji kako bi bio u skladu sa DOM standardom. Proirenje jo uvek sadri mnoge stare funkcije, ali ne bi trebalo vie da se koriste. Konkretno, funkcije koje nisu objektno orijentisane treba izbegavati. Ova biblioteka je dostupna od PHP 5.1.0 verzije, i
3

libxml

SDO

SDO DAS XML SimpleXML

sledee biblioteke se osnlanjaju na ovu biblioteku: DOM, libxml, SimpleXML, SOAP, WDDX, XSL, XSLT, XML, XMLReder, XMLRPC i XMLWriter. Service Data Objects (SDOs) omoguava PHP aplikacijama da rade sa podacima iz razliitih izvora (baze podataka, XMl fajlovi itd.) pomou jednog interfejsa. SDO DAS XML obezbeuje premetanje podataka izmeu aplikacije i XML izvora podataka, izvor moe biti neki fajl ili URL adresa. SimpleXML biblioteka omoguava vrlo jednostavno i lako upravljanje sa XML fajlovima, tako to konvertuje XML u objekte i onda obezbeuje manipulaciju kroz niz intereacija.
SimpleXML je jednostavna, ali mona klasa koja ima mogunost itanja, kreiranja, modifikacije i snimanja XML dokumenata.

WDDX

XML Parser

XMLReader

XMLWriter

The Web Distributed Data Exchange (WDDX) je besplatana biblioteka, otvorenog koda, zasnovana na XML tehnologiji, koja omoguava da aplikacije kreirane na bilo kojoj platformi kominiciraju i razmenjuju podatke sa drugim aplikacijama preko weba. Ova biblioteka Vam omoguava da kreirate XML parser, a potom moete definisati ratzliite rukovodioce za razliite XML dogaaje. Svaki XML parser ima nekoliko parametra koje moete podesiti. Omoguava itanje, pisanje, auriranje, kreiranje i manipulaciju nad XML dokumentima. XMLReader je proiranje XML parsera. XMLReader se ponaa kao kursor, ide napred kroz dokument i zaustavlja se na svakom voru na koji naie na putu. Vano je napomenuti da XMLReader koristi UTF-8 kodiranje, i dobijeni sadraj preko XMLReadera uvek e biti u tom formatu. XMLWriter predstavlja proirenje XML parsera, koristi xmllib biblioteku za manipulisanje podacima. Koristi se i kod objektno orijentisanog stila kodiranja, kao i u proceduralnom stilu.

Svaka od pomenutih biblioteka omoguava na svoj nain manupulaciju nad XML dokumentima, tri najee koriene biblioteke jesu SimpleXMl, DOM, XML Parser u kombinaciji sa XMLReader-om i XMLWriter-om. U nastavku e biti detaljnije objanjene ove bibliteke sa konkretnim primerima.

Biblioteka SimpleXML
SimpleXML je nova biblioteka u PHP5 verziji. Omoguava na lak i jednostavan nain manipulaciju nad XML dokumentima, gde se veoma jednostavno moe dobiti informacija o atributima elemenata i sadraju, ako se unapred zna raspored XML dokumnta. SimpleXML biblioteka omoguava itanje XML fajlova u samo par linija koda. SimpleXML je jednostavna ali veoma mona biblioteka koja ima mogunost, itanja, kreiranja, modifikacije i snimanja XML dokumenata. Funkcionie tako to kreira objekat (SimpleXML objekat) iz nekog izvora koji moe biti neki eksterni XML fajl ili string. Pod uslovom da XML dokument nije previe komplikovan, da nema veliki broj granjanja, i da ne sadri meoviti sadraj, SimpleXML predstavlja laki nain parsiranja XML dokumenta od DOM biblioteke, to se moe zakljuiti i od samog naziva. SimpleXML ima prednost ako se radi sa nekom poznatom strukturom podataka. Konvertovanje XML dokumenta u objekat se realizuje na sledei nain:

Elementi konvertuju se u jednom atributu SImpelXMLElement objekta. Kada postoji vie od jednog elementa na jednom nivou, oni se postavljaju unutar niza. Atributi Pristupa se uz pomo asocijativnih nizova, gde indeks odgovara nazivu atributa, dok vrednost asocijativnog niza predstavlja vrednost atributa. Sadraj elementa Sadraj elementa se konvertuje u string, Ako u elementu postoji vie od jednog vora, onda e oni biti rasporeeni kako se nalaze u XML dokumentu.

SimpleXML je brz i jednostavan za upotrebu pri obavljanju osnovnih zadataka kao to su:

itanje XML datoteka, Izdvajanje podataka iz XML stringa, Ureivanje sadraja vorova ili atributa.

Od verzije PHP 5.0, SimpleXML funkcije su deo jezgra PHP-a. Nije potrebna nikakva instalacija dodatnih biblioteka kada se ele koristiti SimpleXML funkcionalnosti.

Spisak SimpleXML funkcija: Funkcija


__construct() addAttribute() addChild() asXML() attributes() children() count() getDocNamespaces( ) getName() getNamespaces() registerXPathNames pacs() xpath()

Opis Kreira novi objekat SimpleXMLElement Dodaje atribut u SimpleXML elementu Dodaje dete element SimpleXML elementa Dobija XML string iz SimpleXML elementa Vraa atribute SimpleXML elementa Vraa decu odreenog vora Broji decu odreenog elementa Vraa imenski prostor XML dokumenta Vraa ime SimpleXML elementa Vraa imenksi prostor iz XML podatke Kreira imenski prostor za sledei Xpath upit Pokree Xpath upit nad XML podacima

PHP verzija 5 5 5 5 5 5 5 5 5 5 5 5

Klikom na svaku od funkcija prikazanih u gornjoj tabeli, moete dobiti detaljnije informacije o parametrima koje primaju odreene funkcije kao i nainu korienja. U nastavku, kroz primere koristie se veina bitnih funkcija koje se koriste prilikom parsiranja XML dokumenta.

SimpleXML - itanje XML fajla


U nastavaku bie prikazan primer kako se uz pomo biblioteke SimpleXML moe proitati neki XML fajl. U konkretnom primeru koristi se primer xml fajla pod nazivom knjige.xml.
<?xml version="1.0" encoding="UTF-8"?> <knjige> <knjiga isbn="978-1594489501"> <naslov>Internet tehnologije</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac> <cena>20</cena> </knjiga> <knjiga isbn="978-1594489502"> <naslov>Elektornsko poslovanje</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac> <cena>15</cena> </knjiga> <knjiga isbn="978-1594489503"> <naslov>PHP XML skripta</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac>

<cena>25</cena> </knjiga> </knjige>

Postoje dva naina kako se moe uitati odreeni XML fajl i kreirati SimpleXML objekat. Prvi nain jeste da proita XML fajl knjige.xml i kreira string na osnovu sadraja tog fajla ili pak proslediti SimpleXML objektu, putanju do XML fajla knjige.xml. To izgleda ovako:
<?php // 1. Nain: Uitavanje xml fajla i kreiranje stringa $data = file_get_contents('knjige.xml'); $knjige = SimpleXMLElement($data); // 2. Nain: kreiranje objekta direktnim uitavanje XML fajla $knjige = SimpleXMLElement('knjige.xml', null, true);

?>

Na osnovu gore navedenog moe se zakljuiti, poto u prilogu je predstavljen eksterni XML fajl da e se koristiti drugi nain za upravljanje XML-om preko SimpleXML biblioteke. Prvi nain je pogodan kada se eli obraditi neki XML dokument koji se nalazi negde na webu i sadraj tog XML dokementa dobija se preko nekog web servisa. Kod poziva SimpleXMLElement('knjige.xml', null, true); Trei parametar oznaava da e XML dokument biti preuzet sa URL adrese. Drugi nain kako se moe uitati xml datoteka jeste koristei funkciju simplexml_load_file(). U ovom sluaju kod bi izgledao ovako:
$knjige = simplexml_load_file('knjige.xml');

Nakon to se uita XML fajl u PHP objekat, potrebno je sada da se proe kroz SimpleXML objekat i da ispie sadraj tog objekta. Ispis e biti prikazan u tabeli. Sadraj fajla simple_xml_primer_knjige.php
<?php // uitavanje SimpleXML objekta $knjige = new SimpleXMLElement('knjige.xml', null, true); echo '<table> <tr> <th>Naslov</th> <th>Autor</th> <th>Izdavac</th> <th>Cena</th> <th>ISBN</th> </tr>';

//prolazimo kroz objekata knjige koje smo ucitali iz xml fajla foreach($knjige as $knjiga){ echo '<tr> <td>'.$knjiga->naslov.'</td> <td>'.$knjiga->autor.'</td> <td>'.$knjiga->izdavac.'</td> <td>'.$knjiga->cena.'</td> <td>'.$knjiga["isbn"].'</td> </tr>'; } echo '</table>'; ?>

Nakon pokretanja ovog koda dobija se prikaz na ekranu kao na sledeoj slici:

Slik 1. Prikaz izgleda nakon izvravanja fajla

U narednih par reenica bie objanjeno kako se pristupa konkretnom elementu u nekom XML dokumentu. U gore navedenom primeru kada se eli pristupiti elementu NASLOV to se radi na sledei nain (Zanemaruje se deo gde se prolazi kroz foreach petlju):
$knjiga->naslov

Naslov sada u SimpleXML objektu predstavlja atribut tog objekta i pristup tom atributu izgleda kao na gore navedeni nain. Na isti nain pristupa se i svim ostalim elementima, koji kada se uitaju u SimpleXML objekat predstavljaju atribute tog objekta. Atributu nekog XML elementa, nakon uitavanja u SimpleXML objektu pristupa se na sledei nain:
$knjiga["isbn"]

Kao to je gore navedeno, atributi xml dokumenta, nakon konvertovanja u SimpleXML objektu, uvaju se u asocijativnom nizu, gde indeks tog niza predstavlja u stvari naziv tog atributa. Ako bi se, npr elelo pristupiti naslovu drude knjige to bi trebalo uraditi na sledei nain:
echo $knjige->knjiga[1]->naslov;

Pristupanje SimpleXML objektu $knjige, objekat $knjige zapravo predstavlja niz objekata $knjiga, gde indeks elementa niza kree od 0, zbog toga pristupanje drugoj knjizi na ovaj nain, gde se navodi indeks 1, potom tom konkretnom objektu pristupa njegovom atributu naslov. ISBN broj neke knjige moe se prikazati na sledei nain:
echo $knjige->knjiga[1]['isbn'];

SImpleXML - Modifikacija XML dokumenata


Prilikom modifikacije XML dokumenata, mora se voditi rauna da li se XML dokument kreira od poetka ili se postojei XML dokument modifikuje. Razlika je u tome ako vre neke promene, mora se predhodno proitati i proi sekvencijalno kroz XML dokument i proveriti element po element. Na poetku kreira se novi XML dokumnet preko SimpleXML biblioteke. Prilikom kreiranja odmah se prosleduje i deklaracija XML dokumenta.
$xmlKnjige = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\"? ><knjige></knjige>");

Kreiran je koreni vor knjige. Sada se moe krenuti sa daljim kreiranjem XML dokumenta, dodajui nove vorove, odnosno elemente, atribute kao i sadraj. U narednom delu, prikazano je kako se moe dodati nova knjiga u XML dokumentu.
<?php //kreira se novi xml dokumnet $xmlKnjige = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\"? ><knjige></knjige>"); //kreira se novi element knjiga $knjiga = $xmlKnjige->addChild("knjiga"); //dodavanje atributa elementu knjiga (atribut isbn) $knjiga->addAttribute("isbn", "978-1594489501"); //dodavanje podelemenata elemntu knjiga $knjiga->addChild("naslov", "PHP XML skripta"); $knjiga->addChild("autor", "Aleksandar Nastevski"); $knjiga->addChild("izdavac", "FON"); $knjiga->addChild("cena", "35"); //ispis, prikazivanje xml-a u obliku stringa echo $xmlKnjige->asXML(); ?>

Tokom pisanja ovog primera koriene su par novih funkcija koje su se koristile za izradu XML dokumenta preko SimpleXML biblioteke. addChild() - dodaje novo dete, odnosno novi podelement odreenog elementa. Funkcija prihvata samo jedan parametar (naziv podelementa), dva parametra (naziv podelementa i njegov sadraj) ili pak postoji mogunost da se proslede tri parametra gde trei parametar predstavlja naziv prostornog imena. addAttribute() - dodaje atribut tekuem elementu. Prihvata isti broj parametara i tip kao i metoda addChild(). asXML() ova metoda moe imati dve funkcionalnosti, ako joj se ne prosledi nita pretvara XML dokument u string, dok druga funkcionalnost se odnosi na snimanje XML dokumenta, na putanju koja se prosledi (asXML("noveKnjigeXML.xml")), ova metoda vraa true ili false u zavisnosti da li je uspeno snimljen fajl. XML fajl moe se idirektno u PHP kreirati navodei tagove. Primer:
<?php $noviXml = "<?xml version=\"1.0\" encoding=\"utf-8\"?><knjige>"; $noviXml .= "<knjiga isbn=\"978-1594489501\">"; $noviXml .= "<naslov>PHP XML skripta</naslov>"; $noviXml .= "<autor>Aleksandar Nastevski</autor>"; $noviXml .= "<izdavac>FON</izdavac>"; $noviXml .= "<cena>20</cena>"; $noviXml .= "</knjiga>"; $noviXml .= "</knjige>"; echo $noviXml; ?>

SimpleXML - itanje XML dokumenta nepoznate strukture


Kao to ste moglo videti, parsiranje XML dokumenata korienjem SimpleXML biblioteke nije teko, naprotiv, jednostavno i lako, kada je poznata struktura XML dokumenta, ali nastaje problem kada se eli analizirati neki XML fajl za kome se ne zna struktura podataka. U nastavku e se koristiti isti XML dokument knjige.xml s tim da e se pretpostaviti da se ne poznaje struktura ovog XML dokumenta. simple_xml_rekurzija.php
<?php function parse_xml_nepoznate_strukture(SimpleXMLElement $element, $nivo = 0){ $uvlacenjeNivo = str_repeat("\t", $nivo); // determine how much we'll indent

10

$vrednost = trim((string) $element); // vraca vrednost elementa, koristimo f-ju trim da sklonimo blanko znakove $atributi = $element->attributes(); // vraca sve stribute $deca = $element->children(); // vraca sve podelemente datom elementa (vraca decu) echo "{$uvlacenjeNivo}Element '{$element->getName()}'...".PHP_EOL; // ispisuje vrednost ako postoji, ali ako nema dece if(count($deca) == 0 && !empty($vrednost)){ echo "{$uvlacenjeNivo}Vrednost: {$element}".PHP_EOL; } // prikazi atribute samo ako postoje if(count($atributi) > 0){ echo $uvlacenjeNivo.'Ima '.count($atributi).' atributa:'.PHP_EOL; foreach($atributi as $atribut){ echo "{$uvlacenjeNivo}- {$atribut->getName()}: {$atribut}".PHP_EOL; } } // Prikazi decu samo ako ih ima if(count($deca)){ echo $uvlacenjeNivo.'Ima '.count($deca).' dete/decu:'.PHP_EOL.'<br/>'; foreach($deca as $dete){ parse_xml_nepoznate_strukture($dete, $nivo+1); // rekurzivno poyivamo istu f-ju } } } echo $uvlacenjeNivo.PHP_EOL.'<br/>'; // samo pozivamo kako bi ocistili

//ucitavanje xml dokumenta knjige.xml, pretpostavljamo da nam je struktura nepoznata $noviXml = new SimpleXMLElement('knjige.xml', null, true); //pozovemo f-ju koja ce parsirati xml nepoznate strukture parse_xml_nepoznate_strukture($noviXml); ?>

Biblioteka DOM
W3C DOM obezbeuje standardni skup objekata za HTML i XML dokumente, kao i standardni interfejs za pristup i manipulaciju nad njima. W3C DOM podeljen je u razliite delove (Osnocni, XML i HTML) i razliitim nivoima (DOM level 1/2/3).

Core DOM definie standardni skup objekata za pristup struktuiranim dokumentima XML definie standardni skup objekata za XML HTML definie standardni skup objekata za HTML
11

12

Prikaz DOM stabla:

Slika 2. DOM stablo - primer

Da bi se itali ili aurirali (kreiranje i manipulacija) XML dokumenti potreban je XML parser. Postoje dva tipa DOM XML Parsera:

Zasnovano na stablu - Ovaj parser transformie XML dokument u strukturu stabla, analizira ceo dokument i omoguuva pristup elementima stabla. Zasnovano na dogaajima - Vidi XML dokument kao seriju dogaaja. Kada se desi neki dogaaj poziva se odreena funkcija.

DOM XML Parser je deo PHP jezgra. Nisu potrebne nikakve instalacije za korienje ove biblioteke.

XML DOM je:

Standardni objektni model za XML Standardni programski interfejs za XML W3C standard.

XML DOM definie objekte i svojstva svih XML elemenata, kao i metode kojima se pristupa. Drugim reima, XML DOM predstavlja nain kako mogu da se kreiraju, menjaju ili briu XML elementi. Vie informacija o DOM XML-u moete nai na sledeoj adresi: http://www.php.net/manual/en/book.dom.php
13

DOM XML itanje XML dokumenta i prikaz


Prikaz xml fajla poruke.xml
<?xml version="1.0" encoding="UTF-8"?> <poruka> <za>Janko Jankovic</za> <od>Aleksandar Nastevski</od> <naslov>Podsetnik</naslov> <sadrzaj>Nemoj zaboraviti da idemo na fudbal za vikend!</sadrzaj> </poruka>

Cilj je da se proe kroz navedeni xml fajl i prikau podaci, koristei DOM XML. Fajl: dom.php
<?php //kreira se novi DOMDocument objekat $xmlDoc = new DOMDocument(); //ucitava se xml fajl u DOMDocument objekat $xmlDoc->load("poruke.xml"); //stampa se sadrzaj xml objekta print $xmlDoc->saveXML(); ?>

Kreira se novi DOMDocument objekat, potom u njega se uitava xml fajl poruke.xml i na kraju pretvara xml dokument u string i prikazuje na ekranu. Kao rezultat izvravanja gore navedenog fajla dobie se prikaz sadraja XML fajla poruke.xml.
Janko Jankovic Aleksandar Nastevski Podsetnik Nemoj zaboraviti da idemo na fudbal za vikend!

14

U narednom primeru proi e se kroz ceo xml fajl i prikazati svi elementi xml fajla koristei DOMDocument objekat.
<?php //kreira se DOMDocument objekat $xmlDoc = new DOMDocument(); //u xml objekat se ucitava xml fajl $xmlDoc->load("poruke.xml"); //dodeljuje se promenljivoj koreni element $x = $xmlDoc->documentElement; //prolazi se kroz petlju tako sto se ispisuje informacija o podelementima foreach ($x->childNodes AS $item){ print $item->nodeName . " = " . $item->nodeValue . "<br />"; } ?>

U ovom primeru moe se primetiti kao izlaz na ekranu prikazuju se prazni tekst vorovi izmeu svakog elementa. Kada se generie, XML esto sadri prazne karaktere izmeu vorova. XML DOM parser ih tretira kao elemente i ponekad ako niste svesni da postoje, mogi napraviti velike probleme, zato prilikom prolaska kroz niz potrebno je odstraniti prazne karaktere.

DOM XML Kreiranje XML dokumenta i modifikacija


U narednom delu kreirae se XML fajl uz pomo DOMDocument objekta. Potreno je kreirati poetni kao i sve ostale vorove koji su dosad bili u gore navedenom xml dokumentu knjige.xml. Fajl dom.php
<?php //kreiranje XML stringa i XML dokumenta koriscenjem DOM-a $dom = new DomDocument('1.0'); //dodaje se koreni element $knjige = $dom->appendChild($dom->createElement('knjige')); //dodaje se element <knjiga> u korenom elementu <knjige> $knjiga = $knjige->appendChild($dom->createElement('knjiga')); //dodaje se <naslov> element u <knjiga> $title = $knjiga->appendChild($dom->createElement('naslov')); //dodaje se elementu <naslov> sadrzaj cvora $title->appendChild($dom->createTextNode('PHP XML skripta')); //dodaje se <autor> element u <knjiga>

15

$autor = $knjiga->appendChild($dom->createElement('autor')); //dodaje se elementu <autor> sadrzaj cvora $autor->appendChild($dom->createTextNode('Aleksanar Nastevski')); //dodaje se <izdavaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('izdavaoc')); //dodaje se elementu <izdavaoc> sadrzaj cvora $izdavaoc->appendChild($dom->createTextNode('FON')); //dodaje se <izdavacenaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('cena')); //dodaje se elementu <cena> sadrzaj cvora $izdavaoc->appendChild($dom->createTextNode('50')); //kreira se xml sadrzaj $dom->formatOutput = true; // cuva se XML kao string ili fajl $testString = $dom->saveXML(); // dodeljuje se string promenljivoj $dom->save('knjige.xml'); // cuva se XML u fajlu knjige.xml ?>

Kao rezultat dobija se kreiran xml fajl knjige.xml koji izgleda ovako:
<?xml version="1.0"?> <knjige> <knjiga> <naslov>PHP XML skripta</naslov> <autor>Aleksanar Nastevski</autor> <izdavaoc>FON</izdavaoc> <cena>50</cena> </knjiga> </knjige>

16

DOM XML Obrada i uitavanje XML fajla preko AJAX-a


Sledei primer pokuzuje kako je mogue obraditi XML fajl u JavaScriptu koristei AJAX. Bie prikazane dve verzije primera, u prvoj verziji XML fajl e biti direktno uitan sa nekog eksternog izvora, dok u drugoj verziji XML fajl e biti kreiran uz pomo DomDocument biblioteke i potom uitan preko AJAX-a. I u jednoj i u drugoj verziji XML fajl e biti obraen u JavaScriptu, tj koristei document objekat. Sadraj XML fajla knjige.xml
<?xml version="1.0"?> <knjige> <knjiga> <naslov>PHP XML skripta 1</naslov> <autor>Aleksanar Nastevski</autor> <izdavaoc>FON</izdavaoc> <cena>50</cena> </knjiga> <knjiga> <naslov>PHP XML skripta 2</naslov> <autor>Aleksanar Nastevski</autor> <izdavaoc>FON</izdavaoc> <cena>50</cena> </knjiga> <knjiga> <naslov>PHP XML skripta 3</naslov> <autor>Aleksanar Nastevski</autor> <izdavaoc>FON</izdavaoc> <cena>50</cena> </knjiga> </knjige>

Sadraj fajla prikaz_knjiga.html


<html> <head> <script type="text/javascript" src="obrada_knjige.js"></script> <title>Primer parsiranja xml-a fajla preko JavaScripta</title> </head> <body> <form> Klikni na dugme kako bi prikazali spisak svih knjiga <input type="button" name="prikazi" value="Prikazi knjige preko PHP obrade" onclick="prikaziSpisakKnjiga()"> <input type="button" name="prikazi" value="Prikazi knjige direktno sa XML dokumenta" onclick="prikaziSpisakKnjigaXML()"> </form> <div id="prikazKnjiga"><b>Ovde ce biti prikazane knjige.</b></div> </body></html>

17

Prikaz JavaScript obrada_knjige.js

fajla

kome

biti

obraen

XML

dokument:

//ucitavanje xml fajl-a koji je generisao php function prikaziSpisakKnjiga(){ //prilikom ucitavanja, na pocetku postavlja se obavestenje da se xml fajl ucitava document.getElementById("prikazKnjiga").innerHTML = 'Molimo Vas sacekajte...'; //ucitavanje xml fajl preko AJAX-a if (window.XMLHttpRequest){ xhttp=new XMLHttpRequest(); }else { // for IE 5/6 xhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET","obrada.php",false); xhttp.send(); //xmlDoc objektu dodljuje se xml fajl koji je ucitan xmlDoc=xhttp.responseXML; //uzimanje vrednost koliko knjiga postoje u xml fajlu x=xmlDoc.getElementsByTagName("knjige")[0].nodeName; brojKnjiga = xmlDoc.getElementsByTagName("knjiga").length; var i; var text = ''; //prolazi se kroz petlju koliko ima knjiga for( i = 0; i < brojKnjiga; i++ ){ text += 'Knjiga broj: '+(i+1)+'<br/>'; //uzimaju se elementi var naslov = xmlDoc.getElementsByTagName("naslov")[i]; var autor = xmlDoc.getElementsByTagName("autor")[i]; var izdavaoc = xmlDoc.getElementsByTagName("izdavaoc")[i]; var cena = xmlDoc.getElementsByTagName("cena")[i]; //uzimanje vrednosti datog elementa //nodeName - vraca naziv elementa //childNodes[0].nodeValue - vraca vrednost odredjenog cvora text += naslov.nodeName + ': ' + naslov.childNodes[0].nodeValue + '<br/>'; text += autor.nodeName + ': ' + autor.childNodes[0].nodeValue + '<br/>'; text += izdavaoc.nodeName + ': ' + izdavaoc.childNodes[0].nodeValue + '<br/>'; text += cena.nodeName + ': ' + cena.childNodes[0].nodeValue + '<br/><br/>'; } //obradjen xml fajl prikazujemo u div tagu document.getElementById("prikazKnjiga").innerHTML = text;

//ucitavanje direktnog xml fajla function prikaziSpisakKnjigaXML(){ document.getElementById("prikazKnjiga").innerHTML = 'Molimo Vas sacekajte...'; if (window.XMLHttpRequest){ xhttp=new XMLHttpRequest(); }else { // for IE 5/6

18

xhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xhttp.open("GET","knjige.xml",false); xhttp.send(); xmlDoc=xhttp.responseXML; x=xmlDoc.getElementsByTagName("knjige")[0].nodeName; brojKnjiga = xmlDoc.getElementsByTagName("knjiga").length; var i; var text = ''; for( i = 0; i < brojKnjiga; i++ ){ text += 'Knjiga broj: '+(i+1)+'<br/>'; var var var var naslov = xmlDoc.getElementsByTagName("naslov")[i]; autor = xmlDoc.getElementsByTagName("autor")[i]; izdavaoc = xmlDoc.getElementsByTagName("izdavaoc")[i]; cena = xmlDoc.getElementsByTagName("cena")[i]; += += += += naslov.nodeName + ': ' + naslov.childNodes[0].nodeValue + '<br/>'; autor.nodeName + ': ' + autor.childNodes[0].nodeValue + '<br/>'; izdavaoc.nodeName + ': ' + izdavaoc.childNodes[0].nodeValue + '<br/>'; cena.nodeName + ': ' + cena.childNodes[0].nodeValue + '<br/><br/>';

} document.getElementById("prikazKnjiga").innerHTML = text;

text text text text

Prikaz fajla koji generie novi xml dokument koristei DOMDocument biblioteku: obrada.php
<?php //kreiranje XML stringa i XML dokumenta koriscenjem DOM-a $dom = new DomDocument('1.0'); //dodaje se koreni element $knjige = $dom->appendChild($dom->createElement('knjige')); //dodaje se element <knjiga> u korenom elementu <knjige> $knjiga = $knjige->appendChild($dom->createElement('knjiga')); //dodaje se <naslov> element u <knjiga> $title = $knjiga->appendChild($dom->createElement('naslov')); //dodaje se elementu <naslov> sadrzaj cvora $title->appendChild($dom->createTextNode('PHP XML skripta')); //dodaje se <autor> element u <knjiga> $autor = $knjiga->appendChild($dom->createElement('autor')); //dodaje se elementu <autor> sadrzaj cvora $autor->appendChild($dom->createTextNode('Aleksanar Nastevski')); //dodaje se <izdavaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('izdavaoc')); //dodaje se elementu <izdavaoc> sadrzaj cvora

19

$izdavaoc->appendChild($dom->createTextNode('FON')); //dodaje se <izdavacenaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('cena')); //dodaje se elementu <cena> sadrzaj cvora $izdavaoc->appendChild($dom->createTextNode('50')); //dodaje se element <knjiga> u korenom elementu <knjige> $knjiga = $knjige->appendChild($dom->createElement('knjiga')); //dodaje se <naslov> element u <knjiga> $title = $knjiga->appendChild($dom->createElement('naslov')); //dodaje se elementu <naslov> sadrzaj cvora $title->appendChild($dom->createTextNode('PHP XML skripta')); //dodaje se <autor> element u <knjiga> $autor = $knjiga->appendChild($dom->createElement('autor')); //dodaje se elementu <autor> sadrzaj cvora $autor->appendChild($dom->createTextNode('Aleksanar Nastevski')); //dodaje se <izdavaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('izdavaoc')); //dodaje se elementu <izdavaoc> sadrzaj cvora $izdavaoc->appendChild($dom->createTextNode('FON')); //dodaje se <izdavacenaoc> element u <knjiga> $izdavaoc = $knjiga->appendChild($dom->createElement('cena')); //dodaje se elementu <cena> sadrzaj cvora $izdavaoc->appendChild($dom->createTextNode('50')); //kreira se xml sadrzaj $dom->formatOutput = true; // cuva se XML kao string ili fajl $testString = $dom->saveXML(); // dodeljuje se string promenljivoj $dom->save('knjige2.xml'); // cuva se XML u fajlu knjige2.xml if ( stristr($_SERVER["HTTP_ACCEPT"],"application/xhtml+xml") ) { header("Content-type: application/xhtml+xml;charset=utf-8"); } else { header("Content-type: text/xml;charset=utf-8"); } echo $testString; ?>

Xpath biblioteka
Xpath biblioteka je reenje za pronalaenje informacija unutar XML dokumenata. XPath koristi izraze pronai elemente, atribute i druge
20

informacije u XML-u. Ako postoji XML dokument sa gomilom knjiga, kao i dece i atributa, moe se iskoristiti Xpath kako bi na jednostavan i lak nain pronali eljeni elementi u samo jednoj liniji koda. Da bi koristili Xpath potrebno je da se predhodno dobro poznaje XML. U primerima koristii se xml fajl koji je definisan ranije knjige.xml. Pretraga po elementima - / Da bi pronali neki element koritei Xpath koristi se naziv elementa kao i sle(kosa crta) /. Npr ako se eli pronai element knjiga, dovoljno je samo da prosledi 'knjiga', dok ako se eli da se pronau naslovi knjiga onda treba da se ukuca knjiga/naslov. Jednostavno, navodi se putanja do onog elementa koji se eli pronai.
knjige/knjiga/naslov

Pretraga po atributima - @ Atributi nekog elementa se pretrauju na slian nain kao i elementi samo to se u ovom sluaju koristi znak @. Da bi se pronali neki element po atributu treba da navede putanja isto kao I do sada, tj treba dodatno da se nave jo i atribut po kome se pretrauje. U nastavku e biti prikazano kako se pretrauje knjiga po ISBN broju:
knjige/knjiga@isbn

Apsolutne putanje Pretraivanje na osnovu apsolutne putanje moe nekada biti veoma korisno. Ova mogunost daje prostor da se navede kompletna putanja do nekog vora. Kada se koriste apsolutne putanje mora da se navede koreni element XML dokumenta, u ovom primeru to je koreni element knjige. Ako se eli pretraivati po korenom elementu, onda je dovoljno da se navede knjige Meutim, ako se eli pretraivati neki podelement onda putanja mora da izgledati ovako (pretraivanje po naslovu):
knjige/knjiga/naslov

Relativne putanje

21

Xpath izrazi mogu biti kreirani korienjem i relativnih putanja, odnosno moe se navesti putanja od eljenog elementa. Ovo omoguava i da se dobiju svi elementi nekog tipa. Npr ako se eli da se pronau svi naslovi dovoljno je da se navede sledee:
naslov

Pretraga po potomcima - // Kosom crtom se razdvajaju roditelja od dece, meutim kada se stave dve kose crte dobija se sasvim druga mogunost. Pomenuti izraz se koristi za izbor potomaka datog elementa:
knjiga//naslov

Pretraga po roditelju - .. Kada se eli da se pretrauje po roditeljima onda se navode dve take. Dakle, odreenom elementu, pa onda njegovom roditelju uzimaju se svi elementi.
naslov/..

Pretraga po specijalnim karakterima * Doker znak Doker predstavlja specijalni karakter u programiranju koji oznaava da se izabere sve. Korienjem ovog znaka, Xpath izraz moe da uzme vie od jednog elementa.
knjiga/naslov/*

Pretraga po vie izbora - | znak za ili Znak ili oznaava da se moe istovremeno kombinovati vie izraza kao jedan.
knjiga/naslov | knjiga/autor

Pretraga po ogranienjima / [] Prilikom pretraivanja, mogu da se koristr Ogranienja se navode unutar zagrada [].
knjiga/*/[cena>20]

odreena

ogranienja.

22

SimpleXML i Xpath
Primer itanja xml dokumenta korienjem SimpleXML biblioteke kao i Xpath biblioteke za olakano pretraivanje xml dokumenata. U narednom primeru bie prikazano kako da se dobiju samo naslovi iz xml dokumenta koji je korienjen u predhodnim primerima knjige.xml i potom da se na ekranu prikau naslovi jedan ispod drugog. Prikaz fajla: naslovi.php
<?php // uitavanje SimpleXML objekta $knjige = new SimpleXMLElement('knjige.xml', null, true); //kreiranje xpath izraza $naslovi = $knjige->xpath('knjiga/naslov'); foreach($naslovi as $naslov){ echo $naslov.'<br/>'; } ?>

Rezultat na ekranu je sledei:


Internet tehnologije Elektornsko poslovanje PHP XML skripta

Primer pretraga atributa: Prolazak kroz XML dokument korienjem Xpath biblioteke i ispisiavnje ISBN brojeva svih knjiga.
<?php // uitavanje SimpleXML objekta $knjige = new SimpleXMLElement('knjige.xml', null, true); //kreiranje xpath izraza $isbnArray = $knjige->xpath('knjiga/@isbn'); foreach($isbnArray as $isbn){ echo $isbn.'<br/>'; } ?>

Rezultat na ekranu je sledei:


978-1594489501 978-1594489502 978-1594489503

23

DOM XML i Xpath


Xpath se moe koristiti u kombinaciji sa DOM XML parserom. Kao to je u predhodnim primerima predstaljeno kako se Xpath kombinuje sa SimpleXML klasom, tako e i sada na primeru biti pokazano kako se uz korienje ove klase moe veoma jednostavno obraditi odreeni xml dokumnet. Primer: Xml dokumentu knjige.xml eli da se doda svakoj knjizi jos jedan element , a to je broj strana koliko knjiga ima. Potrebno je da proita predhodno xml dokument i kreira za svaku knjigu novi element.

Dodavanje novog elementa


Koristi se Xpath dom_xpath_novi.php za pretraivanje. Prikaz sadraja fajla:

<?php //kreiranje niza, gde knjiga sa odredjenim isbn-om ima odredjeni broj strana // isbn => broj strana $broj_strana = array( '978-1594489501' => '384', '978-1594489502' => '352', '978-1594489503' => '784', ); //kreiranje dom objekat $dom = new DOMDocument(); //ucitavanje xml dokumneta u objekat $dom->load('knjige.xml'); //kreiranje xpath objekta $xpath = new DOMXPath($dom); //pretrazivanje svih knjiga $knjige = $xpath->query('knjiga'); //prolazak kroz sve knjige i dodavanje broj strana foreach($knjige as $knjiga){ $knjiga->appendChild($dom->createElement('broj_strana', >getAttribute('isbn')])); } //cuvanje nove verzije xml dokumenta $dom->save('knjige2.xml'); ?>

$broj_strana[$knjiga-

Kao rezultat dobie se novi xml dokument sa nazivom knjige2.xml u kome e svaka knjiga pored ostalih elementa imati i element broj_strana.
24

Promena podataka
Za ilustraciju ovog primera koristi e se xml fajl koji se i dosad koristio (knjige.xml). Potrebno je proiriti predhodni primer primer tako to e se podatak o autoru zameniti, odnosno na kraju e se dodati podatak o web sajtu www.myelab.net koji e stojati pored imena autora. U ovom primeru ovo nema previe smisla, ali kada se radi sa realnim podacima koji mogu biti i veliine na hiljade rekorda, onda je jednostavnije da se napie skripta koja e zameniti ljudski faktor da promeni te podatke. Prikaz fajla: dom_xpath_promena.php
<?php //kreiranje DOM objekta $dom = new DOMDocument(); //ucitava se xml fajl u DOM objekat $dom->load('knjige.xml'); //kreira se xpath objekat, koji ce omoguciti pretrazivanje po autorima $xpath = new DOMXPath($dom); //pise se xpath izraz da pronadjeu elementi autori $autori = $xpath->query('knjiga/autor'); //prolazi se kroz autore foreach($autori as $autor){ $a = $autor->nodeValue; // uzima se vrednost cvora, tj vrednost elementa autor $autor->nodeValue = $a.' , www.myelab.net'; //cvoru autor dodaje se nova vrednost } //cuva se nova verzija xml fajla $dom->save('knjige3.xml'); ?>

Kao rezultat dobija se novi xml fajl knjige3.xml u kome je promenjena vrednost voru autor.
<?xml version="1.0" encoding="UTF-8"?> <knjige> <knjiga isbn="978-1594489501"> <naslov>Internet tehnologije</naslov> <autor>Katedra za elektronsko poslovanje , www.myelab.net</autor> <izdavac>FON</izdavac> <cena>20</cena> </knjiga> <knjiga isbn="978-1594489502"> <naslov>Elektornsko poslovanje</naslov> <autor>Katedra za elektronsko poslovanje , www.myelab.net</autor> <izdavac>FON</izdavac> <cena>15</cena> </knjiga> </knjige>

25

Brisanje podataka
Brisanje nekog elementa iz xml fajla je veoma jednostavno uz korienje DOMDocument biblioteke kao i Xpath biblioteke za pretraivanje. U sledeem primeru bie pokazano kako se moe izbrisati neki element, konkretno u ovom sluaju eli se da se obrie element cena koji se nalazi u okviru elementa knjiga, a da potom se dodaju novi elementi nabavna cena i prodajna cena, gde e prodajna cena biti za 5 vea od nabavne. dom_xpath_brisanje.php
<?php //kreiranje DOM objekta $dom = new DOMDocument(); //ucitavanje xml fajl u DOM objekat $dom->load('knjige.xml'); //kreira se xpath objekat $xpath = new DOMXPath($dom); //pise se xpath izraz da pronadje autor $knjige = $xpath->query('knjiga'); //prolazi se kroz sve autor foreach($knjige as $knjiga){ //uzima se element pod nazivomo cena, smesteni su u nizu, pristupa se prvom elementu niza $cena = $knjiga->getElementsByTagName('cena')->item(0); $nabavnaCena = $cena->nodeValue; // uzima se vrednost elementa cena $prodajnaCena = intval($nabavnaCena) + 5; //brise se element cena $knjiga->removeChild($cena); //kreiraju se novi elementi nabavna i prodajna cena sa novim vrednostima $knjiga->appendChild($dom->createElement('nabavna_cena', $nabavnaCena)); $knjiga->appendChild($dom->createElement('prodajna_cena', $prodajnaCena)); } //cuva se nova verzija xml fajla $dom->save('knjige4.xml'); ?>

26

Kao rezultat izvravanja ove skripte dobija se novi xml fajl pod nazivom knjige4.xml koji izgleda ovako:
<?xml version="1.0" encoding="UTF-8"?> <knjige> <knjiga isbn="978-1594489501"> <naslov>Internet tehnologije</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac> <nabavna_cena>20</nabavna_cena> <prodajna_cena>25</prodajna_cena></knjiga> <knjiga isbn="978-1594489502"> <naslov>Elektornsko poslovanje</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac> <nabavna_cena>15</nabavna_cena> <prodajna_cena>20</prodajna_cena> </knjiga> <knjiga isbn="978-1594489503"> <naslov>PHP XML skripta</naslov> <autor>Katedra za elektronsko poslovanje</autor> <izdavac>FON</izdavac> <nabavna_cena>25</nabavna_cena> <prodajna_cena>30</prodajna_cena> </knjiga> </knjige>

Crvenom bojom su oznaeni novo kreirani elementi u xml fajlu.

27

Prikaz podatka uz korienje Google Chart API-a


Google Chart API je web servis koji omoguava da se na veoma jednostavn nan kreiraju grafikoni koji potom mogu biti ukljueni u sopstvene web prezentacije. Pomenuti web servis funkcionie tako to se Google-u alje odreen http zahtev, koji na osnovu parametara koje mu se proslede generie grafikon u obliku slike. Dokumentacija kao i veliki broj primera dostupni su na sledeoj adresi: http://code.google.com/apis/chart/docs/making_charts.html Primer prikaza odreenih grafikona moete se videti na sledeim slikama:

Primer http zahteva koji se alje izgleda ovako:


http://chart.apis.google.com/chart?cht=p3&chs=250x100&chd=t:60,40&chl=Hello|World

Kao rezultat iznad navedenog http zahteva dobija se sledea slika:

28

29

HTTP zahtev moe se kreirati runo ili uz pomo Google Chart Wizard-a koji omoguava na jednostavn nain, uz veoma dobar interfejs, da se generiu HTTP zahtevi. Wizard se nalazi na sledeoj adresi http://code.google.com/apis/chart/docs/chart_wizard.html i poeljno je da se na poetku koristi kako bi se prouila dokumentacija, a potom da se runo menjaju odreena podeavanja. HTTP zahtev je mogui poslati preko GET ili POST metode. Dostupan je veliki broj razliitih tipova grafikona koje ovaj servis podrava. Primer: Kreiranje aplikacije koja koristi Google Chart API za prikaz podataka. Aplikacija obezbedjuje grafiki prikaz 3 najjeftinija proizvoda za prodavnicu koja se izabere iz padajueg menija, gde se na grafikonu prikazuje naziv i cena proizvioda. Za potrebe primera kreirana je baza pod nazivom webservis, kreirane su dve tabele, tabela prodavnica i tabela proizvodi. SQL kod za kreiranje i popunjavanje tabela se nalazi u prilogu:
CREATE TABLE IF NOT EXISTS `prodavnice` ( `id` int(11) NOT NULL AUTO_INCREMENT, `naziv` varchar(255) CHARACTER SET utf8 NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; INSERT INTO `prodavnice` (`id`, `naziv`) VALUES (1, 'Zara'), (2, 'Legend'); CREATE TABLE IF NOT EXISTS `proizvodi` ( `id` int(11) NOT NULL AUTO_INCREMENT, `naziv` varchar(255) NOT NULL, `cena` varchar(255) NOT NULL, `prodavnica_id` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ; INSERT INTO `proizvodi` (`id`, `naziv`, `cena`, `prodavnica_id`) VALUES (1, 'Trenerka', '2300', 1), (2, 'Jakna', '4500', 1), (3, 'Kosulja', '3200', 1), (4, 'Kapa', '1900', 1), (5, 'Farmerice', '2400', 2), (6, 'Kosulja', '2200', 2), (7, 'Kaput', '6000', 2), (8, 'Rukavice', '1200', 2);

30

Za rad aplikacije potrebno je da se napie skripta koja e se konektovati na MySQL bazu. U prilogu je predstavljen saraj fajla konekcija.php koja se nalazi u lib folderu. lib/konekcija.php
<?php if (!$db=mysql_connect("localhost", "kadrovi", "kadrovi")) { die ("<b>Spajanje na mysql server je bilo neuspeno</b>"); } if (!mysql_select_db("webservis", $db)) { die ("<b>Greka pri odabiru baze</b>"); } ?>

Prilikom izrade primera korieni su objekti u PHP-u. Kreiran je model prodavnica koji obezbeuje manipulaciju sa podacima iz baze koje se tiu prodavnice. class/Prodavnica.php
<?php class Prodavnica { //vraca prodavnicu za prosledjeni ID prodavnice function getProdavnicu($id){ $sql="SELECT * FROM prodavnice WHERE id = '".$id."'"; if (!$q=mysql_query($sql)){ echo "Nastala je greska pri izvodenju upita<br>" . mysql_query(); die(); } if (mysql_num_rows($q)==0){ echo "Nema prodavnice"; }else { while ($red=mysql_fetch_array($q)){ return $red; } } } //vraca sve prodavnice iz baze function getProdavnice(){ $niz = array(); $sql="SELECT * FROM prodavnice"; if (!$q=mysql_query($sql)){ echo "Nastala je greska pri izvodenju upita<br>" . mysql_query(); die();

31

} if (mysql_num_rows($q)==0){ echo "Nema prodavnice"; }else { while ($red=mysql_fetch_array($q)){ $niz[$red['id']] = $red['naziv']; } } return $niz;

//vraca 3 najjeftinija proizvoda za ID prodavnice koji je prosledjen function getTriNajJeftinijaProizovoda($prodavnicaId){ $niz = array(); $sql = "SELECT * FROM proizvodi WHERE prodavnica_id = '".intval($prodavnicaId)."' ORDER BY cena ASC LIMIT 0,3"; if (!$q=mysql_query($sql)){ echo "Nastala je greska pri izvodenju upita<br>" . mysql_query(); return false; } if (mysql_num_rows($q)==0){ return false; }else { while ($red=mysql_fetch_array($q)){ $niz[$red['naziv']] = $red['cena']; } } return $niz; } } ?>

32

Da bi olakali i kreirali na neki nain dinamiki HTTP zahtev kreirana je biblioteka GoogleDijagram koja omoguava olakano kreiranje HTTP zahteva za generisanje dijagrama. Biblioteka prihvata niz proizvoda odreene prodavnice, kao i naziv prodavnice i na osnovu tih podataka kreira HTTP zahtev. U prilogu je prikazan sadraj GoogleDijagram biblioteke. class/GoogleDijagram.php
<?php class GoogleDijagram { //promenljive koje su potrebne za rad var $url; var $proizvodString; var $cenaString; var $nazivProdavnice; //konstruktor koji inicijalizuje pocetne podatke function __construct($nazivProdavnice, $proizvodi = array()) { //proizvod naziv => cena $this->kreirajStringNazivProizvoda($proizvodi); $this->nazivProdavnice = $nazivProdavnice; } function getNazivProdavnice(){ return $this->nazivProdavnice; } function getProizvodString(){ return $this->proizvodString; } function getCenaString(){ return $this->cenaString; } //f-ja koja kreira html tag za sliku za prosledjene podatke function createImage($nazivProdavnice, $nazivProizvodaString, $cenaString){ //primer kreiranja Google Chart Http zahteva za dobijanje dijagrma //izabran je sama jedan tip dijagrama $img = '<img src="http://chart.apis.google.com/chart? chs=600x310&cht=p3&chco=7777CC|76A4FB|3399CC|3366CC&chd=s:MSf&chdl='. $nazivProizvodaString.'&chdlp=l&chp=0.2&chl='.$cenaString.'&chma=| 10&chtt=3+najjeftinija+proizvoda+-+Prodavnica+'.$nazivProdavnice.'" width="560" height="310" alt="'.$nazivProdavnice.' - 3 najjeftinija proizvoda" />'; return $img; } //vraca dijagram, odnosno html tag slike gde je kreiran dijagram function getDijagram(){ return $this->createImage($this->getNazivProdavnice(), $this->getProizvodString(), $this->getCenaString());

33

} //na osnovu niza koji je prosledjen, kreira se string za potrebe generisanja http zahteva za dobijanje dijagrama function kreirajStringNazivProizvoda($proizvodi = array()){ $nazivString = ''; $cenaString = ''; foreach($proizvodi as $naziv => $cena){ $nazivString .= $naziv.'|'; $cenaString .= $cena.'|'; } //brisemo poslednju uspravnu crtu koja je dodata $nazivString = substr($nazivString, 0, -1); $cenaString = substr($cenaString, 0, -1); //dodeljujemo vrednost odredjenim promenljivama $this->proizvodString = $nazivString; $this->cenaString = $cenaString;

} } ?>

Sada je potrebno da se kreira forma gde e u padajuoj listi biti prikazane sve prodavnice i klikom na dugme Prikazi proizvde preko AJAX-a biti pozvana GoogleDijagram bibloteka koja generie Google Chart dijagram i vraa html tag slike koja e biti prikazana. Slika e biti prikazana u odreenom div tagu. U prilogu je dat sadraj fajla index.php. index.php
<?php //ucitavanje potrebnih biblioteka require_once('class/Prodavnica.php'); include('lib/konekcija.php'); echo '<script type="text/javascript" src="obrada.js"></script>'; //kreiranje nove instance objekta prodavnica $prodavnica = new Prodavnica(); $prodavnice = $prodavnica->getProdavnice(); ?> <!-- Kreiranje padajuceg menija --> <select name="prodavnica_id" id="prodavnica_id"> <?php foreach($prodavnice as $id => $naziv){?> <option value="<?php echo $id;?>"><?php echo $naziv; ?></option> <?php } ?> </select> <input type="button" onclick="prikaziProizovode()"> <br/><br/> name="trazi" value="Prikazi proizovde"

34

<div id="prikaz_dijagrama">Ovde ce biti prikazan dijagram!</div>

35

Za obradu korien je JavaScript kao i AJAX tehnologija koja u pozadini vraa rezultat sa servera, odnosno generisani dijagram sa relevantnim podacima koji se na kraju prikazje u vidu slike. U prilogu je dat prikaz sadraja fajla obrada.js. obrada.js
var xmlHttp function prikaziProizovode(){ //uzimao id prodavnice za koju zelimo da prikazemo dijagram var id = document.getElementById('prodavnica_id').value; xmlHttp=GetXmlHttpObject() if (xmlHttp==null){ alert ("Browser does not support HTTP Request") return } //preko ajaxa dobijamo odgovor o http zahtevu koji zahtevamo var url="obrada.php"; url=url+"?id="+id; url=url+"&sid="+Math.random(); xmlHttp.onreadystatechange=srediPrikaz xmlHttp.open("GET",url,true) xmlHttp.send(null) } function srediPrikaz(){ if (xmlHttp.readyState==4){ //kada je ucitan odgovor, prikazemo odgovor u odredjenom div tagu document.getElementById("prikaz_dijagrama").innerHTML = xmlHttp.responseText; } } function GetXmlHttpObject(){ var xmlHttp=null; try{ // Firefox, Opera 8.0+, Safari xmlHttp=new XMLHttpRequest(); }catch (e){ //Internet Explorer try{ xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); } catch (e){ xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); } } return xmlHttp; }

obrada.php
<?php

36

//ucitavanje potrebnih biblioteka require_once('class/GoogleDijagram.php'); require_once('class/Prodavnica.php'); include('lib/konekcija.php'); //uzimanje id prodavnice za koju zelimo da dobijemo rezultat if(!isset ($_GET['id'])){ return false; } $id = $_GET['id']; //kreiramo novu instancu klase prodavnica $prodavnica = new Prodavnica(); $prod = $prodavnica->getProdavnicu($id); $nazivProdavnice = $prod['naziv']; //uzimamo iz baze 3 najjeftinija proizvoda $proizvodi = $prodavnica->getTriNajJeftinijaProizovoda($id); //kreramo HTTP zahtev koristeci GoogleDijagram biblioteku, mi smo je kreirali $dijagram = new GoogleDijagram($nazivProdavnice, $proizvodi); //stampanje dijagrama, vraca tag za sliku gde je umetnut odgovarajuci HTTP zahtev echo $dijagram->getDijagram(); ?>

37

Kao rezultat kada se pokrene aplikaciia, dobija se dijagram koji je prikazan na sledeoj slici:

38

Literatura
Vie informacija o ovoj temi moete pronai na sledeim linkovima:

http://www.php.net/manual/en/refs.xml.php , poslednja poseta 15.12.2010. http://www.tizag.com/xmlTutorial/ , poslednja poseta 15.12.2010. http://www.w3schools.com/xml/ , poslednja poseta 15.12.2010.

39

You might also like