Documente Academic
Documente Profesional
Documente Cultură
net/publication/310846228
CITATIONS READS
0 791
1 author:
Liviu Serbanescu
Hyperion University
31 PUBLICATIONS 33 CITATIONS
SEE PROFILE
Some of the authors of this publication are also working on these related projects:
All content following this page was uploaded by Liviu Serbanescu on 27 November 2016.
004.738.5
Liviu ŞERBĂNESCU
Editor-şef:
prof. univ. dr. Mihai POSTOLACHE
Universitatea ,,Politehnica” din Bucureşti
Referent:
prof. univ. dr. Albeanu GRIGORE
Universitatea Europei de Sud-Est Lumina
I.Introducere............................................................................................................... 4
1.Etape în dezvoltarea aplicațiilor software............................................................4
1.1.Analiza...............................................................................................................................5
1.2.Proiectarea.........................................................................................................................5
1.3.Implementarea (dezvoltarea codului sursă)................................................................5
1.4.Testarea..............................................................................................................................5
1.5.Mentenanța.......................................................................................................................5
2.Modele de dezvoltare a software-ului...................................................................5
2.1.Modelul în cascadă...........................................................................................................6
2.2.Modelul incremental........................................................................................................6
2.3.Modelul prototip...............................................................................................................7
2.4.Modelul în spirală............................................................................................................7
II.Implementarea aplicațiilor pe partea de client..................................................9
1.Noțiuni introductive HTML....................................................................................9
1.1.Structura HTML...............................................................................................................9
1.2.Legături între pagini........................................................................................................9
1.3.Liste în HTML................................................................................................................10
1.4.Tabele în HTML.............................................................................................................10
1.5.Formulare în HTML......................................................................................................12
2.Introducere în limbajul JavaScript.......................................................................16
2.1. Convenții de sintaxa....................................................................................................16
2.2.Adăugarea JavaScript într-o pagina HTML.............................................................17
2.3.Variabile...........................................................................................................................18
2.4. Operatori........................................................................................................................18
2.5.Operatorul typeof...........................................................................................................19
2.6.Instrucțiuni condiționale..............................................................................................20
2.7.Instrucțiuni ciclice.........................................................................................................22
2.8.Funcții JavaScript...........................................................................................................25
3. Despre obiectele JavaScript.................................................................................26
3.1.Obiecte JavaScript predefnite.....................................................................................27
3.2.Modelul Obiectului Document (DOM)......................................................................28
3.3.Obiecte de nivel 3 și 4...................................................................................................28
4.Evenimente JavaScript...........................................................................................33
5.Cookie-uri.................................................................................................................34
6.Obiecte defnite de utilizator în JavaScript........................................................35
6.1.Defnire obiecte prin utilizarea funcțiilor.................................................................35
6.2.Obiecte defnite literal...................................................................................................36
6.3.Obiecte ce utilizeză mecanismul singleton...............................................................37
6.4.Constructori în JavaScript............................................................................................37
6.5.Moștenirea în JavaScript..............................................................................................38
6.6.Specifcatori de acces....................................................................................................40
6.7.Date și funcții de tip static...........................................................................................41
III.Implemementarea aplicațiilor pe parte de server - Noțiuni introductive
PHP............................................................................................................................ 42
1.Variabile PHP...........................................................................................................43
1.1.Tipuri de variabile..........................................................................................................44
1.2.Variabile predefnite......................................................................................................46
1.3.Vizibilitatea variabilelor................................................................................................47
1.4.Variabile statice..............................................................................................................47
1.5.Variabile referință..........................................................................................................48
1.6.Funcții de tipul typeof...................................................................................................48
2.Funcții în php...........................................................................................................50
2.2.Valorile returnate de funcţii.........................................................................................51
2.3.Numere aleatoare...........................................................................................................52
2.4.Funcția de rotunjire.......................................................................................................52
3.Instrucţiuni de decizie............................................................................................53
3.1.Instrucţiunea if...............................................................................................................53
3.2.Instrucţiunea switch......................................................................................................54
4.Implementarea structurilor repetitive (ciclice)..................................................57
4.1. Implementarea structurilor ciclice cu test iniţial - Instrucţiunea for.................57
4.2.Implementarea structurilor ciclice cu test iniţial - Instrucţiunea while..............58
4.3.Implementarea structurilor ciclice cu test fnal - Instrucţiunea do while...........59
4.4.Instrucţiunile break și continue..................................................................................59
5.Lucrul cu șiruri........................................................................................................60
6.Sesiuni PHP..............................................................................................................61
IV.Introducere în transferul de date client-server...............................................63
1.Preluarea datelor din formularele HTML..........................................................63
1.1.Verifcarea datelor introduse în formular..................................................................63
2.Conexiunea cu bazele de date (conexiunea cu PostgreSQL)..........................64
3.Noțiuni introductive despre AJAX......................................................................67
3.1.Metode din cadrul obiectului XMLHtpRequest......................................................68
3.2.Exemplu...........................................................................................................................69
V.Exemplu privind accesarea bazelor de date PostgreSQL din cadrul
framework-ului qooxdoo......................................................................................... 72
1.Dezvoltarea pe partea de server - dezvoltarea claselor PHP în vederea
2
comunicației prin RPC...............................................................................................72
2.Dezvoltarea pe partea de client – dezvoltarea interfeței prin utilizarea
claselor qooxdoo..........................................................................................................76
2.1.Noțiuni introductive privind crearea scheletului unei aplicații qooxdoo...........77
2.2.Descrierea codului aplicației ”untabelpg”.................................................................77
VI.Aplicație – Construcția unei hărți pentru dispersie......................................85
1.Formulare cerințe....................................................................................................85
2.Analiza aplicației.....................................................................................................85
2.1.Preluarea și mixarea celor două imagini...................................................................85
2.2.Preluarea datelor din fșierul de tip log – aplicație de tip desktop.......................85
2.3.Preluarea datelor din fșierul de tip log – aplicație de tip WEB...........................86
3.Proiectarea aplicației..............................................................................................86
3.1.Diagrama de secvență...................................................................................................88
3.2.Diagrama de colaborare................................................................................................89
3.3. Diagrama activităților..................................................................................................89
3.4.Diagrama stărilor...........................................................................................................91
4.Implementarea aplicației.......................................................................................92
4.1.Clasa ”dsp.Application”................................................................................................92
4.2.Clasa ”dsp.wharta”.........................................................................................................92
4.3.Clasa ”dsp.wsharta”.....................................................................................................100
4.4.Clasa ”dsp.wdharta”....................................................................................................107
5.Testarea aplicației..................................................................................................111
Bibliografe.............................................................................................................. 112
ANEXE.................................................................................................................... 113
Operatori javascript/php..........................................................................................113
Harta obținută............................................................................................................115
3
I.Introducere
I. Introducere
Ingineria aplicațiilor aplică principiile și tehnicile din informatică,
inginerie, și analiză matematică în proiectarea, dezvoltarea, testarea și evaluarea
sofware-ului dezvoltat.
În ingineria dezvoltării aplicațiilor se utilizează unelte specializate în
analiza, proiectarea, dezvoltarea și testarea aplicațiilor, în scopul măririi
productivității. Acestea sunt cunoscute sub acronimul C.A.S.E. (Computer Aided
Sofware Engineering).
Printre obiectivele ingineriei dezvoltării aplicațiilor putem menționa:
➔ Mentenabilitatea - ușurința cu care pot fi realizate modifcări într-o unitate
funcțională, cu scopul de a fi îndeplinite anumite cerințe prescrise;
➔ Corectitudinea - măsura în care sofware-ul îndeplinește cerințele sale
specifce;
➔ Reutilizabilitatea - măsura în care un modul de cod poate fi utilizat în mai
multe aplicații;
➔ Testabilitatea - măsura în care sofware-ul poate fi testat și evaluat;
➔ cu privire la aceste criterii.
➔ Fiabilitatea - măsura în care un sofware își îndeplinește corect funcțiile
pentru care a fost proiectat;
➔ Portabilitatea - ușurința cu care sofware-ul poate fi portat pe un alt
echipament de calcul sau mediu de lucru;
➔ Adaptabilitatea - ușurința cu care sofware-ul permite noi modifcări
rezultate din noi cerințe ale clientului.
4
1 . E t a p e î n d e z v o l t a r e a a p l i c a ț i i l o r s o f tw a r e
5
2 . M o d e l e d e d e z v o l t a r e a s o f tw a r e - u l u i
Analiză
Proiectare
Implementare
Testare
Mentenanță
Fig. I.-1. Modelul în cascadă
În acest model intrările unei faze sunt ieşirile alteia. Feedback-ul este
generat de erorile ce apar în faza următoare.
Dacă se utilizează modelul în domenii mai puţin cunoscute, pot interveni
costuri mari, antrenate de înţelegerea eronată a cerinţelor, fapt ce apare într-o
etapă târzie, de aceea la nivel conceptual este necesară utilizarea unor prototipuri
în fazele iniţiale ale ciclului de viaţă.
2.2. Modelul incremental
Etapele fnale se realizează în mai mulţi paşi succesivi, fapt ce permite
obţinerea de mai multe versiuni ale produsului sofware
6
2.2.Modelul incremental
(A)
(P)
FUNCȚIONALITĂȚI
(I)
(T)
(M)
Increment #n
(A)
(P)
(I)
(T)
(A) (M) Increment #2
(P)
(I)
(T)
(M) Increment #1
timp
7
2 . M o d e l e d e d e z v o l t a r e a s o f tw a r e - u l u i
Proiectare Analiză
Implementare
Testare + Evaluare
8
II.Implementarea aplicațiilor pe partea de client
9
1.Noțiuni introductive HTML
10
1.4.Tabele în H TML
<body>
<table border="1" cellpadding="10" cellspacing="15" width="100%">
<tr>
<td align="left">CELULA 1 1</td>
<td align="right">date in celula 2</td>
<td align="middle">date in celula 3</td>
</tr>
<tr>
<td align="middle">date in celula 4</td>
<td align="middle">date in celula 5</td>
<td align="middle">date in celula 6</td>
</tr>
<tr align="right">
<td>date in celula 7</td>
<td>date in celula 8</td>
<td>date in celula 9</td>
</tr>
</table>
</body>
</html>
Ex2:
<html>
TABELE
<table border="1" bgcolor="#0facf">
<tr>
<td bgcolor="#adcdf"> A1 </td>
<td> A2</td>
<td colspan="2"> A3</td>
</tr>
<tr>
<td>B1 </td>
<td> B2</td>
<td> B3</td>
</tr>
<tr bgcolor="#adadf">
<td> C1</td>
<td> C2</td>
<td> C3</td>
</tr>
<tr>
<td>D1 </td>
<td rowspan="2"> D2</td>
11
1.Noțiuni introductive HTML
<td> D3</td>
</table>
</html>
Ex3:
<HTML>
<HEAD>
</HEAD>
<BODY>
TEST <B> ABC </B> <BR/> 123
<BR/>
<!-- un comentariu -->
<TABLE BORDER="1" bgcolor="#3176694">
<TR> <TD>A11</TD> <TD>A12</TD> <TD>A13</TD> </TR>
<TR> <TD>A21</TD> <TD>A22</TD> <TD>A23</TD> </TR>
</TABLE>
<!--ancora -->
<a href="www.qooxdoo.org"> O indirectare (legatura -- link) </a>
</BODY>
</HTML>
12
1.5.Formulare în HTML
"Action" este adresa URL a unui script afat pe un server WWW, care
primește datele formularului, efectuează o prelucrare a lor și expediează
către utilizator un răspuns. Script-urile server side (aplicația de pe server)
pot fi scrise în limbaje precum: C, PHP, Unix shell, Java etc.
2 Atributul "Method" precizează metoda utilizată de browser pentru
expedierea datelor formularului. Sunt posibile următoarele valori:
2.1 "Get" (valoarea implicită). În acest caz, datele din formular sunt
adăugate la adresa URL precizată de atributul Action. Nu sunt permise
cantități mari de date (maxim 1 Kb), iar între adresa URL și date este
inserat simbolul "?"
2.2 "Post". În acest caz, datele sunt expediate separat. Sunt permise
cantități mari de date (de ordinul MB).
JavaScript a fost dezvoltat prima dată de către frma Netscape, cu numele
de Live Script, un limbaj de script care extindea capacitățile HTML. Acesta adaugă
dinamism în paginile web.
1.5.2. Formulare cu un câmp de editare și un buton de expediere
Majoritatea elementelor unui formular sunt defnite cu ajutorul etichetei
<input>. Pentru a preciza tipul elementului se foloseste atributul "type" al
etichetei <input>. Pentru un câmp de editare, acest atribut primește valoarea
"text". Alte atribute pentru un element <input> sunt:
Atributul "name" permite atașarea unui nume fecarui element al
formularului;
Atributul "value" permite atribuirea unei valori inițiale, unui element al
formularului.
Un buton de expediere al unui formular se introduce cu ajutorul etichetei
<input>, în care atributul "type" este confgurat la valoarea "submit". Acest
element poate primi un nume prin atributul "name".
Pentru elementul <input> de tipul câmp de editare (type= "text"), alte
două atribute pot fi utile:
Atributul "size", ce specifcă lățimea câmpului de editare. Dacă textul
introdus în câmp de utilizator depășește această lățime, atunci se execută
automat o derulare a conținutului acestui câmp;
Atributul "maxlength", ce specifcă numarul maxim de caractere pe care le
poate primi un câmp de editare; caracterele tastate peste numărul maxim
sunt ignorate.
Butoanele radio permit alegerea, la un moment dat, a unei singure
variante de răspuns din mai multe posibile. Butoanele radio se introduc prin
eticheta <input> cu atributul " type" având valoarea "radio".
Ex:
<html>
13
1.Noțiuni introductive HTML
<head><title>form exemplu</title></head>
<body><H2>Un formular cu butoane radio</H2>
<hr>
<form action="ex: apel functie JavaScript" method="post">
Selectie 1:<input type="radio" name="var1" value="x1"><br>
Selectie 2:<input type="radio" name="var1" value="x2"><br>
<input type="reset"> <input type="submit">
</form></body>
</html>
În momentul expedierii formularului se va transmite una dintre perechile
"var1=x1" sau "var1=x2", în funcție de alegerea realizată de utilizator.
1.5.3. Casete de validare
O casetă de validare (checkbox) permite selectarea sau deselectarea unei
opțiuni. Pentru inserarea unei casete de validare se utilizează eticheta <input> cu
atributul "type" confgurat la valoarea "checkbox".
Observații:
- fecare casetă poate avea un nume defnit prin atributul "name".
- fecare casetă poate avea valoarea prestabilită "selectat", defnită prin atributul
"checked".
Ex1:
<html><head></head>
<body>
<form>
<input type="text" name="E1" value="1234"></input>
</br>
<textarea>.........A.......</textarea>
</br>
<input type="checkbox" id="36"> selectie </input>
</br>
<input type="radio" id="41"> selectie </input>
<input type="radio"> alta selectie </input>
</br>
<input type="buton" value="Apasa"> </input>
</br>
<select name="select">
<option>Optiune 1</option>
<option>Optiune 2</option>
</select>
</form>
</body>
</html>
14
1.5.Formulare în HTML
Ex2:
<HTML><BODY>
<FORM>
<p> a= <input type="text" name="E1"/></p>
<p> b= <input type="text" name="E2"/> </p>
<p> verifcat: <input type="checkbox" name="CB"></input>
<p> O1: <input type="radio" name="RB" id="R1"></input>
<p> O2: <input type="radio" name="RB" id="R2"></input>
<p> <select name="select" size="3">
<option>Optiune 1</option> <option>Optiune 2</option>
<option>Optiune 3</option> <option>Optiune 4</option>
</select></p>
<p> <select name="select" >
<option>Optiune 1</option> <option>Optiune 2</option>
<option>Optiune 3</option> <option>Optiune 4</option>
</select></p>
<br/>
<input type="buton" value="APASA"></input>
<input type="reset" value="Renunta"></input> <input type="submit"
value="Trimite"></input>
</FORM>
</BODY></HTML>
Fiecare control din cadrul form-ului poate avea un identifcator (id)
și/sau nume(name). Numele controalelor se pot repeta (de exemplu, la butoanele
radio unde numele stabilește gruparea acestora, însă identifcatoarele controalelor
sunt unice.
15
2.Introducere în limbajul JavaScript
16
2.1. Convenții de sintaxa
17
2.Introducere în limbajul JavaScript
Ex:
<html>
<head>
<script type="text/javascript">
function f1(a1) { alert(a1); }
</script>
</head>
<body>
<form>
<input type="buton" onclick="f1('ABC!')" value="LITERE" />
<input type="buton" onclick="f1('123!')" value="CIFRE" />
</form>
</body>
</html>
De obicei funcțiile sunt defnite în secțiunea de header sau în fșiere
separate de tipul JS.
2.3. Variabile
2.3.1. Tipuri de variabile
Spre deosebire de alte limbaje (cum sunt Pascal, Java sau C), JavaScript nu
are tipuri de date predefnite, adică permite schimbarea tipului unei variabile în
cadrul scriptului.
De exemplu:
var x = "xyz"; x = 8;
2.3.2. Durata de viață a unei variabile
O variabilă scrisă sau declarată în cadrul unei funcții este o variabilă
locală; aceasta este vizibilă doar în cadrul acelei funcții, când se iese din funcție
variabila este distrusă. Astfel o altă funcție poate declara și folosi o variabilă cu
același nume. JS (JavaScript) tratează cele două variabile ca find diferite.
Se pot declara și variabile în afara oricarei funcții, care să fe folosite de
toate funcțiile. Acestea se numesc variabile globale și sunt vizibile de la
încărcarea paginii web până la închiderea acesteia, în orice script de tip JS.
2.4. Operatori
Pentru a lucra cu datele introduse într-un script și a manipula valorile
variabilelor se folosesc operatori.
Operatorii sunt simboluri și identifcatori care determina felul în care
sunt modifcate datele și modul în care este evaluată o combinație de expresii și
variabile.
18
2.4. Operatori
JavaScript recunoaște:
- operatori binari - care necesită existentă a doi operanzi în expresie,
- operatori unari - care au nevoie doar de un operand.
Operatorii sunt de mai multe tipuri:
- Operatori aritmetici,
- Operatori de atribuire,
- Operatori de comparare,
- Operatori logici (numiți și booleeni),
- Operatori string (sau șiruri),
- Operatori typeof,
- Operator condițional “?”,
- Operatori pentru funcții,
- Operatori pentru structuri de date.
Operatorii din JavaScript sunt asemănători cu cei din limbajul C și cei din
limbajul PHP explicați în Anexă.
Ex:
<html> <head>
<script type="text/javascript">
function f2(a,b) {
var a1,b1;
a1=parseFloat(a);
b1=parseFloat(b);
alert(a1+b1);
/*var x,y,z; x=E1.value; y=E2.value; */
E3.value=a1+b1;
}
</script>
</head>
<body>
<form>
<p> a= <input type="text" id="E1"/></p>
<p> b= <input type="text" id="E2"/> </p>
<input type="buton" onclick="f2(E1.value,E2.value)" value="adunare" />
<p> a+b= <input type="text" id="E3"/> </p>
</form>
</body> </html>
19
2.Introducere în limbajul JavaScript
Dacă a=5 iar b='5' operatorul == întoarce true, în timp ce operatorul ===
intoarce false.
2.6. Instrucțiuni condiționale
2.6.1. Instrucțiunea "if"
Forma generală a acestei instrucțiuni este următoarea:
if (condiție) {
// codul care va f executat dacă este adevărată condiția
},
unde 'condiție' poate fi orice expresie logică. Dacă rezultatul condiției este TRUE,
se execută codul dintre acolade; în caz contrar, când condiția returnează FALSE,
se trece peste acest cod.
Precum și în limbajul C, FALSE corespunde cu ZERO “curat”, iar tot ce
este diferit de zero reprezintă TRUE.
2.6.2. Instrucțiunea "if ... else"
Forma generală a instrucțiunii "if ... else" este următoarea:
if (condiție) {
//codul care va f executat dacă este adevărată conditia
} else { // codul care va f executat dacă conditia este falsa },
unde 'condiție' poate fi orice expresie logică. Dacă rezultatul condiției este
TRUE, se execută codul dintre primele acoladele, care aparțin de if; în caz contrar,
când condiția returnează FALSE, sunt executate comenzile din a doua grupă de
acolade (după else).
TRUE FALSE
if (<expresie>)
instr.1 instr.1
20
2.6.Instrucțiuni condiționale
switch (expresie) {
case valoare1:
// cod executat dacă expresie = valoare1
break
case valoare2:
// cod executat dacă expresie = valoare2
break
case valoare3:
// cod executat dacă expresie = valoare3
break
..........................................
default ://in caz contrar se execută default
// cod executat dacă expresie este diferit de valoare1, valoare2 sau valoare3
}
La început este evaluată expresia scrisă între parantezele rotunde, apoi
valoarea expresiei este comparată pe rând cu fecare valoare determinată de
"case". Dacă se găsește o identitate, se execută codul asociat acelui "case", iar în
fnal iese din instrucțiunea "stwitch".
default
case
test expresie
instrucţiune m
instrucţiune 1
break
instrucţiune 2
break
instrucţiune n
21
2.Introducere în limbajul JavaScript
22
2.7.Instrucțiuni ciclice
evaluare <expresie1>
(de obicei iniţializare contori)
FALSE
evaluare <expresie2>
TRUE
Instrucţiune 1
(blocul instr. for)
evaluare <expresie3>
(de obicei incrementare contori)
23
2.Introducere în limbajul JavaScript
WHILE
evaluare <expresie>
FALSE
TRUE
Instrucţiune 1
(blocul instr)
24
2.7.Instrucțiuni ciclice
instr1 altfel se iese din buclă; se testează din nou valoarea expresiei. Se repetă
execuţia instrucţiunii instr1 atâta timp cât valoarea expresiei are valoarea de
adevăr TRUE. În cazul instrucţiunii do twhile, corpul ciclului se execută cel puţin
o dată.
Instrucţiune 1
(blocul instr.)
DO WHILE
evaluare <expresie> TRUE
FALSE
25
2.Introducere în limbajul JavaScript
26
3. Despre obiectele JavaScript
27
3. Despre obiectele JavaScript
conține anumite elemente, cum ar fi de exemplu bara de stare, bara de titlu etc .
În fereastra browser-ului putem încărca /afșa un document HTML, iar
pagina din interiorul browser-ului este un obiect document.
3.2. Modelul Obiectului Document (DOM)
DOM defnește o structură standardizată a documentelor. Structura DOM
este reprezentată de o ierarhie de obiecte compatibilă cu limbajul JavaScript.
Ierarhia obiectelor este:
0. Fereastra curentă:
1. self, window, parent, top,
2. navigator,
3. frames,
4. location,
5. history,
6. document:
6.1. forms[] (butons, checkbox, hidden, radio, password,
reset, select, submit, text, textarea, fleupload),
6.2. anchors[],
6.3. links[],
6.4. images[],
6.5. embeds[],
6.6. layer[]
etc.
Elementele principale legate de lucrul pe partea de client din JavaScript se
axează pe ceea ce putem face cu paginile HTML, mai exact - ceea ce poate realiza
vizitatorul cu scriptul JavaScript încărcat în pagina HTML.
Primul set de obiecte are o legătură cu navigatorul și cu etichetele HTML
din acesta. Majoritatea obiectelor JavaScript din nivelul 2 sunt văzute ca obiecte
corespondente etichetelor HTML:
Buton - <input type="buton">; Checkbox - <input type="checkbox">;
Fileupload - <input type="fle">; Password - <input type="passtword">;
Radio - <input type="radio">; Reset - <input type="reset">; Select - <select>;
Frame - <frame>; Document - <body>; Layer - <layer> sau <ilayer>;
Link - <a href="">; Image - <img> Area - <map>; Anchor - <a name="">;
Plugin - <embed>; Form - <form>; Submit - <input type="submit">;
Text - <input type="text">; Textarea - <textarea>; Option - <option>
3.3. Obiecte de nivel 3 și 4
Obiectele de nivelul 3 sunt subobiecte ale obiectului "Form". La fel cum
sunt imbricate elementele HTML în interiorul etichetelor <form>, aceste obiecte
28
3.3.Obiecte de nivel 3 și 4
29
3. Despre obiectele JavaScript
30
3.3.Obiecte de nivel 3 și 4
31
3. Despre obiectele JavaScript
32
3.3.Obiecte de nivel 3 și 4
4. Evenimente JavaScript
Evenimentele sunt elemente importante în construcția interfețelor
grafce. Acestea sunt acțiuni provocate de cele mai multe ori de vizitatorul
paginii. Dacă vizitatorul apasă un buton din pagină, este generat evenimentul
Click. Dacă mouse-ul este deasupra unui link, se declanșează un eveniment
MouseOver. JavaScript poate reacționa la unele evenimente. Aceasta se poate
realiza cu ajutorul "event-handlers" (managerii de evenimente). Handlerele de
evenimente se adaugă ca atribute ale etichetelor HTML.
Principalele evenimente:
• onClick - Se execută la execuția unui click pe un obiect(document, link,
buton, checkbox, buton radio, buton reset sau submit);
• onDblClick - Execută acțiunea la efectuarea a două clickuri unul după
altul, fără a deplasa mouse-ul;
• on MouseOver - Acționează când se poziționează mouse-ul deasupra
unui link sau unei imagini;
• onMouseOut - Acționează când se mută mouse-ul de pe un hiperlink sau
imagine;
• onMouseMove - Acționează când se mișcă mouse-ul;
• onMouseDotwn - Acționează când este apăsat unul din butoanele
mouse-ului, pe un document, buton sau link;
• onMouseUp - Acțiunea se execută atunci când este eliberat unul din
33
4.Evenimente JavaScript
butoanele mouse-ului;
• onFocus - Acțiunea apare atunci când este activat un obiect de tipul:
caseta password, câmp text, bloc de text, câmp FileUpload etc. dintr-un
formular HTML.
• onChange - Acțiunea apare atunci când se modifcă conținutul unui
câmp dintr-un formular HTML (o parolă, text, bloc de text, FileUpload
etc.) și când acesta pierde focalizarea (selecția);
• onBlur - Este inversul lui onFocus(), este declanșat atunci când un obiect
nu mai este activ, prin trecerea la o altă resursă;
• onLoad - Acționează atunci când browserul a terminat de încărcat un
document, imagine sau toate frame-urile.
5. Cookie-uri
Valorile majorității variabilelor dintr-un script dispar atunci când
fereastra browser-ului este închisă. Spre deosebire de acestea, valorile variabilelor
cookie se pot păstra un timp indefnit. Pentru ca valorile lor să se poată păstra,
browser-ul utilizatorului stochează variabilele cookie în unitatea de hard-disc a
utilizatorului. Astfel, cookie-urile sunt fșiere care conțin diferite date despre un
anumit site vizitat și valori de variabile, salvate pe calculatorul vizitatorului. Un
cookie constă, în principal, dintr-o pereche nume = valoare, iar caracteristici
mai avansate permit stabilirea unei date de expirare și pot stabili un sistem de
management al acestora.
Unul dintre avantajele folosirii fșierelor cookie este persistența acestora.
Un fșier cookie poate persista luni de zile (sau ani), simplifcând vizitele
ulterioare ale utilizatorului pe site deoarece informațiile referitoare la vizite și
preferințele utilizatorului sunt salvate și preluate din cookie de fecare dată când
va reveni la site.
Fișierele de tip cookie sunt utile când sunt folosite cu JavaScript, deoarece
JavaScript are funcții pentru citirea, adăugarea și editarea fșierelor cookie.
Browserul poate fi setat pentru un anumit tip de management al acestor
fșiere, astfel se pot impune restricții privind dimensiunea și numărul de fșiere
cookie care pot fi stocate, iar fșierele cookie mai noi pot suprascrie pe cele vechi.
Când un utilizator trece de la un browser la altul, fșierele cookie salvate
de un browser nu sunt recunoscute de celălalt .
Cele mai multe browsere stochează informațiile cookie în fșiere text
necriptate, de aceea informațiile private precum parole, numere personale nu
trebuie stocate direct într-un cookie.
Utilizatorul poate confgura browserul astfel încât să interzică stocarea
informațiilor de tip cookie. În unele cazuri, acest lucru are ca rezultat
nefuncționalitatea aplicației.
34
5.Cookie-uri
35
6.Obiecte defn ite de utilizator în JavaScript
alert(pers1.getTelInfo());
</script>
</body></html>
Pentru a defni proprietăți și metode pentru un obiect creat folosind
funcții, se utilizează cuvântul cheie this.
Funcția getTelInfo() poate fi defnită și în afara obiectului prin utlizarea
cuvântului cheie prototype.
<!DOCTYPE html>mult
<html><body>
<script type="text/javascript">
function Persoana (nume) {
this.nume = nume;
this.varsta = 50;
}
Persoana.prototype.getTelInfo = function()
{ return this.nume + ' ; ' + this.varsta + ' ; 01xxxxxx';}
36
6.2.Obiecte defn ite literal
<script type="text/javascript">
var pers1={
nume : 'Ionescu',
varsta : 51,
getTelInfo : function()
{ return this.nume + ' ; ' + this.varsta + ' ;
01xxxxxx';}
}
pers1.nume = 'Popescu';
alert(pers1.getTelInfo());
</script>
</body></html>
37
6.Obiecte defn ite de utilizator în JavaScript
var sir;
var pers1 = new Persoana('Pers1');
if(pers1 instanceof Persoana) sir='pers1 este de tip Persoana';
else sir='pers1 este nedefnit';
alert(sir);
</script>
</body></html>
Modifcarea constructorilor este ilustrată în exemplul următor, exemplu
care va afșa ”pers1 este de tip Vehicul”.
<!DOCTYPE html>
<html><body>
<script>
function Vehicul(marca){
this.marca = marca;
}
function Persoana(nume){
this.nume = nume;
return new Vehicul('dacia');
}
var sir;
var pers1 = new Persoana('Pers1');
if(pers1 instanceof Persoana) sir='pers1 este de tip Persoana';
else if (pers1 instanceof Vehicul) sir='pers1 este de tip Vehicul';
else sir='pers1 este nedefnit';
alert(sir);
</script>
</body></html>
38
6.5.Moștenirea în JavaScript
Animal.apply(this, arguments);
this.alearga = function(){
alert('Acest caine, pe nume '+this.nume+', alearga!');}
}
var catel = new Caine('Grivei');
catel.alearga();
</script>
</body></html>
Proprietatea nume nu apare decât în obiectul părinte. Doar constructorul
din obiectul părinte inițializează proprietatea nume cu valoarea transmisă prin
argument. Metoda apply asigură apelul costructorului din obiectul părinte.
O altă modalitate de a declara o moștenire este prin utilizarea __proto__ ,
refiefată în exemplul următor.
<!DOCTYPE html>
<html><body>
<script>
function Animal(nume) {
this.nume = nume;
this.alearga = function() {
alert('Un animal '+this.nume+' alearga!');
}
}
function Caine(nume){
var rasa;
this.nume=nume;
this.alearga = function(){
alert('Acest caine, pe nume '+this.nume+', alearga!');
}
}
Caine.__proto__ = Animal;
//identic cu a scrie Caine.prototype = Animal;
var catel = new Caine('Grivei');
alert(catel.nume);
catel.alearga();
</script>
</body></html>
De asemenea prin:
caine = Object.create(animal);
este creat obiectul caine , fără conținut, ce moștenește proprietățile obiectului
animal. În acest caz moștenirea este valabilă doar pentru proprietăți și nu pentru
funcții.
Asemeni funcțiilor virtuale din limbajul C++, este permisă redeclararea
39
6.Obiecte defn ite de utilizator în JavaScript
40
6.6.Specifc atori de acces
41
III.Implemementarea aplicațiilor pe parte de server
- Noțiuni introductive PHP
42
III.Implemementarea aplicațiilor pe parte de
server - Noțiuni introductive PHP
echo "Acesta este un script PHP";
?>
Funcția echo este folosită pentru afșarea informațiilor delimitate de
ghilimele. Similară funcției echo este funcția print.
În situația în care scriptul nu este scris corect, PHP-ul va afșa eroarea
indicând și locul unde aceasta apare. Erorile sunt afșate doar dacă serverul este
setat corespunzător (în fșierul php.ini este setat display_errors=On și
error_reporting=E_ALL).
Ex: în interiorul scriptului se pot insera și etichete HTML
<?php
echo "Acesta este un script <b>PHP</b><br>care contine si etichete HTML";
?>
Ex: fșierul PHP poate conține între etichetele <html> și </html> blocuri PHP
delimitate de <?php ?>
<html>
<head> <title>Ex</title>
</head>
<body>
Bloc HTML<br>
<?php
echo "Bloc PHP";
?>
</body>
</html>
În PHP există trei metode prin care se poate adăuga un comentariu.
Tot ce urmează dupa caracterele // sau # este considerat comentariu. De ex:
// Urmează un comentariu în PHP
# Urmează un comentariu în PHP
Utilizare:
echo "test"; // browser-ul va afșa test
echo "proba"; # browser-ul va afșa proba
Un comentariu format din mai multe linii este incadrat de /* și */. De ex:
/* Comentariul în PHP
scris pe doua linii */
1. Variabile PHP
43
1.Var i a b i le P H P
salvată într-o baza de date. În php numele dat variabilei începe cu simbolul $
urmat de orice literă mica (a-z) sau mare (A-Z) sau cu caracterul _ , dar niciodată
cu o cifră și nu poate conține spații goale. De ex: $nume_variabila
$nume_variabila="valoare"
Ex: atribuim variabilei $program valoarea PHP și apoi o tipărim
<?php
$program="PHP";
echo $program;
?>
Modifcând valoarea variabilei, se modifca ceea ce este afșat de browser.
Într-un script se pot folosi mai multe variabile care pot fi adăugate în aceeași
construcție echo.
Ex:
<?php
$ziua="01";$luna="12";$anul="2012";
echo "Data este ".$ziua.".".$luna.".".$anul;
?>
44
1.1.Tipuri de variabile
$nume="Ion";
$varsta=24;
echo "Numele persoanei este ".$nume." și are ".$varsta.” ani”;
?>
Cea mai simplă cale pentru a specifca un șir este să îl încadrăm între
ghilimele simple/apostrof ('), dar eventualele ghilimele simple conținute vor fi
precedate de caracterul \. În această situație variabilele și caracterele speciale vor
fi ignorate.
echo "acesta este un șir"; //acesta este un șir
echo "variabila $a"; //variabila $a
echo "rand1 \n rand2"; //rând1 \n rând2
Variabila booleană exprimă valoarea de adevăr: TRUE sau FALSE. Orice
valoare diferită de zero sau șir care nu este gol (conține cel putin un caracter) sunt
considerate ca TRUE.
Ca și în limbajul C, valoarea 0 corespunde cu FALSE, iar tot ce este diferit
de zero este TRUE.
Tablouri (array) - acestea utilizează chei sau indecși pentru a identifca
valorile stocate. Un tablou se creează folosind funcția array():
$vector = array('unu','doi','trei');
Ex: creăm un tablou și îi tiparim elementele folosind funcția print_r
<?php
$vector = array('unu','doi','trei');
print_r ($vector);
?>
Ex: utilizăm același tablou, dar folosim funcția var_dump(), care ne arată câte
elemente sunt în tablou și lungimea fecărei valori a sa.
<?php
$vector = array('unu','doi','trei');
var_dump ($vector);
?>
Primul index al unui vector are valoarea 0. Valorile indecșilor pot fi și
declarate manual.
Ex: creăm o matrice cu indecșii 1, 3 și 5
<?php
$ vector = array(1=>'unu',3=>'trei',5=>'cinci');
var_dump ($vector);
?>
Pentru a șterge o pereche cheie/valoare se folosește funcția unset()
unset($vector[2]); //sterge cheia 2 din matrice
45
1.Var i a b i le P H P
46
1. 3.V i z i b i li ta te a var ia b i le lo r
47
1.Var i a b i le P H P
48
1.6.Funcții de tipul typeof
?>
Ex: tipuri de date
<?php
//TIPURI DE DATE
//boolean - 0 false , restul adevărat -0.00000006001 este TRUE
$a=-0.00000006001;
if($a) echo "TRUE <br/>"; else echo "FALSE<br/>";
//integer
$a=-123;
//reale
$a=-343.656;
//șiruri
$a='un sir';
$b=" --- alt sir ce contine și pe a: $a";
echo $a.$b; // concatenare șiruri
$c="<br/> ---".$a." ---- ";
echo $c;
//ARRAY (TABLOURI)
$a=array();
$a[0]=5; $a[2]=7; $a[3]=8; echo("<br/>");
unset($a[2]); // sterge pe $a[2] // unset $a sterge conținutul întregului tablou
for($i=0;$i<4;$i++) echo(" a[$i]=$a[$i]; ");
$a[]=9;
$a["unu"]=10;
echo("<br/>");
for($i=0; $i<11; $i++) echo(" a[$i]=$a[$i]; ");
//echo "a[unu]=".$a["unu"];
//tablouri asociative
echo("<br/>");
$b=array("unu"=>"galben", "doi"=>"verde", 2 => "albastru", "trei" =>3);
echo $b["unu"]; echo" ";
echo $b[2]; echo" "; echo $b["trei"];
//tablou asociativ cu doua dimensiuni
$c=array("t2"=>array(1=>3, 2=>"alb", "negru"=>45, 9=>10),
"s2"=>array("a"=>"r1")
);
echo("<br/>");
echo $c["t2"][2]; echo " ";
echo $c["s2"]["a"];
?>
49
2.Funcții în php
2. Funcții în php
Funcția este o secvență de cod ce poate fi utilizată de mai multe ori în
interiorul scripturilor și este prezentată în script prin declarația acesteia.
Funcția apelată va conține același număr de argumente ca și în declarație.
function f1($arg_1,$arg_2, $arg_n) {
echo "Ex.\n";
return $val;
}
unde:
f1 - este numele funcției,
$arg_1, $arg_2, ... , $arg_n - sunt argumentele funcției,
$val - este valoarea returnată de funcție.
Ex: construim o funcție care adună valorile a două variabile
<?php
function adunare($a,$b) { $suma=$a+$b; return $suma; }
$rezultat=adunare(10,5); echo $rezultat;
?>
Ex: o funcție care generează un tabel HTML cu o singură coloană.
<?php
function tabel($lin)
{echo "<table border=\"1\">\n";
for ($i=0; $i<$lin; $i++)
{echo "<tr><td>rândul ".$i."</td></tr>\n";}
echo "</table>";
}
tabel(10); //tabel cu 10 rânduri
?>
În PHP funcţiile pot fi defnite de către utilizator folosind următoarea
sintaxă:
function numef ($param1, $param2, ..., $paramN)
{ // bloc instrucțiuni }
În PHP o funcţie poate fi defnită oriunde în cadrul script-ului şi în
interiorul unei funcţii poate să apară orice secvenţă validă de cod care include
defnirea de alte funcţii şi defniţii de clase. Argumentele unei funcţii sunt
separate prin virgulă, iar transferul acestora se realizează prin valoare. Pentru ca
funcţia să returneze un rezultat, se utilizează construcţia return care primeşte ca
parametru o expresie care reprezintă valoarea funcţiei. În momentul în care este
întâlnită instrucțiunea return, execuţia funcţiei se încheie.
50
2.Funcții în php
51
2.Funcții în php
52
3.Instrucţiuni de decizie
3. Instrucţiuni de decizie
3.1. Instrucţiunea if
Sintaxa:
if(<expresie>) instr1;
[else instr2;]
unde [ ...] semnifcă faptul că este opţional.
Ramura else este opţională.
TRU FALSE
E if (<expresie>)
instr.1 instr.1
53
3.Instrucţiuni de decizie
?>
Instrucțiunea elseif este o combinație între if și else. În cazul în care
condiția if nu este îndeplinită se introduce elseif care testează încă o condiție.
Dacă nu este îndeplinită a doua condiție, se execută declarația introdusă prin else.
if (conditia1) {
instructiuni executate daca este indeplinita conditia 1;
} elseif (conditia2) {
instructiuni executate daca este indeplinita conditia
2;
} else {
instructiuni executate daca nu este indeplinita
conditia 2;
}
Ex:
<?php
$a=10; $b=15;
if ($a<$b) {
echo "$a<$b";
} elseif ($a==$b) {
echo "$a==$b";
} else {
echo "$a>$b";
}
?>
54
3 . 2 . I n s t r u c ţ i u n e a s tw i t c h
case default
test expresie
instrucţiune m
instrucţiune 1
break
instrucţiune 2
break
instrucţiune n
55
3.Instrucţiuni de decizie
56
4.Implementarea structurilor repetitive (ciclice)
evaluare <expresie1>
(de obicei iniţializare contori)
FALSE
evaluare <expresie2>
TRUE
Instrucţiune 1
(blocul instr. for)
evaluare <expresie3>
(de obicei incrementare contori)
57
4.Implementarea structurilor repetitive (ciclice)
int a = 0;
for( int i = 0; i < 100; i++ ) a++;
int i,j,m,n,a,b;
for( i = 0; i < n; i++)
for( j = 0 ; j < m; j++ )
{ a += i*j;
if( i < j ) b = a; else b =- a;
}
int i = 0, a = 0;
for( ;i < 100; ) { i++; a++; }
evaluare <expresie>
FALSE
TRUE
Instrucţiune 1
(bloc instr.)
58
4.2.Implementarea structurilor ciclice cu test
i n i ţ i a l - I n s t r u c ţ i u n e a tw h i l e
valoarea TRUE (diferită de ZERO), se execută instrucţiunea instr1. Se
reevaluează din nou valoarea expresiei. Dacă ea este tot TRUE, se repetă
instrucţiunea, etc. Astfel, instrucţiunea (corpul ciclului) se repetă atât timp cât
expresie are valoarea de adevăr TRUE. În momentul în care <expresie> are
valoarea de adevăr FALSE (sau egal cu ZERO), se iese din ciclu şi se trece la
următoarea instrucţiune din afara buclei twhile.
În cazul în care la prima evaluare a expresiei, aceasta are valoarea de
adevăr FALSE, corpul instrucţiunii twhile nu va fi executat niciodată.
Instrucţiunea/blocul de instrucțiuni din corpul ciclului while trebuie să
modifce valoarea expresiei, altfel va fi un „ciclu infnit”.
4.3. Implementarea structurilor ciclice cu test fnal -
Instrucţiunea do while
Sintaxa:
do instr1;
while(<expresie>)
Se execută instrucţiunea instr1 sau blocul de instrucţiuni. Se evaluează
apoi <expresie>. Dacă aceasta are valoarea TRUE, se execută din nou instr1 altfel
se iese din buclă. Se testează din nou valoarea expresiei. Se repetă execuţia
instrucţiunii instr1 atâta cât timp valoarea expresiei este TRUE. În cazul
instrucţiunii do twhile, corpul ciclului se execută cel puţin o dată.
Instrucţiune 1
(bloc instr.)
evaluare <expresie>
TRUE
FALSE
59
4.Implementarea structurilor repetitive (ciclice)
5. Lucrul cu șiruri
PHP conține zeci de funcții care lucrează cu șiruri. Această secțiune
descrie câteva funcții frecvent utilizate. Aceste funcții permit construcția unui șir,
eliminarea de secvențe de caractere dintr-un șir, operații de tip trim (eliminare
spații) conversie de șiruri etc.
Ex:
<?php
$s = " Acesta este un șir ";
$n = strlen($s); echo "<br /> Lungimea șirului este: $n";
$n = strlen($trim); echo "<br /> Lungimea șirului este: $n";
$trim = ltrim($s); // Elimina spatiile albe din partea stanga a șirului
$n = strlen($trim); echo "<br /> Lungimea șirului este: $n";
$trim = rtrim($s); // Elimina spatiile albe din partea dreapta a șirului
$n = strlen($trim); echo "<br /> Lungimea șirului este: $n";
$trim = trim($s); // Elimina spatiile albe din ambele parți a șirului
$n = strlen($trim); echo "<br /> Lungimea șirului este: $n";
?>
PHP furnizează patru funcții pentru compararea șirurilor. Fiecare funcție
returnează o valoare al cărei semn determină rezultatul comparației.
Ex:
<?php
$s1 = "abcd"; $s2 = "ABCE";
$rezultat = strcasecmp($s1, $s2);
echo "<br /> Functia strcasecmp a returnat $rezultat";
$rezultat = strcmp($s1, $s2);
echo "<br /> Functia strcmp a returnat $rezultat";
$rezultat = strncasecmp($s1, $s2, 3);
60
5.Lucrul cu șiruri
6. Sesiuni PHP
Sesiunea reprezintă o modalitate prin care PHP păstrează informaţii
atunci când se trece de la o pagină la alta.
Odată cu iniţializarea unei sesiuni, utilizatorul poate păstra anumite
variabile, chiar dacă vizitează în continuare şi alte pagini ale site-ului. În mod
implicit informaţia se păstrează până la închiderea browser-ului sau până în
momentul în care utilizatorul distruge explicit sesiunea curentă.
În momentul în care un utilizator s-a logat la site, PHP atribuie acestuia
un identifcator unic de sesiune: SID. Acest SID este înglobat într-un coockie cu
numele PHPSESSID şi trimis apoi către browserul utilizatorului. Dacă browser-ul
nu suportă cookie-uri sau acestea sunt dezactivate, atunci acest SID este adăugat
la adresa URL. În acelaşi timp, se creează pe server, un fşier cu numele SID. În
continuare, dacă utilizatorul doreşte să stocheze anumite informaţii, acestea vor fi
scrise în fşierul SID de pe server.
61
6.Sesiuni PHP
62
I V. I n t r o d u c e r e î n t ra n s f e r u l d e d a t e c l i e n t - s e r v e r
Eticheta form din HTML are atributele action și method, iar fecare
câmp din formular conține un nume name sau/și un identifcator id. Atributele
sunt:
action indică fșierul care prelucrează datele introduse în formular când
este apăsat butonul Trimite
method indică modul în care datele sunt transmise către server pentru
prelucrare și poate avea valorile:
➔ POST când datele trimise nu sunt vizibile utilizatorului;
➔ GET când datele sunt adăugate la adresa URL.
Metoda POST permite trimiterea unei cantități mai mari de date decât
metoda GET, însă metoda GET este mai rapidă.
name este un atribut care identifcă datele introduse în fecare câmp al
formularului.
Pentru un câmp cu name="nume" și method="POST" fșierul indicat de
action va prelua datele introduse în câmpul "nume" prin: $_POST["nume"];
Ex: formular cu un câmp și scriptul php de preluare a datelor
<!-- t1.html -->
<html><body><form action="t1.php" method="POST">
Nume: <input type="text" name="nume"><br>
<input type="submit" value="Trimite">
</form></body></html>
/* urmează fșierul t1.php */
<?php
$nume=$_POST["nume"];
echo $nume;
?>
63
1.Preluarea datelor din formularele HTML
64
2.Conexiunea cu bazele de date (conexiunea cu
PostgreSQL)
un câmp de tip șir de caractere -b și un câmp cu date de tip întreg -c.
CREATE SCHEMA cs;
CREATE TABLE cs.t1(a serial PRIMARY KEY, b varchar(30), c int);
-- adauga cateva valori în tabel
INSERT INTO cs.t1(b,c) VALUES('A1',10),('A2',11),('A3',13);
Construim un form HTML
<!--fșier ibd1.html -->
<html> <form action="ibd1.php" method="post">
B(text): <input type="text" name="e_b" /> <br/>
C(nr): <input type="text" name="e_c" /> <br/>
<input type="submit" name="b_adauga" value="Adauga" />
</form> </html>
Form-ul conține două controale/etichete de tip text (referite prin numele
e_b și e_c) și un buton de tip ”submit”- b_adauga ce transmite datele din cadrul
form-ului către server.
Acesta va afșa:
//fșier ibd1.php
<?php
error_reporting(E_ALL);ini_set('display_errors', '1');
function conexiune($host,$port,$dbname,$user,$password)
{ //pg_connect - funcție php ptr. conectarea la BD
$conexiune1 = pg_connect ("host=$host port=$port dbname=$dbname
user=$user password=$password") or
die("Nu se poate conecta: " .
pgsql_last_error());
// pgsql_last_error() -- întoarce descrierea erorii, de la serverul PostgreSQL,
//aceasta este concatenată cu șirul din față prin operatorul '.'
return $conexiune1;
}
$cda_sql="select * from cs.t1";
//realizare conexiune
$conexiuneR1 = conexiune ('localhost','5435','postgres','postgres','abcd');
65
2.Conexiunea cu bazele de date (conexiunea cu
PostgreSQL)
//adaugare
$b=$_POST['e_b'];$c=$_POST['e_c'];
pg_query($conexiuneR1,"INSERT INTO c13.t1(b,c)VALUES('".$b."',".$c." );");
//citire tabel
$rezultat = pg_query($conexiuneR1,$cda_sql);
//preluare număr înregistrări
$nr_inregistrari=pg_num_rows($rezultat);
//extrage numărul de câmpuri
$nr_campuri=pg_num_felds($rezultat); echo "Nr.inregistrari: $nr_inregistrari<br/>";
//extrage denumirile primelor trei câmpuri
$c1= pg_feld_name($rezultat,0); $c2= pg_feld_name($rezultat,1); $c3=
pg_feld_name($rezultat,2);
echo "Campurile: $c1 $c2 $c3<br/>";
//extrage datele din rezultatul interogării în tabloul $date_matrice
$date_matrice = pg_fetch_all($rezultat);
//test
echo $date_matrice[1]["b"];//al doilea rând, câmpul b;
//construiește un tabel HTML dinamic
echo" <table border='1'>"; echo"<tr>";
for($i=0;$i<$nr_campuri;$i++)
echo "<td>".pg_feld_name($rezultat,$i)."</td>";
echo"</tr>";
for($i=0;$i<$nr_inregistrari;$i++)
{ echo "<tr>";
for($j=0;$j<$nr_campuri;$j++)
echo "<td>".$date_matrice[$i][pg_feld_name($rezultat,$j)]."</td>";
echo "</tr>";
}
echo"</table>";
?>
66
2.Conexiunea cu bazele de date (conexiunea cu
PostgreSQL)
INTERNET
67
3.Noțiuni introductive despre AJAX
server.
AJAX preia de la server structuri de tip text (plain, XML, HTML) și nu
are importanță limbajul utilizat pe partea de server. Toate script-urile Ajax
folosesc obiectul XMLHtpRequest. Scopul obiectului XMLHtpRequest este de a
permite JavaScript să formuleze cereri HTML și să le trimită către server, în
paralel cu execuția altor cereri.
3.1. Metode din cadrul obiectului XMLHttpRequest
Inițializarea comunicației cu server-ul presupune deschiderea
comunicației prin metoda open. Aceasta are sintaxa:
open(method, url, async)
unde:
method poate fi ”GET” sau ”POST”. Metoda ”GET” este mai rapidă, însă
transferul parametrilor este realizat în clar și prezintă vulnerabilități din
punct de vedere al securității;
url localizează fșierul de pe server ce preia mesajele;
async are valoarea de adevăr true pentru transmisie asincronă și false
pentru transmisie sincronă.
Transmiterea către server a informației este asigurată de către funcția
membră:
send(string)
unde string conține informația de transmis în cazul metodei ”POST” (pentru
metoda ”GET” informația se transmite odată cu locația, în cadrul argumentului
url din metoda open).
Citirea rezultatului pentru transmisia sincronă ( async = false ) se
realizează direct prin citirea proprietății:
responseText / responseXML
din cadrul obiectului XMLHtpRequest, execuția aplicației find blocată până la
obținerea răspunsului.
Citirea rezultatului pentru transmisia asincronă ( async = true ) se
realizează după ce proprietatea status are valoarea 400, iar proprietatea
readyState are valoarea 4.
Valorile posibile pentru proprietatea readyState din cadrul obiectului
XMLHtpRequest sunt:
0 – cerere neinițializată;
1 – este realizată conexiunea cu serverul;
2 – cerere transmisă către server;
3 – cerere în curs de procesare de către server;
4 – cerere fnalizată și răspunsul este fnalizat.
Valorile posibile pentru proprietatea status din cadrul obiectului
68
3.1.Metode din cadrul obiectului XMLHttpRequest
XMLHtpRequest sunt:
200 – OK – adresa a fost găsită;
404 – NOK – adresa nu a fost găsită.
3.2. Exemplu
Sunt preluate două numere și sunt transmise către server, sever ce
întoarce suma acestora. Actualizarea paginii client nu se va face prin reîncărcarea
acesteia în întregime ci doar se actualizează tag-ul ce conține rezultatul.
Exemplul este format din trei fșiere:
ajx1.html conține form-ul ce preia cele două valori și afșează rezultatul
într-un tag cu id-ul rezultat;
ajx2.js conține codul pentru implementare AJAX;
ajx3.php efectuează operația cu cele două numere și transmite rezultatul
către client.
Conținutul fșerului ajx1.html este:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"htp://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- defnește namespase pentru xml -->
<html xmlns="htp://www.w3.org/1999/xhtml">
<head>
<!-- titlul ferestrei -->
<title>Exemplu transfer cu ajutorul AJAX</title>
<!-- preluare funcție ce implementează tehnologiile AJAX -->
<script type="text/javascript" src="ajx2.js"></script>
</head>
<body> <!-- cele două controale de editare -->
A = <input type="text" id="id_A" />
B = <input type="text" id="id_B" />
<br />
<input type="submit" value="Calculeaza" onclick="javascript:calculeaza();" />
<br />
<!-- Afșarea rezultatului cu id-ul rezultat într-un tag de tip paragraf -->
<p id="rezultat" />
</body>
</html>
69
3.Noțiuni introductive despre AJAX
{ var xmlHtp;
if(window.ActiveXObject) // pentru IE
{ try //încearcă execuția
{ xmlHtp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e) //în caz de eșec/eroare
{ xmlHtp = false;
}
}
//Pt browsere compatibile cu mozilla
else
{ try
{ xmlHtp = new XMLHtpRequest();
}
catch (e)
{ xmlHtp = false;
}
}
if (!xmlHtp)
alert("Nu s-a putut crea obiectul XMLHtpRequest!");
else
return xmlHtp;
}
//--------------------------------------------------------------------------------------------
//Explicitarea funcției calculează
function calculeaza()
{ // verifcăm dacă xmlHtp este liber
if (xmlHtp.readyState == 4 || xmlHtp.readyState == 0)
{ //obținem cele două valori ale numerelor
var val_A = document.getElementById('id_A').value;
var val_B = document.getElementById('id_B').value;
/* se execută script-ul php de calcul, valorile se transmit ca paramentri prin
metoda GET*/
xmlHtp.open("GET", "ajx3.php?id_A=" + val_A+"&id_B="+val_B, true);
/*defnim functia care se va ocupa de manipularea rezultatului primit de la
script-ul php */
xmlHtp.onreadystatechange = obtineRezultat;
// trimitem cererea catre server
xmlHtp.send(null);
}
}
//------------------------------------------------------------------------------------------------
//funcția callback care primeste rezultatul de la php - obtineRezultat
70
3.2.Exemplu
function obtineRezultat()
{ // daca rezultatul este obtinut
if (xmlHtp.readyState == 4)
{ // status = 200 =>> cererea a fost rezolvată cu succes
if (xmlHtp.status == 200)
{ // se extrage rezultatul
raspuns = xmlHtp.responseText;
//se modifcă valoarea tag-ului paragraf cu rezultatul
document.getElementById("rezultat").innerHTML = '<b> Suma =' + raspuns
+ '</b>';
}
// altfel Err.
else
{ alert("Eroare comunicare server: " +xmlHtp.statusText);
}
}
}
Calculele se realizează efectiv în fșierul PHP: ajx3.php.
<?php
echo $_GET['id_A']+$_GET['id_B'];
?>
71
V. E x e m p l u p r i v i n d a c c e s a r e a b a z e l o r d e d a t e
P o s t g r e S Q L d i n c a d r u l f r a m e tw o r k - u l u i q o o x d o o
$x = new jevi_clase();
jsonRPCServer::handle($x)
or print 'nici o cerere';
?>
Celălalt fșier asigură formarea și execuția comenzilor SQL. Acesta
cuprinde funcții precum:
function conexiune($host,$port,$dbname,$user,$passtword) –
asigură conectarea cu baza de date ce are parametrii de conexiune dați în cadrul
argumentelor;
function recCount($db_conn,$pageNo,$pageSize,$cda_sql) -
întoarce numărul total de înregistrări;
function sel($db_conn,$pageNo,$pageSize,$cda_sql) - lansează o
72
1.Dezvoltarea pe partea de server - dezvoltarea
claselor PHP în vederea comunicației prin RPC
interogare și întoarce rezultatul corespunzător paginii selectate;
public function selectie($par) - preia comanda pentru selecție
(SELECT), realizează legătura cu serverul de baze de date și construiește
interogarea SQL pentru selecție (SELECT);
public function comanda($par) - preia comanda pentru o operație
SQL de tip INSERT/UPDATE/DELETE, realizează legătura cu serverul de baze de
date și construiește interogarea SQL pentru INSERT/UPDATE/DELETE.
Pentru legătura cu serverul PostgreSQL au fost utilizate funcțiile PHP:
• pg_connect("sir conexiune”) - funcție conectare la serverul PostgreSQL,
întoarce o structură ce conține datele specifce conexiunii;
• pgsql_last_error() - întoarce ultima eroare generată de server;
• pg_query($db_conn, $cda_sql) – lansează comenzile din string-ul
identifcat prin variabila $cda_sql pentru conexiunea dată de variabila
$db_conn, întoarce rezultatul interogării, (rezultatul conține atât datele
rezultate în urma interogării, cât și informații auxiliare rezultatului – de
exemplu denumirile câmpurilor, numărul acestora, tipul de date etc.);
• pg_num_rotws($result) – extrage numărul de înregistrări din variabila
setată în urma apelului funcției pg_query();
• pg_num_felds($result) – extrage numărul de câmpuri din variabila setată
în urma apelului funcției pg_query();
• pg_fetch_result($result, $i, $j) – extrage valoarea din tabloul rezultat
pentru câmpul j și înregistrarea i din rezultatul interogării;
• pg_afected_rotws($result) – întoarce numărul de înregistrări ce au fost
procesate în urma unei comenzi de tip UPDATE sau DELETE.
Fișierul este detaliat în cele ce urmează:
//jevi_clase.php
<?php
/**
* Interfata WEB PostgreSQL
* @*/
error_reporting(E_ALL); ini_set('display_errors', '1');
header('Content-type:text/javascript;charset=UTF-8');
//-------------------------------------------------------------------------------------------
function conexiune($host,$port,$dbname,$user,$password)
{$db_conn=null;
$db_conn = pg_connect("host=$host port=$port dbname=$dbname
user=$user password=$password") or
die("Conectare esuata: " . pgsql_last_error());
return $db_conn;
}
//------------------------------------------------------------------------------------------------
73
1.Dezvoltarea pe partea de server - dezvoltarea
claselor PHP în vederea comunicației prin RPC
//numărul de înregistrări
function recCount($db_conn,$pageNo,$pageSize,$cda_sql)
{$result = pg_query($db_conn,$cda_sql);
//nr. toatal de înreg. în vederea realizării paginației
$totalRec=pg_num_rows($result);
return $totalRec;
}
//-------------------------------------------------------------------------------------------------
---
//funcția de interogare
function sel($db_conn,$pageNo,$pageSize,$cda_sql)
{$retArray=array();
$ax=array();
if($pageSize>0)
{$totalRec=recCount($db_conn,$pageNo,$pageSize,$cda_sql);
//$ax[0]=$totalRec;
if($totalRec<1) return null;
if($totalRec<$pageSize) $nrInreg=$totalRec; else $nrInreg=$pageSize;
if($pageNo<1||$pageNo>ceil(($totalRec/$pageSize))) { $pageNo = 1;}
/* refacerea interogarii doar pentru pagina solicitata de client prin daugarea
comenzilor SQL OFFSET (nr. primei linii din cadrul rezultatului selectat) si LIMIT
(nr. max de inreg ce poate f transmis catre client) */
$sql_ = $cda_sql." OFFSET " . ($pageNo - 1)*$pageSize . " LIMIT " . $pageSize;
}
else
$sql_ = $cda_sql;
//executie interogare fnală
$result = pg_query($sql_);
$eroare=array();
if(!$result)
{$eroare[0]=pg_last_error($db_conn); return $eroare;}
$nrCampuri=pg_num_felds($result);
//if (!$result) { return null;}
//preluarea într-un array a datelor din resursa cu rezultatul
for($i=0;$i<$nrInreg;$i++)
for($j=0;$j<$nrCampuri;$j++)
$ax[$i][$j]=pg_fetch_result($result, $i, $j);
return $ax;
}
//-----------------------------------------------------------------
//NOTA: 1. Nu se pot executa apeluri imbricate ale fct. din clasa serviciu
// 2. NU se pot transmite param. array initializati prin =>
//-------------------------------------------------------------------------------------------------
74
1.Dezvoltarea pe partea de server - dezvoltarea
claselor PHP în vederea comunicației prin RPC
--
class jevi_clase{
//-----------------------------------------------------------------------------------
//test comunicatie server php
public function testphp($p)
{$c=array();
$c[0]=$p[0]+$p["unu"]; $c["minus"]=$p[0]-$p["unu"];
return $c; }
//-------------------------------------------------------------------------------------------
function conexiune2($host,$port,$dbname,$user,$password)
{$db_conn=null;
$db_conn = conexiune($host,$port,$dbname,$user,$password);
return $db_conn;
}
//-------------------------------------------------------------------------------------------------
--
//select
public function selectie($par)
{$arr=array(); $arr[0]=55; //in cazul in care interogarea esueaza
$db_conn=null;
$db_conn=conexiune($par["host"],$par["port"],$par["dbname"],$par["user"],
$par["password"]);
if(!db_conn) return null;
$arr[0]=$par["port"];
$arr=sel($db_conn,$par["pageNo"],$par["pageSize"],$par["cda_sql"]);
return $arr;
}
//--------------------------------------------------------------------------------
//intoarce nr. de inreg. afectate: insert,update,delete
public function comanda($par)
{ $arr=array(); $db_conn=null;
$db_conn=conexiune($par["host"],$par["port"],$par["dbname"],$par["user"],
$par["password"]);
if(!db_conn) return null;
$result = pg_query($par["cda_sql"]); if (!$result) { return null;}
$cmdtuples = pg_afected_rows($result);
return $cmdtuples;
}
}
?>
Pentru utilizarea acestora se va crea un director ce va conține fșierele
jevi_clase.php și jevi_server.php: ../PostgreSQL/apache/twtwtw/jevi_php . Tot în acest
75
1.Dezvoltarea pe partea de server - dezvoltarea
claselor PHP în vederea comunicației prin RPC
director se vor copia și fșierele jsonRPCServer.php și jsonRPCClient.php oferite
de Sergio Vaccaro <sergio@inservibile.org> .
Din interfața client or fi lansate funcțiile de tip public din cadrul clasei
jevi_clase: selectie și comanda.
Pentru crearea tabelului - din aplicația de test:
CREATE DATABASE test_qooxdoo;
CREATE SCHEMA s1;
CREATE TABLE s1.t1( a1 character varying(20) NOT NULL, a2 integer, a3
numeric, a4 date, CONSTRAINT t1_pkey PRIMARY KEY (a1);
Se va testa trasferul de date pentru date de tip: șir de caractere, întreg,
real și dată calendaristică.
76
2.1.Noțiuni introductive privind crearea
scheletului unei aplicații qooxdoo
2.1. Noțiuni introductive privind crearea scheletului unei aplicații
qooxdoo
Framework-ul qooxdoo cuprinde un set de clase dezvoltate în javascript
ce permite creare unei aplicații WEB client. Acesta este opensource și poate fi
descărcat de la adresa www.qooxdoo.org. Framework-ul qooxdoo utilizează rutine
scrise în pyton 2.7 în vederea optimizării aplicației.
În acest sens se lansează comanda pentru crearea scheletului aplicației
qooxdoo:
create-application.py --name untabelpg --out "D:/PostgreSQL/apache/www"
Aceasta s-a creat în directorul …/twtwtw pentru o testare mai simplă. De
exemplu, în debuger-ul din cadrul Google Chrome se pot urmări datele din fecare
obiect rezultat prin instanțierea claselor ce moștenesc clase din cadrul qooxdoo.
Din cadrul directorului cu scheletul aplicației se lansează comanda:
generate.py source-all
Această comandă va colecta clasele qooxdoo necesare pentru aplicația
”template”. În urma acestei execuții se poate deschide aplicația de start
(”template”) prin fșierul ..twtwtw/untabelpg/source/index.html.
Pentru testarea claselor php este necesar ca deschiderea aplicației, în
browser, să se realizeze la adresa: htp://localhost:8080/untabelpg/source/.
La fnalizarea aplicației, aceasta poate fi optimizată pentru ca atunci când
este pusă pe server să nu necesite și kit-ul qooxdoo, ci numai fșierul javascript
rezultat și resursele aferente. Chiar dacă aplicația cuprinde mai multe fșiere
javascript, rezultatul va fi într-un singur fșier javascript optimizat prin utilizarea
unor rutine în pyton 2.7. Directorul ce se va copia pe server va fi cel apărut în
urma execuției comenzii:
generate.py build
și va avea numele implicit twtwtw/untabelpg/build (ulterior se poate redenumi).
Stuctura directoarelor din cadrul qooxdoo poate fi schimbată prin
modifcarea fșierelor de confgurare din cadrul kit-ului qooxdoo.
Fiecare clasă javascript creată va moșteni una dintre clase qooxdoo, iar
pentru fecare clasă vom avea un fșier cu același nume cu clasa.
2.2. Descrierea codului aplicației ”untabelpg”
Aplicația are două clase: untabelpg.Application și untabelpg.w_main0,
deci vor fi două fșiere ce vor conține codul sursă: Application.js și w_main0.js.
2.2.1. Clasa ”untabelpg.Application”
Aceasta este clasa din care este lansată aplicația. Codul clasei este:
77
2.Dezvoltarea pe partea de client – dezvoltarea
interfeței prin utilizarea claselor qooxdoo
qx.Class.defne("untabelpg.Application",
{/*clasa provine din qx.application.Standalone
specifcă interfețelor WEB ce au ferestre cu aspect DESKTOP*/
extend : qx.application.Standalone,
members :
{ /*funcția principală a clasei - este apelată
în momentul instanțierii clasei */
main : function()
{ // apel constructor clasa de bază
this.base(arguments);
//creare obiect fereastra principală (unica fereastră)
var win_main0 = new untabelpg.w_main0;
// setare mod afșare fereastră (Grow -permite redimensionarea automată)
win_main0.setLayout(new qx.ui.layout.Grow());
//lățimea inițială a ferestrei - în pixeli
win_main0.setWidth(300);
//înălțimea inițială a ferestrei - în pixeli
win_main0.setHeight(600);
// ascunde butonul de minimizare
win_main0.setShowMinimize(false);
// adăugare obiect fereastră
this.getRoot().add(win_main0, {left:20, top:20});
//deschidere fereastră
win_main0.open();
}
}
});
78
2.2.Descrierea codului aplicației ”untabelpg”
//layout -ul stabilește cum sunt afșate controalele din interiorul acestuia
var layoutTabX = new qx.ui.layout.Grow();
//gestionar de controale
var container = new qx.ui.container.Composite(layoutTabX);
this.add(container, {edge: 0});
//se instanțiază o clasă pentru afșarea unui control de tip ”NOTE-TAB”
var tabX=new qx.ui.tabview.TabView();
container.add(tabX);
//instanțierea primului control de tip ”TAB” din cadrul ”NOTE-TAB”
var page3 = new qx.ui.tabview.Page("TEST");
page3.setLayout(layout3);page3.setPadding(10);tabX.add(page3);
this.add(container, {left:40, top:40});
//comunicatia - funcție defnită în cadrul constructorului clasei
var showDetails = function(details) {
window.alert(
"origin: " + details.origin +
"; code: " + details.code +
"; message: " + details.message
);
};
//instanțierea și adăugarea butoanelor
var b1 = new qx.ui.form.Buton("ADAUGA LINIE NOUA", "");
page3.add(b1,{row:0,column:0});
var b2 = new qx.ui.form.Buton("ACTUALIZEAZA LINIA", "");
page3.add(b2,{row:0,column:1});
var b3 = new qx.ui.form.Buton("STERGE LINIA", "");
page3.add(b3,{row:1,column:1});
var b4 = new qx.ui.form.Buton("SALVEAZA O NOUA LINIE",
"").set({allowShrinkX: true,allowShrinkY: true,paddingTop: 3});
page3.add(b4,{row:1,column:0});
var b5 = new qx.ui.form.Buton("Qery ASINCRON", "").set({allowShrinkX:
true,allowShrinkY: true, padding: 3 });b5.addState("default");
page3.add(b5,{row:2,column:1});
var b6 = new qx.ui.form.Buton("Qery SINCRON", "").set({allowShrinkX:
true,allowShrinkY: true, padding: 3 });
page3.add(b6,{row:2,column:0});
/*crearea modelului pentru controlul de tip tabel/grid - acesta gestionează modul de
afșare a datelor*/
untabelpg.w_main0.tableModelX = new qx.ui.table.model.Simple();
//sunt defnite afșările pentru coloanele tabelului
untabelpg.w_main0.tableModelX.setColumns([ "No", "Data char", "Data
int","Data foat","Data date"]);
//este instanțiat și controlul tabel și este asociat cu modelul instanțiat anterior
79
2.Dezvoltarea pe partea de client – dezvoltarea
interfeței prin utilizarea claselor qooxdoo
untabelpg.w_main0.table = new
qx.ui.table.Table(untabelpg.w_main0.tableModelX).set({ decorator: null,
allowGrowX: true});
untabelpg.w_main0.tableModelX.setColumnEditable(1, true);
untabelpg.w_main0.tableModelX.setColumnEditable(2, true);
untabelpg.w_main0.tableModelX.setColumnEditable(3, true);
untabelpg.w_main0.tableModelX.setColumnEditable(4, true);
untabelpg.w_main0.tableModelX.setColumnEditable(5, true);
/*este adăugat tabelul pe rândul al patrulea și prima coloană și se va extinde în
dreapta cu încă două coloane */
page3.add(untabelpg.w_main0.table,{row:3,column:0, colSpan: 2});
//-------------------------------------------------------------------------------------------
//funcție ce răspunde la evenimentul de ”apăsare” pentru butonul b1
b1.addListener("execute", function(e) {
/*defnește variabila c ca find un tablou și se inițializează cu valoarea unei
înregistrări */
var c=[[0,'-',0,0,new Date(),true]];
//adaugă în cadrul modelului înregistrarea dată prin variabila c
untabelpg.w_main0.tableModelX.addRows(c);
});
//-------------------------------------------------------------------------------------------
80
2.2.Descrierea codului aplicației ”untabelpg”
var result;
//apelează funcția pentru comunicație asincronă
var handler = function(result, exc) {
if (exc == null)
{ window.alert("Nr. inregistrari afectate: " +result);}
}
} catch (exc) {
showDetails(exc.rpcdetails);
}
/*asociază pentru comunicația asincronă funcția PHP ”comanda” din cadrul clasei
PHP "jevi_clase" */
rpc.callAsync(handler, "comanda",par);
});
//-------------------------------------------------------------------------------------------------
----------
//funcție ce răspunde la evenimentul de ”apăsare” pentru butonul b3
b3.addListener("execute", function(e) {
//sunt preluați în obiectul par parametrii de conectare
var par={"host":"localhost", "port":"5437", "dbname":"test_qooxdoo" ,
"user":"postgres", "password":"abcd", "pageNo":"1", "pageSize":"0", "cda_sql":"---"};
//!!!ATENTIE pageSize:0 pentru UPDATE, DELETE, INSERT, RAISE EXCEPTION
//preia numărul înregistrării selectate
var recno=untabelpg.w_main0.table.getFocusedRow();
81
2.Dezvoltarea pe partea de client – dezvoltarea
interfeței prin utilizarea claselor qooxdoo
}
} catch (exc) {
showDetails(exc.rpcdetails);
}
//apel funcție PHP ”comanda” pentru operațiile de INSERT / UPDATE / DELETE
rpc.callAsync(handler, "comanda",par);
});
//-------------------------------------------------------------------------------------------------
-----
//funcție ce răspunde la evenimentul de ”apăsare” pentru butonul b4
b4.addListener("execute", function(e) {
var par={"host":"localhost", "port":"5437", "dbname":"test_qooxdoo",
"user":"postgres", "password":"abcd", "pageNo":"1", "pageSize":"0", "cda_sql":"---"};
var recno=untabelpg.w_main0.table.getFocusedRow();
var recdata=[];
recdata.push(untabelpg.w_main0.tableModelX.getRowData(recno));
par["cda_sql"]="INSERT INTO s1.t1(a1,a2,a3,a4) VALUES
('"+recdata[0][1]+"',"+recdata[0][2]+","+recdata[0][3]+",'"+recdata[0][4]+"') ";
//window.alert(par["cda_sql"]);
var rpc = new qx.io.remote.Rpc();
// timp de încercare ptr. stabilire conexiune :10 sec
rpc.setTimeout(106000);
rpc.setUrl("htp://localhost:8080/jevi_php/jevi_server.php");
rpc.setServiceName("jevi_clase");
try {
var result; //result = rpc.callSync("comanda",par);
var handler = function(result, exc) {
if (exc == null)
{ window.alert("Nr. inregistrari afectate: " +result);}
}
} catch (exc) {
showDetails(exc.rpcdetails);
}
rpc.callAsync(handler, "comanda",par);
});
//-------------------------------------------------------------------------------------------------
-
//funcție ce răspunde la evenimentul de ”apăsare” pentru butonul b3
b5.addListener("execute", function(e) {
var par={"host":"localhost", "port":"5437", "dbname": "test_qooxdoo",
"user":"postgres", password":"abcd", "pageNo":"1", "pageSize":"1006000",
"cda_sql":"---"};
/* row_number() OVER() afșează numărul liniei afșate în urma aplicării
82
2.2.Descrierea codului aplicației ”untabelpg”
restricțiilor*/
par["cda_sql"]="SELECT row_number() OVER() , a1, a2, a3, a4
FROM s1.t1 ";//cu spatiu si fara ';' */
var rpc = new qx.io.remote.Rpc();
rpc.setTimeout(106000);
rpc.setUrl("htp://localhost:8080/jevi_php/jevi_server.php");
rpc.setServiceName("jevi_clase");
try {
var result;
var handler = function(result, exc) {
if (exc == null) //dacă nu a apărut vreo eroare
untabelpg.w_main0.tableModelX.setData(result);
}
} catch (exc) {
showDetails(exc.rpcdetails);
}
rpc.callAsync(handler, "selectie",par);
});
//-----------------------------------------------------------------------------------------
//funcție ce răspunde la evenimentul de ”apăsare” pentru butonul b6
b6.addListener("execute", function(e) {
var par={"host":"localhost", "port":"5437", "dbname":"test_qooxdoo",
"user":"postgres", "password":"abcd", "pageNo":"1","pageSize":"1006000",
"cda_sql":"---"};
par["cda_sql"]="SELECT row_number() OVER() , a1, a2, a3, a4
FROM s1.t1 ";//cu spațiu și fără ';'
var rpc = new qx.io.remote.Rpc();
rpc.setTimeout(106000);
rpc.setUrl("htp://localhost:8080/jevi_php/jevi_server.php");
rpc.setServiceName("jevi_clase");
try {//apel funcție de comunicație sincronă
var result = rpc.callSync("selectie",par);
if(result == null) window.alert("Nu exista date!");
else untabelpg.w_main0.tableModelX.setData(result);
}catch(err){
window.alert("Eroare la interogare :"+err);
}
});
},//end constructor
members:{
},
statics:{tableModelX:null,table:null },
events : //evenimente predefnite pentru tabel
83
2.Dezvoltarea pe partea de client – dezvoltarea
interfeței prin utilizarea claselor qooxdoo
{"reload" : "qx.event.type.Event", //refresh
"post" : "qx.event.type.Data" //validare
}
});
84
VI.Aplicație – Construcția unei hărți pentru
dispersie
2. Analiza aplicației
În vederea rezolvării acestei teme au fost abordate următoarele soluții:
2.1. Preluarea și mixarea celor două imagini
Preluarea imaginii cu dispersia poluării obținute de aplicația ApPol și
mixarea cu o hartă geografcă locală. Aceasta se va face prin stabilirea unei
opacități pentru imaginea cu dispersia poluării.
Avantaje:
✔ Este o metodă ce pare simplă,
✔ Disponibilitatea imediată a fișerului rezultat.
Dezavantaje:
✗ Este necesară existența unei clase sau metode pentru realizarea opacității.
Este posibilă dezvoltarea unui asemenea modul, dar necesită resurse de
timp.
✗ Cele două imagini vor trebui să fe la aceeași scară și va fi necesară
găsirea unei soluții pentru interfața cu utilizatorul.
✗ Centrarea celor două imagini presupune dezvoltarea unui modul adecvat
pentru interfața cu utilizatorul.
✗ Este necesar un sistem de management pentru relaționarea fșierelor
hartă – imagine poluare.
2.2. Preluarea datelor din fșierul de tip log – aplicație de tip
desktop
În fșierul de tip log, furnizat de ApPol, sunt date cu care se poate
construi harta pentru dispersie a poluării. Se poate încărca harta geografcă
dintr-un fșier local într-un control de tip canvas, iar dispersia poluării se va
85
2.Analiza aplicației
3. Proiectarea aplicației
În urma analizei a fost aleasă soluția Preluarea datelor din fșierul de tip
86
3.Proiectarea aplicației
Stabilire opacitate +
Afșare hartă dispersie
Salvare imagine
Fig. VI.1 – Fluxul princiapal de date
87
3.Proiectarea aplicației
88
3.1.Diagrama de secvență
Hartă 6.C
:WEB Dispersie da
. Sa
rtă
(canvas) ve
5.Co
ha
hart sie
disp
am are
Hartă statică
nstr
din cărc
ă
ică
er
Dispersie
ucție
1.În
(pagină nouă)
Date poluare
pacitate
Hartă
Google Map procesate
dinamică 4.Coordonate sursă re
l va
6.Setare o
ate
r
e re im
7.C i er
e
ș
opi
i
8.F
3.C
:Utilizator
89
3.Proiectarea aplicației
Încărcare hartă
Google Map dinamică
Selectarea pe Harta
harta a Google
sursei de
poluare
Stabilire
Afșare hartă dispersie
opacitate
Salvare imagine
Fig.VI.4 – Diagrama activităților
90
3.3. Diagrama activităților
91
3.Proiectarea aplicației
intrarea în stare, acțiuni realizate la ieșirea din stare, tranziții interne (realizate
fără a schimba starea).
4. Implementarea aplicației
Varianta aleasă constă în implementare client-side prin utilizarea
JavaScript și a framework-ului qooxdoo. Aplicația are acronimul DSP, scheletul
aplicației qooxdoo este generat cu acest nume. În acest sens avem următoarele
fșiere sursă JavaScript (în qooxdoo fecare clasă corespunde unui fșier JavaScript
– având același nume cu clasa):
➔ Application – intrarea în aplicație;
➔ twharta – conține meniul principal și harta dinamică, conține metodele
pentru salvarea poziției sursei de dispersie precum și construcția șirurilor
de accesare pentru cele patru hărți 640x640;
➔ Wsharta – conține fereastra pentru preluarea și afșarea datelor, conține
funcții de conversie a coordonatelor, conține funcții pentru procesarea
datelor;
➔ twdharta – conține fereastra cu harta de dispersie, cu metodele de
desenare a hărții de dispersie.
4.1. Clasa ”dsp.Application”
Clasa dsp.Application derivă din clasa qooxdoo
qx.application.Standalone. Din cadrul acestei clase se lansează fereastra
wharta.
qx.Class.defne("dsp.Application",
{ extend : qx.application.Standalone,
members :
{ main : function()
{ this.base(arguments); //apel constructor bază
var doc = this.getRoot(); // accesează clasa de bază
var win = new dsp.wharta(); // instantierea
win.setShowMinimize(false);// dezactivează minimizarea
doc.add(win, {left:20, top:15}); // adaugă fereastra
win.open();// deschide fereastra
}
}});
92
4 . 2 . C l a s a ” d s p . tw h a r t a ”
{ extend : qx.ui.window.Window,
construct : function() //funcția constructor a clasei
{ this.base(arguments, "dsp"); // apel constructor clasă de bază
.................................................................................................................
},
members: { }, // date membre
statics: { mapX:null, S_Mark:false, locationSRS:null, locationSRS1:null,
locationSRS2:null, locationSRS3:null, locationSRS4:null, markerSRS:null,
infoMsrs:null, qxHartaG:null, imgS1:null, imgS2:null, imgS3:null, imgS4:null,
sirX:null, titlu:null, DIM2:1280,
tx:[], tz:[], min:+1.e+100, max:-1.e+100,
retine_c: function(location, mapR) { //funcție de tip static
....................................................................................................................
},
setare_cursor : function(tip) { //funcție de tip static
.....................................................................................................................
}
}});
dsp.wharta.prototype._creeazaHartaG = function() //funcție protected
{
.....................................................................................................................
}
Obiectul static dsp.wharta.mapX reprezintă harta dinamică. Pentru a ști
dacă este afșat marker-ul ce conține locația sursei este utilizat fag-ul S_Mark.
Variabila locationSRS va conține coordonatele sursei pentru dispersie,
iar locationSRS1, locationSRS2, locationSRS3 și locationSRS4 vor conține
coordonatele corespunzătoare centrelor celor 4 hărți de 640x640 pixeli. Harta cu
dispersia va fi centrată pe orginea dispersiei și va avea dimensiunea de 1280x1280
pixeli. Numerele corespunzătoare celor patru hărți reprezintă numărul cadranului
din cercul trigonometric în momentul alipirii acestora.
Tabloul tx va conține valorile dispersiei, iar tabloul ty va conține
numărul de încadrare (categoria) pentru valoarea dispersiei. Ambele tablouri sunt
cu două dimensiuni (matrice), însă declararea se realizează similar tablourilor
unidimensionale (vectori). Variabilele min și max vor conține valorile de minim și
maxim detectate din datele de dispersie. Variabilele imgS1, imgS2, imgS3 și imgS4
conțin șirurile necesare accesării celor patru hărți statice. Variabila sirX va
conține datele copiate prin clipboard. Acestea se vor stoca sub forma unui vector.
Funcția de tip static retine_c() memorează noua poziție pe harta dinamică., iar
funcția setare_cursor() schimbă forma cursorului în momentul alegerii opțiunii de
selectare sursă dispersie și după încheierea selecției. Funcția de tip protected
._creeazaHartaG() construiește și afșează o hartă dinamică google map.
Constructorul clasei "dsp.wharta" conține codul:
93
4.Implementarea aplicației
construct : function()
{ this.base(arguments, "dsp");
this.setCaption="HARTA DISPERSIE";
this.setWidth(600); this.setHeight(600);
this.setLayout(new qx.ui.layout.Canvas());
var butonPanel = new qx.ui.container.Composite().set({height:30});
butonPanel.setLayout(new qx.ui.layout.HBox(4));
this.add(butonPanel,{left:0,top:0,right:0});
var b1 = new qx.ui.form.Buton("Sursa Poluare", ""); butonPanel.add(b1);
b1.addListener("execute", function(e)
{ dsp.wharta.setare_cursor(1); dsp.wharta.S_Mark=true;});
var b2 = new qx.ui.form.Buton("Preluare date", "");
butonPanel.add(b2);
b2.addListener("execute", function(e) {
var winS = new dsp.wsharta("Preluare date dispersie");
winS.setShowMinimize(false); winS.open();
});
var b3 = new qx.ui.form.Buton("Generare harta", "");butonPanel.add(b3);
b3.addListener("execute", function(e)
{
..........................................................................................................................
});
var ci= new qx.ui.container.Composite(new qx.ui.layout.Grow());
ci.add(this._creeazaHartaG()); //comp.add(ci,{edge :0});
this.add(ci,{left:0,botom:0,right:0,top:32});//
}
După apelul constructorului clasei de bază this.base(arguments, "dsp");
este asignat titlul ferestrei this.setCaption="HARTA DISPERSIE". Prin apelul
metodelor de tip seter/geter :this.setWidth(600); this.setHeight(600); este
stabilită dimensiunea inițială a ferestrei (600 x 600 pixeli).
Prin apelul this.setLayout(new qx.ui.layout.Canvas()); este stabilit modul
de afșare al controalelor din cadrul ferestrei. Metoda qx.ui.layout.Canvas()
creează un obiect de tip Layout – Canvas, în care putem adăuga controalele prin
specifcarea marginilor: lef, right, top și botom față de suprafața pe care sunt
așezate.
Prin execuția liniei:
var butonPanel = new qx.ui.container.Composite().set({height:30});
este creat un container (suprafață virtuală pe care se vor atașa alte controale).
Tipul Composite() este un model general pe care pot fi adăugate mai multe
controale. Totodată, prin metoda set() se pot stabili diverse proprietăți ale
obiectului. Având ca argument un obiect cu proprietăți, în acest caz proprietatea
height este setată cu valoarea 30.
94
4 . 2 . C l a s a ” d s p . tw h a r t a ”
95
4.Implementarea aplicației
dsp.wharta.DIM2/4-1, pct_cp.y-dsp.wharta.DIM2/4);
dsp.wharta.locationSRS2 = dsp.wsharta.PointToLatLng(pct_cp.x-
dsp.wharta.DIM2/4, pct_cp.y - dsp.wharta.DIM2/4);
dsp.wharta.locationSRS3 = dsp.wsharta.PointToLatLng(pct_cp.x-
dsp.wharta.DIM2/4, pct_cp.y + dsp.wharta.DIM2/4 - 1);
dsp.wharta.locationSRS4 = dsp.wsharta.PointToLatLng(pct_cp.x +
dsp.wharta.DIM2/4-1, pct_cp.y + dsp.wharta.DIM2/4-1);
var sir_harta_statica = "htps://maps.googleapis.com/maps/api/staticmap";
sir_harta_statica = sir_harta_statica + "?center=" +
dsp.wharta.locationSRS1.lat().toString() + "," +
dsp.wharta.locationSRS1.lng().toString();
sir_harta_statica = sir_harta_statica + "&zoom=" +
dsp.wharta.mapX.zoom.toString() + "&size=640x640%20";
sir_harta_statica = sir_harta_statica + "&maptype=" +
dsp.wharta.mapX.mapTypeId;
sir_harta_statica = sir_harta_statica + "&markers=size:mid
%7Ccolor:0xFFFF00%7Clabel:1%7C" + dsp.wharta.locationSRS1.lat().toString() +
"," + dsp.wharta.locationSRS1.lng().toString();
dsp.wharta.imgS1 = sir_harta_statica;
sir_harta_statica = "htps://maps.googleapis.com/maps/api/staticmap";
sir_harta_statica = sir_harta_statica + "?center=" +
dsp.wharta.locationSRS2.lat().toString() + "," +
dsp.wharta.locationSRS2.lng().toString();
sir_harta_statica = sir_harta_statica + "&zoom=" +
dsp.wharta.mapX.zoom.toString() + "&size=640x640%20";
sir_harta_statica = sir_harta_statica + "&maptype=" +
dsp.wharta.mapX.mapTypeId; sir_harta_statica = sir_harta_statica +
"&markers=size:mid%7Ccolor:0xFFFF00%7Clabel:2%7C" +
dsp.wharta.locationSRS2.lat().toString()+ "," +
dsp.wharta.locationSRS2.lng().toString();
dsp.wharta.imgS2 = sir_harta_statica; sir_harta_statica =
"htps://maps.googleapis.com/maps/api/staticmap";
sir_harta_statica = sir_harta_statica + "?center=" +
dsp.wharta.locationSRS3.lat().toString() + "," +
dsp.wharta.locationSRS3.lng().toString();
sir_harta_statica = sir_harta_statica + "&zoom=" +
dsp.wharta.mapX.zoom.toString() + "&size=640x640%20";
sir_harta_statica = sir_harta_statica + "&maptype=" +
dsp.wharta.mapX.mapTypeId;
sir_harta_statica=sir_harta_statica + "&markers=size:mid
%7Ccolor:0xFFFF00%7Clabel:3%7C" + dsp.wharta.locationSRS3.lat().toString() +
96
4 . 2 . C l a s a ” d s p . tw h a r t a ”
"," + dsp.wharta.locationSRS3.lng().toString();
dsp.wharta.imgS3 = sir_harta_statica;
sir_harta_statica = "htps://maps.googleapis.com/maps/api/staticmap";
sir_harta_statica = sir_harta_statica + "?center=" +
dsp.wharta.locationSRS4.lat().toString() + "," +
dsp.wharta.locationSRS4.lng().toString();
sir_harta_statica = sir_harta_statica + "&zoom=" +
dsp.wharta.mapX.zoom.toString() + "&size=640x640%20";
sir_harta_statica = sir_harta_statica + "&maptype=" +
dsp.wharta.mapX.mapTypeId; sir_harta_statica = sir_harta_statica +
"&markers=size:mid%7Ccolor:0xFFFF00%7Clabel:4%7C" +
dsp.wharta.locationSRS4.lat().toString()+ "," +
dsp.wharta.locationSRS4.lng().toString();
dsp.wharta.imgS4 = sir_harta_statica;
var winD = new dsp.wdharta("Harta Dispersie fnala");
winD.setShowMinimize(false);
winD.open(); winD.close();winD.open();
});
Variabila pct_cp va conține coordonatele în pixeli ale centrului hărții,
funcția ce realizează acest lucru este detaliată în clasa dsp.wsharta. Sunt
determinate coordonatele (latitudine, longitudine) pentru centrele celor patru
hărți adiacente (dsp.wharta.locationSRS1 - 4 ). Utilizând metode din JavaScript se
construiesc adresele pentru obținerea celor patru hărți statice (de exemplu,
dsp.wharta.locationSRS4.lng().toString() preia valoarea longitudinii sursei
pentru harta din cadranul 4 -numerică- și o convertește în șir de caractere în
scopul concatenării). În fnal este instanțiată clasa ce se ocupă de defnitivarea
construcției hărții de dispersie:
var winD = new dsp.wdharta("Harta Dispersie fnala");
Fereastra este deschisă prin apelul funcției winD.open(). Harta dinamică
este generată prin apelul funcției de tip protected creeazaHartaG funcție
membră a clasei dsp.wharta.
dsp.wharta.prototype._creeazaHartaG = function()
{ dsp.wharta.qxHartaG = new qx.ui.core.Widget().set({ width: 640, height:
640 }); dsp.wharta.qxHartaG.setDecorator("main");
dsp.wharta.qxHartaG.addListenerOnce("appear", function() {
try { dsp.wharta.mapX = new
google.maps.Map(dsp.wharta.qxHartaG.getContentElement().getDomElement(), {
zoom: 14, mapTypeId: google.maps.MapTypeId.ROADMAP });
google.maps.event.addListener(dsp.wharta.mapX, 'click', function(event) {
dsp.wharta.retine_c(event.latLng,dsp.wharta.mapX);
dsp.wharta.locationSRS=event.latLng;
97
4.Implementarea aplicației
});
var infowindow = new google.maps.InfoWindow({content: 'Zoom harta' });
infowindow.open(dsp.wharta.mapX);
google.maps.event.addListener(dsp.wharta.mapX, 'click', function(event) {
infowindow.setContent('Zoom: ' + dsp.wharta.mapX.getZoom());
});
dsp.wharta.mapX.setCenter(new google.maps.LatLng(44.835,24.906)); } catch(ex) {
var msg = "Nu poate f creata HARTA Google !<br/>" + ex.toString();
dsp.wharta.qxHartaG.getContentElement().getDomElement().innerHTML +=
msg;
} });
return dsp.wharta.qxHartaG;
}
Se creează un control generic ce va fi referit prin dsp.wharta.qxHartaG.
Acest control va avea dimensiunea 640 x 640 pixeli și va fi utilizat pentru
preluarea hărții dinamice. Asociat controlului se defnește funcția pentru tratarea
evenimentului de afșare: dsp.wharta.qxHartaG.addListenerOnce ce este
atașată evenimentului "appear".
98
4 . 2 . C l a s a ” d s p . tw h a r t a ”
99
4.Implementarea aplicației
100
4 . 3 . C l a s a ” d s p . tw s h a r t a ”
var colS=[];
101
4.Implementarea aplicației
102
4 . 3 . C l a s a ” d s p . tw s h a r t a ”
------------------------------------------------------------------------");
var sxx; sxx=sx[2];
for(var k=0;k<1000;k++)
{sxx=sxx.replace(" "," "); sxx=sxx.replace("E+","e+");
sxx=sxx.replace("E-","e-");
}
sxx=sxx.trim(); //elimină spații - stânga+dreapta
var yx=sxx.split(" ");
var ty=[];
for(var i=0;i<36;i++)
for(var j=0;j<16;j++)
{ if (!ty[i]) ty[i] = []; //nu este posibilă defnirea directă a unei matrice 2D
ty[i][j]=parseFloat(yx[i*16 + j]);
}
//determinarea valorilor minime și maxime
var min=new Number(+1.e+100),max = new Number(-1.e+100);
for(var i = 0; i<36; i++)
for(var j = 1; j<16; j++)
{ if(ty[i][j] < dsp.wharta.min) dsp.wharta.min = ty[i][j];
if(ty[i][j] > dsp.wharta.max) dsp.wharta.max = ty[i][j];
}
//stabilirea domeniilor
for(var k=0;k<7;k++)
dsp.wsharta.ariaval[k] = dsp.wharta.min + (dsp.wharta.max –
dsp.wharta.min) * dsp.wsharta.ariapr[k] / 100.0;
//cuantifcarea domeniilor
var tz=[];
for(var i=0; i<36; i++)
for(var j=0; j<16; j++)
{ if (!tz[i]) tz[i] = []; //nu este posibilă defnirea directă a unei matrice 2D
if( j == 0) { tz[i][j]= -1; continue;}//nu face parte din valori
for(var k=1;k<7;k++)
if(ty[i][j] >= dsp.wsharta.ariaval[k-1] && ty[i][j] <=
dsp.wsharta.ariaval[k]) tz[i][j]=k-1;
}
dsp.wsharta.eMIN.setValue(dsp.wharta.min.toString());
dsp.wsharta.eMAX.setValue(dsp.wharta.max.toString());
dsp.wharta.tx=ty; dsp.wharta.tz=tz;
dsp.wsharta.tableModel.setData(dsp.wharta.tx);
dsp.wsharta.containerS.setSelection( [dsp.wsharta.containerS.getChildren()
[1]] );
}
Funcția identifcă începutul tabelului și citește în tabloul ty valorile
103
4.Implementarea aplicației
104
4 . 3 . C l a s a ” d s p . tw s h a r t a ”
x=x-x_c; y=y-y_c;
x=x*Math.pow(2, dsp.wharta.mapX.zoom); y=y*Math.pow(2,
dsp.wharta.mapX.zoom);
x=dsp.wharta.DIM2/2+x; y=dsp.wharta.DIM2/2+y;
return {x:x,y:y};
};
105
4.Implementarea aplicației
106
4 . 4 . C l a s a ” d s p . tw d h a r t a ”
});
Obiectul dsp.wdharta.canvas1 reprezintă suprafața de desenare, iar
dsp.wdharta.img1-4 reprezintă cele patru obiecte imagine cu cele patru sectoare
ale hărții. Vectorul dsp.wdharta.ariafll[] va conține codul culorii pentru
fecare grup valoric al dispersiei.
Constructorul clasei are codul:
construct : function()
{ this.base(arguments, "dsp");
this.setCaption="HARTA";
this.setWidth(500); this.setHeight(530);
this.setLayout(new qx.ui.layout.Canvas());
var panelZ1 = new qx.ui.container.Composite().set({decorator: "main",
backgroundColor: "#DEEAF7",height:30,alignX:"left"});
panelZ1.setLayout(new qx.ui.layout.HBox(4).set({alignY:"middle"}));
this.add(panelZ1,{top:0,left:0,right:0});
var b_save = new qx.ui.form.Buton("SALVARE HARTA",
"").set({height:20,width:80}); panelZ1.add(b_save);
b_save.addListener("execute", function(e) { dsp.wdharta.salveaza(); });
panelZ1.add(new qx.ui.basic.Label(" Opacitatea:"));
var slider1 = new qx.ui.form.Slider("horizontal").set({ minimum:0,
maximum:100, pageStep:10, value:10, height:8, width:300}); panelZ1.add(slider1);
slider1.addListener("changeValue", function(e)
{ dsp.wdharta.opac=slider1.getValue()/100.0;
dsp.wdharta.canvas1.update();});
var panelZ2 = new qx.ui.container.Scroll();
var panelZ2_1=new qx.ui.container.Composite(new
qx.ui.layout.Canvas()).set({width:dsp.wharta.DIM2,height:dsp.wharta.DIM2});
panelZ2.add(panelZ2_1);
this.add(panelZ2,{left:0,top:32,botom:0,right:0});
if (!qx.core.Environment.get("html.canvas"))
107
4.Implementarea aplicației
{ dsp.wdharta.canvas1 = new
qx.ui.container.Composite(new qx.ui.layout.HBox());
dsp.wdharta.canvas1.add(new qx.ui.basic.Label("Acest
browser nu suporta suprafete de desenare!").set({rich : true,alignX: "center", alignY:
"middle" }));
}
else
{ dsp.wdharta.canvas1 = new
qx.ui.embed.Canvas().set({
syncDimension: true, allowStretchX : false,
allowStretchY : false, width:dsp.wharta.DIM2, height:dsp.wharta.DIM2
});
dsp.wdharta.canvas1.addListener("redraw", this.draw, this);
dsp.wdharta.img1 = new Image();
dsp.wdharta.img1.alt="Imaginea nu a putut f incarcata!";
dsp.wdharta.img1.setAtribute('crossOrigin', 'anonymous');
dsp.wdharta.img1.src =dsp.wharta.imgS1;
dsp.wdharta.img2 = new Image();
dsp.wdharta.img2.setAtribute('crossOrigin', 'anonymous');
dsp.wdharta.img2.src =dsp.wharta.imgS2;
dsp.wdharta.img3 = new Image();
dsp.wdharta.img3.setAtribute('crossOrigin', 'anonymous');
dsp.wdharta.img3.src =dsp.wharta.imgS3;
dsp.wdharta.img4 = new Image();
dsp.wdharta.img4.setAtribute('crossOrigin', 'anonymous');
dsp.wdharta.img4.src =dsp.wharta.imgS4;
}
panelZ2_1.add(dsp.wdharta.canvas1,{left:0,top:0,botom:0,right:0});
}
Layout-ul asociat ferestrei va fi de tip canvas. Container-ul panelZ1 are
un layout de tip Hbox și conține controalele: un buton pentru salvare, o etichetă
cu conținutul ”Opacitate” și un control de tip slider. Acest container are înălțime
fxă (30 pixeli), iar restul este aliniat la marginile stânga, dreapta și sus.
Fereastra mai conține și un container -panelZ2- cu un layout de tip Grow.
Acest container va conține un singur control cu imaginea hărții de dispersie.
Acest container are înălțime variabilă și este aliniat la marginile stânga, dreapta,
sus și jos.
dsp.wdharta.canvas1 = new qx.ui.embed.Canvas()
Opțiunea setAtribute('crossOrigin', 'anonymous'); dă posibilitatea
modifcării imaginii inițiale.
Redesenarea hărții în urma modifcării opacității desenului cu dispersia se
realizează prin funcția dsp.wdharta.canvas1.update(); .
108
4 . 4 . C l a s a ” d s p . tw d h a r t a ”
109
4.Implementarea aplicației
}
dsp.wdharta.drawLegenda(ctx);
}
Pentru desenare se constituie un nou obiect var ctx = data.context; unde
data se obține din referința preluată de funcție (var data = e.getData(); ) în
urma evenimentului redraw pentru canvas1.
Obiectul ctx preia imaginile celor patru hărți 640x640 pixeli
dsp.wdharta.img1-4 și le afșează în canvas pe poziția celor patru cadrane.
Se construiește vectorul cu nuanțele de culoare pentru fecare grup de
date ale dispersiei dsp.wdharta.ariafll[]. Acesta preia culoarea de bază în
format Red-Green-Blue și adaugă valoarea opacitații preluată din cursorul de tip
Slider.
Următorul pas este determinarea coordonatelor ce delimitează fecare
sector. În acest sens se cunosc coordonatele sursei, distanțele față de sursă (în
metri) și unghiurile fecărui punct (fgura VI.9 - Anexă). Funcția utilizată este
dsp.twsharta.destinationPoint.
Pentru realizarea sectoarelor se utilizează primitive grafce, precum arcul
de cerc și linia. Liniile și contururile trasate se activează prin funcția ctx.stroke().
Fiecare secvență ctx.beginPath() - ctx.closePath() are atașat un anumit mod de
umplere pentru contururile obținute - ctx.fllStyle. În fnalul funcției este apelată
funcția dsp.wdharta.drawLegenda(ctx); ce realizează desenarea legendei.
Funcția pentru desenarea legendei are codul:
dsp.wdharta.drawLegenda = function(cty)
{ var xLeg=10, yLeg=20;
for(var k=0;k<6;k++)
{cty.beginPath();
cty.rect(xLeg+k*30,yLeg,30,30);
cty.fllStyle = dsp.wdharta.ariafll[k];
cty.fll();
cty.stroke();
cty.closePath();
}
cty.beginPath();
cty.fllStyle="black";cty.font="12px Arial";
for(var k=0;k<7;k++)
{cty.fllText(dsp.wsharta.ariaval[k].toFixed(1).toString(),xLeg-5+k*30,yLeg-2);
cty.fllText(dsp.wsharta.ariapr[k].toString()+"%",xLeg-7+k*30,yLeg+46);
cty.stroke();
}
cty.closePath();
}
Desenul se execută direct pe canvas1 prin obiectul de desenare ctx.
110
4 . 4 . C l a s a ” d s p . tw d h a r t a ”
dsp.wdharta.canvas1.getContentElement().getDomElement();
window.open(canvasDOMElement.toDataURL("imagez/png"));
}
5. Testarea aplicației
Testarea aplicației DSP s-a realizat doar pe browser-ul Google Chrome,
testarea pe alte browsere punând probleme la încărcarea hărților google map.
Pentru testare, în cursul dezvoltării se putea utiliza un modul specializat
în testare oferit de dezvoltatorii de la qooxdoo, însă se poate utiliza și modul debug
al browser-elor, în acest caz a fost utilizat modulul debug din cadrul Google
Chrome.
În cazul în care în debuger apar erori ce sunt difcil de interpretat, se
recomandă execuția comenzii din linia de comandă generate.py source-all ce are
ca efect și o analiză lexicală, sintactică și semantică a textului JavaScript.
Implementarea aplicației a început prin comanda din cadrul qooxdoo
create. Structura aplicație a fost creată în urma comenzii:
create-application.py - - name=dsp - - out=”D://”
Versiunea JavaScript optimizată, ce include și clasele din qooxdoo, este
obținută prin comanda: generate.py build.
111
Bibliografe
Bibliografe
112
ANEXE
ANEXE
Operatori javascript/php
Operatori unari
SIMBO FORMA FORMA Operaţia realizată Exemplu
LUL PHP JS
- -$a -a negarea lui a -3
+ +$a +a valoarea lui a 3
$a++ a++ Postincrementare: $a=3++;
preia valoare, apoi creste cu 1 $a are val. 3
++ Preincrementare: $a=++3;
++$a ++a mai întâi creşte cu 1, apoi preia $a are val. 4
valoarea
$a-- a-- Postdecrementare: $a=3--;
preia valoarea, apoi scade cu 1 $a are val. 3
-- Predecrementare: $a=--3;
--$a --a mai întâi scade cu 1, apoi preia $a are val. 2
valoarea
Operatori binari aritmetici
SIMBO FORMA FORMA Operaţia realizată Exemplu
LUL PHP JS
+ $a+$b a+b a adunat cu b 3.7+5.3
- $a-$b a-b b scăzut din a 3.1-5.0
* $a*$b a*b a înmuţit cu b 1.2*4.1
/ $a/$b a/b a împărţit la b 1.2/4.1
% $a%$b a%b a modulo b (restul împărţirii) 5%4
Operatori de atribuire aritmetici
SIMBOLUL FORMA FORMA Operaţia realizată
PHP JS
= $a=$b a=b a preia valoarea lui b
+= $a+=$b a+=b a=a(fostul conţinut)+b
-= $a-=$b a-=b a=a-b
/= $a/=$b a/=b a=a/b
%= $a%=$b a%=b a=a%b
Operatori relaţionali
SIMBOLUL FORMA FORMA Operaţia realizată
PHP JS
> $a>$b a>b dacă a>b, atunci true, altfel false
>= $a>=$b a>=b dacă a>=b atunci true, altfel false
< $a<$b a<b dacă a<b atunci true, altfel false
<= $a<=$b a<=b dacă a<=b atunci true, altfel false
113
Operatori javascript/php
114
Harta obținută
Harta obținută
115
Harta obținută
Fig. VI.11. Salvarea hărții de dispersie ( harta de bază provine din Google Maps )
116
View publication stats