se genereaza local, in browser, nefiind necesar si transferul acestora de pe server. Structura generala a unei pagini, titlu, meniu lateral, subsolul paginii, se genereaza o singura data, iar la navigarea acelui site se aduc doar datele noi din continutul paginii respective, titlul si meniurile ramanand neschimbate. • Interactivitate Aplicatiile AJAX sunt in principal executate in computerul utilizatorului, prin manipularea paginii curente de catre browser folosind metode de document object model (DOM). AJAX poate fi utilizat pentru o serie de functii precum actualizarea inregistrarilor, expandarea formularelor, returnarea unor cautari simple, editarea de elemente, toate fara nevoia de a reincarca intreaga pagina web in momentul cand aceasta este modificata. Se trimit doar cereri scurte catre server si se primesc raspunsuri de dimensiuni mici. Acest lucru creste interactivitatea si apropie paginile web de posibilitatile aplicatiilor desktop. Pentru magazinele virtuale, site-uri de eBanking sau eCommerce, sau pentru implementarea unui chat intr-o pagina web tehnologia AJAX este foarte importanta. In conditiile in care un studiu recent a aratat ca un client paraseste site-ul unui magazin online in favoarea altuia, daca incarcarea unei pagini dureaza mai mult de 4 secunde, interactiunea oferita de AJAX, posibilitatea de a modifica doar anumite aspecte ale paginii (de ex aparitia parerilor altor cumparatori despre un anumit produs, sau calculul sumei totale din “cosul de cumparaturi” fara a reincarca toata pagina, ci doar acea zona) este foarte importanta. 2.4.4 Dezavantaje • Utilizarea butoanelor de Back si Forward, si a link-urilor Paginile web ce utilizeaza AJAX pot sa impiedice functionarea comportamentului normal, obisnuit si asteptat al butoanelor de Back dintr-un browser. Utilizatorii se asteapta ca apasand aceste butoane sa fie dusi la aspectul anterior al paginii, dar acest lucru nu este mereu 28 adevarat cand se utilizeaza AJAX, deoarece browserul nu poate tine mereu socoteala modificarilor produse in mod dinamic si asincron. Dezvoltatorii de site-uri au introdus diverse rezolvari pentru aceasta problema, folosind IFRAME-uri invizibile pentru a retine continutul paginii anterioare. Google Maps, de exemplu, face cautarile intr-un IFRAME invizibil si apoi aduce rezultatele in partea vizibila a paginii. In recomandarea XHTML 1.1 a World Wide Web Consortium, organismul care standardizeaza metodele si limbajele utilizate in Internet, se recomanda folosirea elementului object. O alta problema a paginilor dinamice este dificultatea crearii unui link sau bookmark catre o stare particulara a aplicatiei. Solutii au fost gasite prin utilizarea de identificatoare de fragmente URL (portiunea unui URL de dupa un semn “#”), deoarece prin JavaScript se poate modifica adresa paginii prin schimbarea acestui identificator de fragment (se modifica nu doar informatii si portiuni dintr-o pagina, ci si adresa ei). Aceasta solutie ajuta si la problema butonului Back, dar nu este una completa. • Griji pentru timpul de raspuns Modificarea doar a unor portiuni din pagini poate creste totusi timpul aparent de raspuns, deoarece utilizatorul observa mai greu modificarile facute intr-o portiune mica a unei pagini deja incarcate. Se recomanda utilizarea unor indicatori de activitate de procesare, de exemplu celebra clepsidra. • Optimizarea paginilor pentru motoarele de cautare Website-urile care utilizeaza pagini incarcate prin AJAX trebuie sa fie atente sa ofere aceeasi informatie si intr-un format clasic, pentru a putea fi indexat de robotii de citire ai motoarelor de cautare pe Internet. Daca anumite informatii (date, text, imagini) nu apar decat la apelarea unor functii JavaScript prin AJAX, aceste informatii nu vor fi gasite de un motor de cautare deoarece acestea citesc doar textul existent in pagina si nu ruleaza si functiile din ea. 2.5 HTML si CSS 2.5.1 HTML (HyperText Markup Language) HyperText Markup Language (HTML) este un limbaj de marcare utilizat pentru crearea paginilor web ce pot fi afişate într-un browser (sau navigator). Scopul HTML este mai degrabă prezentarea informaţiilor – paragrafe, fonturi, tabele ş.a.m.d. – decât descrierea semanticii documentului. HTML este o formă de marcare orientată către prezentarea documentelor text pe o singura pagină, utilizând un software de redare specializat, numit agent utilizator HTML , cel mai bun exemplu de astfel de software fiind browserul web. HTML furnizează mijloacele prin care conţinutul unui document poate fi adnotat cu diverse tipuri de metadate şi indicaţii de redare. Indicaţiile de redare pot varia de la decoraţiuni minore ale textului, cum ar fi specificarea faptului că un anumit cuvânt trebuie subliniat sau că o imagine trebuie introdusă, până la scripturi sofisticate, hărţi de imagini şi formulare. Metadatele pot include informaţii despre titlul şi autorul documentului, informaţii structurale despre cum este împărţit documentul în diferite segmente, paragrafe, liste, titluri etc. şi informaţii cruciale care permit ca documentul să poată fi legat de alte documente pentru a forma astfel hiperlink-uri (sau web-ul). 29 HTML este un format text proiectat pentru a putea fi citit şi editat de oameni utilizând un editor de text simplu. Totuşi scrierea şi modificarea paginilor în acest fel solicită cunoştinţe solide de HTML şi este consumatoare de timp. Editoarele grafice (de tip WYSIWYG) cum ar fi Macromedia Dreamweaver , Adobe GoLive sau Microsoft FrontPage permit ca paginile web sa fie tratate asemănător cu documetele Word. HTML se poate genera direct utilizând tehnologii de codare din partea serverului cum ar fi PHP , JSP sau ASP . Multe aplicaţii ca sistemele de gestionare a conţinutului , wiki-uri şi forumuri web generează pagini HTML. 2.5.2 CSS (Cascading Style Sheets) CSS (Cascading Style Sheets) este un standard pentru formatarea elementelor unui document HTML. Stilurile se pot ataşa elementelor HTML prin intermediul unor fişiere externe sau în cadrul documentului, prin elementul Folosind aceasta metoda (stilurile interne), fiecare fisier (X)HTML va contine codul CSS folosit la stilizare. Asta inseamna ca atunci cand doriti sa faceti o schimbare de stil (marimea fontului, culoare, etc) va trebui sa operati modificarea in toate paginile ce contin acel stil. Metoda descrisa pana acum este buna atunci cand avem de stilizat doua, trei pagini, insa cand avem de a face cu siteuri de zeci sau sute de pagini este destul de neplacut sa modificam toate paginile. Stilurile externe In continuare vom explora metoda stilurilor externe. Un fisier CSS extern poate fi realizat cu orice editor simplu de text (Notepad, Wordpad, etc) sau cu editoare avansate gen Dreamweaver. Fisierul CSS nu contine sub nici o forma cod (X)HTML, ci doar cod CSS. Fisierul trebie salvat cu extensia .css. Inserarea fisierului extern in paginile (X)HTML se face foarte usor, prin plasarea unui link (legatura) in sectiunea a fiecarei pagini pe care dorim sa folosim stilul respectiv. Iata un exemplu de inserare a unui fisier extern .css intr-o pagina (X)HTML: 30 sau puteti folosi metoda de import dupa cum urmeaza: Oricare dintre metode este buna si se obtine plasand unul dintre codurile de mai sus in sectiunea a paginii, dupa cum exemplificam mai jos: Intretinere mai usoara Dimensiuni reduse ale paginilor Economie de banda internet Flexibilitate 2.6 Apache Web Server Apache este principalul tip de server folosit pe Internet la ora actuala, constituind o componenta cheie a infrastructurii acestuia. Cea mai importanta caracteristica a unui server web este de traduce un URL intr-un nume de fisier si apoi sa-l trimita inapoi prin Internet, sau intr-un nume de program, apoi sa ruleze programul si sa transmita datele de iesire catre calculatorul sursa. Apache este un server web foarte complex, in principal datorita numeroaselor facilitati pe care le ofera: fiabilitate (fiind un program open-source este permanent testat si imbunatatit), rapiditate, consum mic de resurse hardware, multitasking, virtual hosts, securitate sporita, ruleaza pe diferite platforme, usor de configurat. Apache HTTP Server este un web server pentru sisteme ca si Unix, Microsoft Windows, Novell NetWare si alte sisteme de operare . Apache este remarcabil pentru ca joaca un 31 rol cheie in cresterea initiala a Internetului din lumea intreaga. Cand a fost pentru prima data eliberat, Apache a fost singura sursa alternativa viabila la Netscape Communications Corporation web server ( in mod current cunoscut ca si Sun Java System Web Server ). De atunci a evoluat la rivalul Unix- servere web in termeni de functionalitate si performanta. Din Aprilie 1996 Apache a fost cel mai popular server HTTP din intreaga lume a internetului, servind ca platforma de referinta impotriva careia alte server web sunt intentionate si apreciate; ca si in Ianuarie 2007, Apache a servit la 60% din toate website-urile. Apache continua sa fie cel mai popular server web care este utilizat. Apache este dezvoltat si mentinut de o comunitate deschisa de dezvoltatori de aplicatii sub auspiciile Fundatiei Apache Software. Eliberata sub licenta Apache, serverul Apache HTTP este un program gratis. Istoria Prima versiune a web serverului Apache a fost creeata de Robert McCool, care a fost serios implicat in Centru National pentru Supercomputing Applications web server, cunoscut simplu ca si NCSA HTTPd . Cand Rob a parasit NCSA la mijlocul anului 1994 a lasat o varietate de modele pentru a imbunatati circulatia prin email. Rob McCool nu a fost singur in eforturile sale. Multi alti dezvoltatori de aplicatii au ajutat la formarea originalului "Apache Group": Brian Behlendorf, Roy T. Fielding, Rob Hartill, David Robinson, Cliff Skolnick, Randy Terbush, Robert S. Thau, Andrew Wilson, Eric Hagberg, Frank Peters, si Nicolas Pioch. FAQ afirma pe site-ul oficial al proiectului: “Numele Apache a fost ales din respect pentru Tribul nativ indian American al apasilor “, bine cunoscut pentru indemanarile superioare in strategia lor si inepuizabila anduranta. Cea mai raspandita interpretare este aceea ca numele provine din faptul ca atunci cand a aparut la inceputul anului 1995, web serverul a constat intr-un set de patches la codul de baza al NCSA HTTPd 1.3 si de aceea a fost "a patchy" server .Aceasta a fost explicatia initiala a website-ului acestui proiect. Versiunea 2 a serverului Apache a fost o rescriere substantiala din codul Apache 1.x, cu o mare concentrare asupra ulterioarei modulatii si dezvoltarea unei retele portabile ,Apache Portable Runtime. Partea centrala din Apache 2 x are mai multe intensificari majore fata de Apache 1.x . Acestea include filetarea UNIX, suport mai bun pentru platforme non-UNIX , (cum ar fi Microsoft Windows), un nou Apache API, si suport IPv6 . Prima eliberare a Apache 2 a fost in Martie 2000 cu prima disponibilitate generala in Mai 2002. 2.7 UML Tendinţa actuală din industria software impune dezvoltarea de sisteme extrem de complexe şi în cel mai scurt timp posibil. Se impune cu necesitate adaptarea procesului de dezvoltare a sistemelor informatice la cerinţele din ce în ce mai complexe faţă de produsele informatice. În plus, odată cu impunerea pe piaţă a limbajelor orientate obiect şi a mediilor vizuale de programare, au apărut în ultimii ani mai multe propuneri de procese de dezvoltare orientată obiect a sistemelor informatice, ceea ce a introdus încă o picătură de haos în ecuaţie. UML-ul reprezintă o sinteză a celor mai multe notaţii şi concepte utilizate în proiectarea orientată obiect. A început ca o coroborare a activităţii lui Grady Booch, James Rumbaugh, şi Ivar Jacobson, creatorii a trei dintre cele mai cunoscute metodologii orientate obiect. UML propune notaţii standard şi semantică corespunzătoare pentru modelarea sistemelor orientate obiect. Înainte de aceasta un proiect orientat obiect putea fi descris utilizând una dintre zecile de metodologii disponibile, ceea ce făcea ca în cazul unei revizuiri cei responsabili de 32 aceasta să piardă mult timp cu analiza notaţiilor şi semanticii metodologiei înainte de a pătrunde logica proiectării. În acest moment, utilizând UML, diferiţi proiectanţi ce lucrează la diverse sisteme pot înţelege cu uşurinţă munca celuilalt. UML-ul prescrie un set standard de diagrame şi notaţii pentru analiza şi proiectarea orientată obiect a diverselor tipuri de sisteme (sisteme software, sisteme hardware sau organizaţii), descriind totodată şi semantica acestor diagrame şi simboluri. Limbajul unificat de modelare oferă pentru aceasta zece tipuri de diagrame ce pot fi grupate astfel: Diagramă pentru modelarea proceselor de afaceri, respectiv: Diagrama cazurilor de utilizare – în cazul metodologiilor orientate pe cazuri de utilizare, această diagramă dirijează întreg procesul de dezvoltare al sistemului Diagrame pentru modelarea structurii statice, respectiv: Diagrama claselor – pentru modelarea structurii statice a claselor sistemului Diagrama obiectelor – pentru modelarea structurii statice a obiectelor sistemului Diagrame pentru modelarea dinamicii: Diagrame de interacţiune, respectiv: Diagrama de secvenţă – pentru modelarea circuitului mesajelor între obiecte Diagrama de colaborare – pentru modelarea interacţiunilor între obiecte Diagrame de comportament, respectiv: Diagrama de stare – pentru modelarea comportamentului obiectelor din sistem Diagrama de activitate - pentru modelarea comportamentului cazurilor de utilizare, obiectelor sau operaţiilor Diagrame de implementare, respectiv: Diagrama componentelor – pentru modelarea componentelor Diagrama de desfăşurare – pentru modelarea distribuirii sistemului Diagrama pachetelor – mijloc de grupare a elementelor diagramelor în pachete În figura de mai jos se prezintă grafic această clasificare a diagramelor UML. Mecanismele de extensibilitate incluse permit ca în UML să poată fi abordate aspecte care nu sunt specificate în standard. Aceste mecanisme permit extinderea notaţiilor şi semanticii UML. Stereotipul este cel mai utilizat dintre mecanismele de extensibilitate ale UML-ului. Un stereotip reprezintă un mecanism de calificare din punct de vedere al utilizării. El se poate aplica oricărui element de modelare, inclusiv claselor, pachetelor, relaţiilor de moştenire, etc. De exemplu, o clasă cu stereotipul < 33 Figura nr. 2.5 Cap. 3: Proiectarea bazei de date Diagrama bazei de date 34 relatie_teste_categorii intrebari PK relatie_intrebari_categorii istoric_intrebari id_intrebare continut varianta_raspuns_ 1 varianta_raspuns_ 2 varianta_raspuns_ 3 varianta_raspuns_ 4 varianta_raspuns_ 5 id_raspuns_1 id_raspuns_2 id_raspuns_3 id_raspuns_4 id_raspuns_5 activ utilizator data_sistem raspuns_corect FK1 id_test id_categorie pondere FK1 categorii PK id_categorie FK1 id_parent nume activ id_test denumire data_start_interval data_stop_interval nr_intrebari activ data_sistem utilizator secunde_intrebare activare_hr FK1 id_categorie id_intrebare relatie_categorii_supervizori FK2 FK1 utilizator id_categorie FK2 teste_definite_supervizor PK FK2 FK1 id_intrebare continut varianta_raspuns _1 varianta_raspuns _2 varianta_raspuns _3 varianta_raspuns _4 varianta_raspuns _5 id_raspuns_1 id_raspuns_2 id_raspuns_3 id_raspuns_4 id_raspuns_5 activ utilizator data_sistem raspuns_corect utilizatori PK PK FK1 id_utilizator utilizator parola denumire email tip_utilizator id_categorie activ data_sistem relatie_teste_angajat _intrebari teste_angajat PK FK1 FK2 id_test_angajat id_intrebare raspuns_corect raspuns _angajat FK1 id_test_angajat id_test data_inceput_test data_sfarsit_test utilizator raspunsuri _corecte procentaj current _session anulat cursuri_continut_detaliat subiecte PK PK PK id_subiect FK1 FK1 cursuri id_pagina denumire id_curs nivel utilizator data_sistem PK id_curs nr_pagina continut FK1 cursuri_continut_detaliat1 subiecte_detaliat PK FK1 FK2 id_comentariu intrebari _quiz id_curs denumire nr_slideuri descriere activ utilizator data_sistem PK id_fisier FK1 FK1 id_curs fisier data_sistem FK2 id_intrebare_quiz continut varianta_raspuns _1 varianta_raspuns _2 varianta_raspuns _3 varianta_raspuns _4 varianta_raspuns _5 id_curs activ utilizator data_sistem raspuns_corect comentariu id_subiect nivel utilizator data_sistem Figura nr 3.1 Tabela „categorii” 35 CAMP id_categorie id_parent Nume Activ TIP Integer Integer varchar(255) integer NULL Nu Nu Nu Nu SETARE DE BAZA 0 1 36 Scop: In tabela „categorii” vor fi stocate departamentele(sub-departamentele) intr-o structura arborescenta. Observatii: 1. id_categorie este cheie primara. 2. id_parent – reprezinta id-ul „parintelui” departamentului in cauza (id_parent=0 reprezinta primul nivel). 3. nume – denumirea departamentului (sub-departamentului). Constrangeri: • CONSTRAINT categorii_pkey PRIMARY KEY (id_categorie) CONSTRAINT activ_categorii CHECK (activ = 0 OR activ = 1) • CREATE INDEX id_parent ON categorii USING btree (id_parent); • Indecsi: Tabela „intrebari” CAMP TIP NULL id_intrebare integer Nu Continut text Nu varianta_raspuns_1 text Nu varianta_raspuns_2 text Nu varianta_raspuns_3 text Nu varianta_raspuns_4 text Nu varianta_raspuns_5 text Nu id_raspuns_1 char(1) Nu id_raspuns_2 char(1) Nu id_raspuns_3 char(1) Nu id_raspuns_4 char(1) Nu id_raspuns_5 char(1) Nu Activ integer Nu Utilizator varchar(100) Nu data_sistem timestamp Nu raspuns_corect char(1) Nu Scop: In tabela „intrebari” vor fi stocate intrebarile introduse variante de raspuns, raspuns corect etc...) SETARE DE BAZA A B C D E 1 now() de catre utilizatori (continut, Observatii: 37 1. id_intrebare este cheie primara; 2. continut – reprezinta continutul intrebarii; 3. varianta_raspuns_1 .. varianta_raspuns_5 – reprezinta variantele de raspuns; 4. activ – in momentul in care o intrebare devine inactiva, ea nu va fi stearsa din baza de date, in schimb campul „activ” va lua valoarea 0. 5. utilizator – reprezinta username-ul utilizatorului care a introdus intrebarea. 6. raspuns_corect - reprezinta varianta de raspuns corespunzatoare • • • Constrangeri: CONSTRAINT intrebari_pkey PRIMARY KEY (id_intrebare) CONSTRAINT check_activ CHECK (activ = 0 OR activ = 1), CONSTRAINT check_intrebari CHECK (raspuns_corect = 'A'::bpchar OR raspuns_corect = 'B'::bpchar OR raspuns_corect = 'C'::bpchar OR raspuns_corect = 'D'::bpchar OR raspuns_corect = 'E'::bpchar) Indecsi: • CREATE INDEX utilizator_intr ON intrebari USING btree (utilizator); Tabela „istoric_intrebari ” CAMP TIP NULL id_istoric integer Nu id_intrebare Continut varianta_raspuns_1 varianta_raspuns_2 varianta_raspuns_3 varianta_raspuns_4 varianta_raspuns_5 id_raspuns_1 id_raspuns_2 id_raspuns_3 id_raspuns_4 id_raspuns_5 Activ Utilizator Data_sistem raspuns_corect integer text text text text text text char(1) char(1) char(1) char(1) char(1) integer varchar(100) timestamp char(1) Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu SETARE DE BAZA A B C D E 1 now() Scop: In tabela „istoric_intrebari” vor fi stocate istoricul modificarilor pentru intrebarile introduse de catre utilizatori (continut, variante de raspuns, raspuns corect etc...) Constrangeri: • CONSTRAINT istoric_intrebari_pkey PRIMARY KEY (id_istoric), 38 • • • CONSTRAINT fk_istoric_intrebari FOREIGN KEY (id_intrebare) REFERENCES intrebari (id_intrebare) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT check_activ_istoric CHECK (activ = 0 OR activ = 1), CONSTRAINT check_istoric_intrebari CHECK (raspuns_corect = 'A'::bpchar OR raspuns_corect = 'B'::bpchar OR raspuns_corect = 'C'::bpchar OR raspuns_corect = 'D'::bpchar OR raspuns_corect = 'E'::bpchar) Indecsi: • • CREATE INDEX id_intrebare_istoric ON istoric_intrebari USING btree (id_intrebare); CREATE INDEX utilizator_istoric ON istoric_intrebari USING btree (utilizator); Tabela „relatie_categorii_supervizori ” CAMP Utilizator id_categorie TIP varchar(100) integer NULL Nu Nu SETARE DE BAZA 0 Scop: In tabela „relatie_categorii_supervizori” vor fi stocate id-urile departamentelor care se afla in subordinea unui supervizor. Constrangeri: CONSTRAINT fk_categorii FOREIGN KEY (id_categorie) REFERENCES categorii (id_categorie) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE • Indecsi: • • CREATE INDEX id_categorie_r_c ON relatie_categorii_supervizori USING btree (id_categorie); CREATE INDEX utilizator_r_c ON relatie_categorii_supervizori USING btree (utilizator); Tabela „relatie_intrebari_categorii ” CAMP id_intrebare id_categorie TIP integer integer NULL Nu Nu SETARE DE BAZA 0 0 Scop: In tabela „relatie_intrebari_categorii” vor fi stocate legaturile dintre intrebari si departamente(sub-departamente etc...). O intrebare poate salvata pentru unul sau mai multe departamente. Constrangeri: 39 • • • CONSTRAINT fk_id_categorie FOREIGN KEY (id_categorie) REFERENCES categorii (id_categorie) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; CONSTRAINT fk_id_intrebare FOREIGN KEY (id_intrebare) REFERENCES intrebari (id_intrebare) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION; CONSTRAINT relatie_intrebari_categorii_id_categorie_key UNIQUE (id_categorie, id_intrebare) Indecsi: • • CREATE INDEX id_categorie_r_i ON relatie_intrebari_categorii USING btree (id_categorie); CREATE INDEX id_intrebare_r_i ON relatie_intrebari_categorii USING btree (id_intrebare); Tabela „relatie_teste_angajat_intrebari ” CAMP id_test_angajat id_intrebare raspuns_corect raspuns_angajat TIP integer integer char(1) char(1) NULL Nu Nu SETARE DE BAZA 0 0 Scop: In tabela „relatie_teste_angajat_intrebari” vor fi stocate raspunsurile la intrebarile unui test efectuat de catre angajat. Observatii: Pentru fiecare intrebare se vor salva raspunsul corect al intrebarii si raspunsul efectuat de catre angajat. Constrangeri: CONSTRAINT fk_id_test_angajat FOREIGN KEY (id_test_angajat) REFERENCES teste_angajat (id_test_angajat) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; CONSTRAINT fk_intrebari_angajat FOREIGN KEY (id_intrebare) REFERENCES intrebari (id_intrebare) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION; CONSTRAINT check_raspuns_angajat CHECK (raspuns_angajat = 'A'::bpchar OR raspuns_angajat = 'B'::bpchar OR raspuns_angajat = 'C'::bpchar OR raspuns_angajat = 'D'::bpchar OR raspuns_angajat = 'E'::bpchar); CONSTRAINT check_raspuns_corect CHECK (raspuns_corect = 'A'::bpchar OR raspuns_corect = 'B'::bpchar OR raspuns_corect = 'C'::bpchar OR raspuns_corect = 'D'::bpchar OR raspuns_corect = 'E'::bpchar) • • • • Indecsi: CREATE INDEX id_intrebare_r_t ON relatie_teste_angajat_intrebari USING btree (id_intrebare); • 40 CREATE INDEX id_test_angajat_r_t ON relatie_teste_angajat_intrebari USING btree (id_test_angajat); • Tabela „relatie_teste_categorii ” CAMP id_test id_categorie Pondere TIP integer integer float NULL Nu Nu Nu SETARE DE BAZA 0 0 0.00 Scop: In tabela „relatie_teste_categorii” se vor stoca id-urile categoriilor din care este „compus” un test definit de catre supervizor. Observatii: In momentul care se defineste un test de catre supervizor, pentru fiecare categorie se va preciza pondere (in procente), suma ponderilor fiind egala cu 100. Constrangeri: CONSTRAINT fk_id_categorie FOREIGN KEY (id_categorie) REFERENCES categorii (id_categorie) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; CONSTRAINT fk_id_test FOREIGN KEY (id_test) REFERENCES teste_definite_supervizor (id_test) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE; • • Indecsi: CREATE INDEX id_categorie_r_t ON relatie_teste_categorii USING btree (id_categorie); CREATE INDEX id_test_r_t ON relatie_teste_categorii USING btree (id_test); • • Tabela „teste_angajat” CAMP id_test_angajat id_test Data_inceput_test Data_sfarsit_test Utilizator raspunsuri_corecte Procentaj current_session Anulat TIP integer integer timestamp timestamp varchar(100) integer float varchar(100) integer NULL Nu Nu Nu Nu Nu Nu Nu Nu Nu SETARE DE BAZA 0 now() now() 0 0.00 0 Scop: In tabela „teste_angajat” se vor salva detaliile unui test efectuat de catre angajatul Credit Europe Bank. 41 Observatii: 1. id_test – reprezinta id-ul testului definit de catre „Supervizor” 2. data_inceput_test, data_sfarsit_test – reprezinta data inceperii si terminarii testului. 3. utilizator – username-ul angajatului care efectueaza testul. 4. raspunsuri_corecte – numarul de raspunsuri corecte. 5. anulat – default este setat pe 0. In momentul care un angajat doreste anularea testului, atunci campul anulat va lua valoarea 1. Constrangeri: CONSTRAINT teste_angajat_pkey PRIMARY KEY (id_test_angajat); CONSTRAINT teste_angajat_id_test_fkey FOREIGN KEY (id_test) REFERENCES teste_definite_supervizor (id_test) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION; • • Indecsi: • CREATE INDEX id_test_t_a ON teste_angajat USING btree (id_test); Tabela „teste_definite_supervizor ” CAMP id_test Denumire data_start_interval data_stop_interval nr_intrebari Activ data_sistem Utilizator secunde_intrebare activare_hr TIP integer varchar(100) date date integer integer timestamp varchar(100) integer integer NULL Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu SETARE DE BAZA (‚now’::text)::date (‚now’::text)::date 0 0 now() 60 0 Scop: In tabela „teste_definite_supervizor” se vor stoca setarile testelor definite de catre „Supervizor”. Observatii: 1. denumire – reprezinta denumirea testului definit de catre „Supervizor”. 2. data_start_interval, data_stop_interval – reprezinta perioada cat timp va fi activ testul. 3. nr_intrebari – reprezinta numarul de intrebari din care va fi compus testul 4. secunde_intrebare – numarul de secunde per intrebare. In cazul in care utilizatorul nu va raspunde in timp util aplicatia va trece automat mai departe. 5. activare_hr – in cazul in care „Supervizor” va bifa acest camp atunci utilizatorii Departamentului HR vor avea posibilitatea sa vizualizeze rezultatele testelor efectuate de catre angajati. Constrangeri: • CONSTRAINT id_test PRIMARY KEY (id_test) 42 Indecsi: • CREATE INDEX utilizator_t_d ON teste_definite_supervizor USING btree (utilizator); Tabela „utilizatori” CAMP id_utilizator utilizator parola denumire email tip_utilizator id_categorie activ data_sistem TIP integer varchar(100) varchar(100) varchar(100) varchar(100) integer integer integer timestamp NULL Nu Nu Nu Nu Nu Nu Nu Nu Nu SETARE DE BAZA 0 0 1 now() Scop: In tabela „utilizatori” se vor stoca datele referitoare la conturile utilizatorilor care vor folosi aplicatia e-Learning. Observatii: 1. tip_utilizator – reprezinta nivelul de acces al utilizatorului 2. id_categorie – reprezinta id-ul departamentului in cazul in care nivelul de acces este „Sef Departament”, in caz contrar campul va lua valoarea 0. 3. activ – 1- utilizator activ 2- utilizator inactiv. Constrangeri: • CONSTRAINT utilizatori_pkey PRIMARY KEY (id_utilizator); CONSTRAINT utilizatori_tip_utilizator_key UNIQUE (tip_utilizator, utilizator); • CREATE INDEX id_categorie_u ON utilizatori USING btree (id_categorie); • Indecsi: Tabela „cursuri” CAMP id_curs Denumire nr_slideuri descriere utilizator activ data_sistem TIP integer varchar(300) integer text varchar(100) integer timestamp NULL Nu Nu Nu Da Nu Nu Nu SETARE DE BAZA 0 0 1 now() 43 Scop: In tabela „cursuri” se vor utilizatorii „Sef-Departament”. Observatii: 1. utilizator. 2. cursul. 3. stoca datele statice referitoare la cursuri introduse de catre denumire – reprezinta denumirea cursului introdus de catre nr_slideuri – reprezinta numarul de slideuri ce caracterizeaza descriere – reprezinta o scurta descriere a cursului. Constrangeri: • • CONSTRAINT cursuri_pkey PRIMARY KEY (id_curs) CONSTRAINT activ_cursuri_check CHECK (activ = 0 OR activ = 1) Tabela „cursuri_continut_detaliat ” CAMP id_pagina id_curs Continut nr_pagina TIP integer integer text integer NULL Nu Nu Nu Nu SETARE DE BAZA 0 1 Scop: In tabela „cursuri_continut_detaliat ” se va stoca continutul fiecarui slide corespunzator cursului Observatii: 1. continut – reprezinta continutul fiecarui slide. 2. id_curs – reprezinta id-ul cursului pentru care se administreaza continutul detaliat 3. nr_pagina – valori posibile intre 1 si numarul de slide-uri corespunzator cursului. Constrangeri: • • CONSTRAINT cursuri_continut_detaliat_pkey PRIMARY KEY (id_pagina) CONSTRAINT cursuri_continut_detaliat_id_curs_fkey FOREIGN KEY (id_curs) REFERENCES cursuri (id_curs) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE Indecsi: CREATE INDEX id_curs_1 ON cursuri_continut_detaliat USING btree (id_curs); • Tabela „cursuri_materiale_auxiliare ” 44 CAMP id_fisier id_curs Fisier data_sistem TIP integer integer varchar(500) timestamp NULL Nu Nu Nu Nu SETARE DE BAZA 0 now() Scop: In tabela „cursuri_materiale_auxiliare ” se vor stoca fisierele auxiliare uploadate pentru fiecare curs. Observatii: 1. fisier – reprezinta numele fisierului uploadat. 2. id_curs – reprezinta id-ul cursului pentru care se uploadeaza fisiere auxiliare. Constrangeri: • • CONSTRAINT cursuri_materiale_auxiliare_pkey PRIMARY KEY (id_fisier) CONSTRAINT cursuri_materiale_auxiliare_id_curs_fkey FOREIGN KEY (id_curs) REFERENCES cursuri (id_curs) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE Indecsi: CREATE INDEX id_curs_2 ON cursuri_materiale_auxiliare USING btree (id_curs); • Tabela „intrebari_quiz” CAMP TIP id_intrebare _quiz Continut varianta_raspuns_1 varianta_raspuns_2 varianta_raspuns_3 varianta_raspuns_4 varianta_raspuns_5 id_curs Activ Utilizator data_sistem raspuns_corect Integer Text Text Text Text Text Text Integer Integer varchar(100) Timestamp char(1) NULL SETARE DE BAZA Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu Nu 0 1 now() 45 Scop: In tabela „intrebari_quiz” vor fi stocate intrebarile introduse de catre utilizatorii „Sef Departament” (continut, variante de raspuns, raspuns corect etc...) – intrebarile vor alcatui testul de verificare pentru fiecare curs. Observatii: 1. id_intrebare_quiz este cheie primara; 2. continut – reprezinta continutul intrebarii; 3. varianta_raspuns_1 .. varianta_raspuns_5 – reprezinta variantele de raspuns; 4. activ – in momentul in care o intrebare devine inactiva, ea nu va fi stearsa din baza de date, in schimb campul „activ” va lua valoarea 0. 5. utilizator – reprezinta username-ul utilizatorului care a introdus intrebarea. 6. raspuns_corect - reprezinta varianta de raspuns corespunzatoare Constrangeri: • • • • CONSTRAINT intrebari_quiz_pkey PRIMARY KEY (id_intrebare_quiz), CONSTRAINT intrebari_quiz_id_curs_fkey FOREIGN KEY (id_curs) REFERENCES cursuri (id_curs) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE, CONSTRAINT check_activ CHECK (activ = 0 OR activ = 1), CONSTRAINT check_intrebari CHECK (raspuns_corect = 'A'::bpchar OR raspuns_corect = 'B'::bpchar OR raspuns_corect = 'C'::bpchar OR raspuns_corect = 'D'::bpchar OR raspuns_corect = 'E'::bpchar) Indecsi: CREATE INDEX id_curs_3 ON intrebari_quiz USING btree (id_curs); • Tabela „subiecte” CAMP id_subiect id_curs denumire data_sistem nivel utilizator TIP integer integer varchar(500) timestamp Integer Varchar(100) NULL Nu Nu Nu Nu Nu Nu SETARE DE BAZA 0 now() 1 Scop: In tabela „subiecte” se vor stoca subiectele postate de catre utilizatori. Observatii: 1. id_curs – reprezinta id-ul cursului pentru care se vor posta subiecte 2. nivel – reprezinta nivelul de acces al utilizatorului care posteaza subiectele. 46 Constrangeri: • • CONSTRAINT subiecte_pkey PRIMARY KEY (id_subiect), CONSTRAINT subiecte_id_curs_fkey FOREIGN KEY (id_curs) REFERENCES cursuri (id_curs) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE Indecsi: • CREATE INDEX id_curs_4 ON subiecte USING btree (id_curs); Tabela „subiecte_detaliat ” CAMP id_comentariu id_subiect Comentariu data_sistem Nivel Utilizator TIP integer integer text timestamp Integer Varchar(100) NULL Nu Nu Nu Nu Nu Nu SETARE DE BAZA 0 now() 1 Scop: In tabela „subiecte_detaliat ” se vor stoca comentariile introduse pentru fiecare subiect in parte. Observatii: 1. id_subiect – reprezinta id-ul subiectului pentru care se vor posta comentarii 2. comentariu – reprezinta continutul comentariului introdus de utilizator 3. nivel – reprezinta nivelul de acces al utilizatorului care posteaza comentariile. Constrangeri: • • CONSTRAINT subiecte_detaliat_pkey PRIMARY KEY (id_comentariu) CONSTRAINT subiecte_detaliat_id_subiect_fkey FOREIGN KEY (id_subiect) REFERENCES subiecte (id_subiect) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE CASCADE Indecsi: CREATE INDEX id_subiect ON subiecte_detaliat USING btree (id_subiect); • 47 Cap. 4: Prezentarea aplicatiei E-Learning Logarea/delogare in aplicatie Tinand cont de faptul ca in cadrul aplicatiei e-Learning intalnim mai multe nivele de acces, in momentul logarii, utilizatorul va specifica, pe langa username si parola, grupul de care apartine. Figura nr. 4.1 Optiunile definite pentru “Grup” sunt urmatoarele: • • • • • • Angajat Vanzari directe Administrator Supervizor Sef Departament HR (Departamenul Resurse Umane) 48 Daca pentru ultimile cinci optiuni (Vanzari Directe ... HR), in momentul logarii utilizatorul isi va introduce username-ul si parola(default este “123456”) asa cum au fost definite in tabela specifica utilizatorilor aplicatiei, pentru optiunea “Angajat” este necesara introducerea username-ului si a parolei de windows. Tinand cont de cele prezentate mai sus, pentru logarea in aplicatia e-Learning distingem doua cazuri din punctul de vedere al functionalitatii: a) logarea folosind username-ul si parola de windows (Active Directory) Pentru a implementa aceasta functionalitate s-a folosit prin intermediul PHP-ului serviciul LDAP care a fost configurat in prealabil in fisierul php.ini deoarece extensia php_ldap.dll este default dezactivata. LDAP (Lightweight Directory Access Protocol) este un protocol standard, stabilit de Internet Engineering Task Force (IETF), care oferă utilizatorilor unei reţele, posibilitatea de a căuta şi modifica informaţiile dintr-un Directory Service. LDAP gestionează o bază de date object-oriented. Într-o astfel de bază de date, diferenţierea se face cu ajutorul claselor de obiecte si a obiectelor în sine. Baza de date are o structură de tip arbore, iar nivelul de pe cea mai înaltă poziţie se numeste root. În cazul LDAP, root-ul este numit Root DN(Root Distinguished Name). De regulă, se adaugă un sufix la acest root, pentru a defini numele companiei si un cod de ţară. Ex: DC=int, DC=finansbank, DC=ro Pentru a putea utiliza acest serviciu, pe langa definirea DN-ului va trebui specificat si numele sau adresa serverului pe care il vom folosi. Ex: buc-ho-dc.int.finansbank.ro Secventa tipica care trebuie folosita pentru a apela serviciul LDAP este urmatoarea: ldap_connect() Stabilirea conexiunii cu server-ul ldap_bind() Autentificare cu username si parola ldap_close() Inchiderea conexiunii Figura nr. 4.2 b) logarea folosind contul existent in baza de date Utilizatorul va introduce username-ul si parola. Daca verificarea are loc cu succes, se va autentifica utilizatorul in functie de grupul de acces ales, in caz contrar, i se va afişa un mesaj de eroare. 49 Diagrama de activitate: Autentificare Validare Logat Mesaj avertizare Figura nr. 4.3 Structura aplicatiei Structura si functionalitatea aplicatiei deriva din rolurile utilizatorilor acesteia 4.2.1 utilizatorul “Angajat” Cazul de utilizare general pentru utilizatorul „Angajat” Logare aplicatie Efectuare test activ Vizualizare rezultat test Angajat Parcurgere cursuri Participare la discutii Figura nr. 4.4 Utilizatorul „Angajat”, reprezentat prin personalul bancii Credit Europe Bank, se logheaza in cadrul aplicatiei e-Learning prin intermediul user-ului si parolei de windows. După logare intra intr-un panou de administrare care ii oferă următoarele facilitaţi: 50 1. vizualizarea testelor pe care angajatul le-a efectuat de-a lungul timpului. Prin vizualizare se intelege urmatoarele lucruri: vizualizarea procentajului obtinut la testul respectiv (de asemenea utilizatorul poate vizualiza numarul de raspunsuri corecte si gresite); vizualizarea datei efectuarii testului si a timpului de raspuns; vizualizarea „starii” unui test („starea” unui test poate lua doua valori: „Efectuat corect” si „Anulat”. Un test poate trece in starea „Anulat” in momentul in care administratorul IT anuleaza rezultatul obtinut la testul in cauza. Motivele pentru care un test se poate anula sunt determinate de cauze externe aplicatiei e-Learning (blocarea calculatorului, intreruperea curentului etc...) vizualizarea raspunsurilor date de catre angajat precum si a raspunsurilor corecte la intrebarile ce au fost gresite. Testele salvate in istoric vor fi generate pdf, astfel angajatul avand posibilitatea printarii si salvarii pe disk. Trebuie mentionat faptul ca aceeasi intrebare poate avea continut diferit de la un test la altul. Pentru a implementa aceasta functionalitate, se foloseste o tabela pentru a stoca istoricul modificarilor unei intrebari. Astfel, utilizatorul va vizualiza detaliile intrebarilor exact cum au fost generate in test. • • • • 2. efectuarea testului activ In cadrul aplicatiei e-Learning un singur test va fi activ la un moment dat pentru a evita angajarea persoanelor examinate in teste care nu le sunt destinate. In cazul in care angajatul a efectuat testul respectiv, el va avea posibilitatea sa efectueze inca o data testul doar daca administratorul IT ii va anula in baza de date rezultatul anterior. In cadrul unui test, angajatul va trebui sa raspunda la un numar de intrebari(diferit de la un test la altul) stabilit de catre utilizatorul „Supervizor”. Fiecare intrebare are cinci variante de raspuns, fiind corect doar un singur raspuns. In cazul in care angajatul nu va raspunde in timp util la fiecare intrebare(pentru fiecare test este alocat un numar de secunde per intrebare), aplicatia eLearning va trece automat mai departe, in schimb nu se va lua in considerare nici un raspuns corect. Logare e -Learning Diagrama de activitate : Exista test activ ? NU DA A fost efectuat testul ? DA NU Raspunde intrebare curenta Nr curent DA NU Afisare rezultat test 51 Figura nr. 4.5 In cazul in care testul este efectuat de catre un utilizator „Angajat” care are drepturi de „Supervizor”, acesta va putea sa isi stearga rezultatele testelor doar daca acestea au fost definite de catre el. Scopul efectuarii propriilor teste este de a se asigura ca continutul intrebarilor si variantele de raspuns sunt generate corespunzator. In momentul in care doi sau mai multi utilizatori „Angajat” dau simultan testul, ei nu vor raspunde la aceleasi intrebari, deoarece intrebarile sunt generate aleator din aria corespunzatoare testului. 3. parcurgerea cursurilor existente Utilizatorul “Angajat” va avea posibilitatea sa parcurga si sa acceseze toate cursurile existente in aplicatie. Prin parcurgerea unui curs existent in aplicatia e-Learning se intelege urmatoarele lucruri: parcurgerea cursului detaliat pagina cu pagina. Finalizarea cursului consta in parcurgerea tuturor paginilor. De asemenea, pe masura ce utilizatorul parcurge cursul, va avea posibilitatea sa isi faca “notite” pentru fiecare pagina citita. Ulterior, dupa finalizarea cursului, utilizatorul isi va putea accesa notitele create pentru cursul respectiv. descarcarea materialelor existente pentru fiecare curs (in format .pdf, .doc etc…) dupa parcurgerea integrala a cursului. exprimarea opiniei despre continutul cursului prin vot. • • • Diagrama de activitate : 52 Logare E -Learning Exista curs activ ? NU Selectare curs Cursul a fost parcurs in totalitate ? DA NU Vizualizare notite Parcurgere pagina curenta Creare notite DA Nr curent Exprima opinia prin v ot NU Figura nr. 4.6 4. participarea la discutii legate de cursuri Utilizatorul “Angajat” are posibilitatea participarii la discutii legate de continutul cursurilor. Fiecare utilizator poate deschide un nou subiect legat de un curs sau poate interveni la discutiile deja existente. Cei ce vor raspunde la intrebarile “cursantilor” (in cazul nostru cursantii sunt angajatii Credit Europe Bank) sunt utilizatorii „Sef-Departament”. Supervizorii au posibilitatea sa intervina oricand in discutiile dintre angajati si sefii de departament. 4.2.2 utilizatorul “Vanzari Directe” Utilizatorul „Vanzari Directe”, reprezentat prin personalul departamentului de Vanzari al Credit Europe Bank, va avea aceleasi drepturi ca si utilizatorul „Angajat” (vizualizare rezultate teste, efectuarea testelor active, parcurgerea cursurilor,participarea la discutii), singura diferenta constand in faptul ca acesti angajati nu au cont de windows. Pentru a se putea loga in aplicatia eLearning, administratorul IT le va crea un cont special pe baza de username si parola. 53 4.2.3 utilizatorul „Administrator” Cazul de utilizare general pentru utilizatorul „Administrator” Logare aplicatie Adaugare /editare utilizator Vizualizare istoric intrebari Activare / inactivare test Administrator Schimbare setari cont Rulare rapoarte Figura nr. 4.7 Utilizatorul „Administrator”, reprezentat printr-unul sau mai multi angajati din cadrul Logare ein-Learning departamentului IT, se logheaza cadrul aplicatiei e-Learning prin intermediul unui cont special bazat pe username si parola. După logare intra intr-un panou de administrare in cadrul caruia poate efectua urmatoarele operatii: 1. adaugare/editare utilizatori Exista utilizator ? Editeaza utilizator DA Cu ajutorul acestui meniu, Administratorul aplicatiei e-Learning poate crea noi utilizatori NUin baza de date. Pentru crearea unui utilizator nou, sau edita utilizatorii deja existenti Administratorul va trebui sa completeze urmatoarele informatii: username (denumirea utilizatorului) Completare username , nume angajat , nivel acces nume, prenume angajat nivel acces („Sef Departament”, „Supervizor”, „HR” si „Vanzari Directe”) NU in Nivel cazulacces in care =”Sef nivelul de acces este „Sef Departament”, va trebui specificat de asemenea departamentul pe care il coordoneaza. OBS. Departament” Utilizatorul „Sef Departament” va coordona Nivel un singur departament. NU acces =”Supervizor” in cazul in DA care nivelul de acces este „Supervizor”, va trebui specificat unul sau mai multe departamente pe care acest tip de utilizator le are in Selecteaza Departament subordine. • • • • • DA Diagrama de activitate : Selecteaza Departamentele Salveaza utilizator 54 2. vizualizare istoric intrebari Figura nr. 4.8 Utilizatorul „Administrator” va avea posibilitatea vizualizarii istoricului modificarilor intrebarilor. Informatiile ce vor fi afisate utilizatorului sunt urmatoarele: • • • • • ID si continut intrebare Variante de raspuns precum si raspunsul corect Categoria de care apartine intrebarea Utilizatorul care a adaugat intrebare Data ultimei modificari. In cazul in care o intrebare „a suferit” modificari de-a lungul timpului, utilizatorul va avea posibilitatea vizualizarii tuturor modificarilor fiind evidentiata ultima modificare efectuata asupra intrebarii. 3. activare/inactivare test 55 Utilizatorul „Administrator” este responsabil cu activarea sau inactivarea testelor definite de catre „Supervizor”. Administratorul va vizualiza toate testele existente in baza de date, avand posibilitatea activarii/inactivarii unui test. Informatiile care definesc un test sunt urmatoarele: • • • • • • Denumire test Data inceput perioada test Data sfarsit perioada test Numar de intrebari Numar de secunde per intrebare Utilizatorul care a creat testul 4. rulare rapoarte Administratorul va avea posibilitatea rularii unor rapoarte pentru fiecare test existent in aplicatia e-Learning. Vom descrie functionalitatea acestor rapoarte in sectiunea dedicata utilizatorului „Supervizor”, singura diferenta intre „Administrator” si „Supervizor” constand in faptul ca utilizatorul „Administrator” va putea rula rapoartele pentru fiecare test, in schimb utilizatorul „Supervizor” fiind restrictionat doar la testele introduse de el. 5. schimbare setari cont Tinand cont de faptul ca in afara de utilizatorul „Angajat”, pentru celelalte nivele de acces utilizatorii vor folosi pentru logarea in aplicatia e-Learning conturi existente in baza de date (username si parola), este necesara existenta unei optiuni pentru schimbarea parolei si denumirii utilizatorului. 4.2.4 utilizatorul „Sef Departament” Cazul de utilizare general pentru utilizatorul „Sef Departament” 56 Logare aplicatie Adaugare /Editare capitole Adaugare /Editare Intrebari Sef Departament Administrare cursuri Participare la discutii legate de cursuri Setari Cont Figura nr. 4.9 Utilizatorul „Sef Departament”, reprezentat prin managerii departamentelor sau sefii de echipa din cadrul Credit Europe Bank, se logheaza in cadrul aplicatiei e-Learning prin intermediul unui cont special bazat pe username si parola. Acest tip de utilizator va avea urmatoarele optiuni: 1. adaugarea/editarea/inactivarea de capitole/subcapitole Departament nr 1 Cap 1 Subcap 1 Cap 2 Subcap 2 …... Semnificatie Diagrama: Subcap 3 Departament nr 2 Cap 3 Cap 4 Subcap 4 Departament nr 3 Cap 5 Subcap 5 Subcap 6 Cap 6 Subcap 7 …... Figura nr. 4.10 - primul nivel este format din departamente ce vor fi predefinite, fiecare departament avand unul sau mai multi utilizatori (nivel acces - “Sef Departament”). 57 - Incepand de la nivelul 2 structura diagramei va fi administrata de fiecare utilizator pentru “ramura” sa (department). Pentru a adauga un nou „nod” la structura arborescenta, utilizatorul „Sef Departament” va trebui sa precizeze numele „nodului” si parintele. - Prin nod frunza se intelege urmatorul lucru: nodul care nu prezinta nici un „fiu”. Exemple noduri frunza: Cap3, Subcap1, Subcap3, Subcap5, Subcap6, Subcap7, in schimba Subcap2 si Subcap4 NU sunt noduri frunza. 2. adaugarea/editarea/(in)activarea/stergerea de intrebari - - utilizatorii „Sef Departament” vor adauga/edita intrebari doar pentru departamentul lor si vor avea posibilitatea sa „lege” intrebarile doar de nodurile frunza.. pentru a adauga o intrebare noua, utilizatorul va trebui sa specifice „nodul frunza” precum si continutul intrebarii, cele cinci variante de raspuns si varianta raspunsului corect. Fiecarei intrebari nou introduse i se va aloca automat un ID (astfel vom putea diferentia intrebarile identice dar cu raspunsuri diferite, situatie ce poate aparea in urma schimbarilor normelor/procedurilor). De asemenea utilizatorii vor putea sa „copieze” intrebarile dintr-un „nod frunza” (capitol, subcapitol etc...) intr-un alt „nod frunza”. Legat de editarea/(in)activarea/stergerea intrebarilor, utilizatorii vor avea urmatoarele restrictii: o Pentru stergerea unei intrebari este obligatoriu ca aceasta sa nu fi fost folosita la nici un test. o (in)activarea unei intrebari este posibila in orice moment, cu mentiunea ca intrebarile active se vor vizualiza din alta fereastra. o In cazul in care utilizatorul va edita o intrebare, continutul va fi salvat in tabela „istoric” precum si data modificarii. In cazul in care un angajat va efectua un test iar continutul unor intrebari din cadrul testului respectiv vor fi modificate, atunci angajatul va avea posibilitatea vizualizarii intrebarilor asa cum au fost generate in test. Utilizatorii „Sef Departament” vor avea posibilitatea sa genereze pdf-uri cu toate intrebarile din fiecare „nod frunza” pentru o mai buna vizualizare a acestora. In figura de mai jos este prezentata un exemplu de „ramura” pentru utilizator „Sef Departament”. 58 Figura nr. 4.11 3. administrare continut cursuri Utilizatorul „Sef Departament” este cel responsabil de administrarea continutului unui curs. In cazul in care se doreste introducerea unui curs se vor specifica urmatoarele campuri: • • • • denumirea cursului o scurta descriere a cursului (prefata) prezentarea detaliata a cursului.Utilizatorul va fi nevoit sa introduca cursul slide cu slide, ulterior avand posibilitatea editarii slide-urilor introducerea testului de verificare.Fiecare intrebare va avea, ca si in cazul testelor reale, 5 variante de raspuns si un singur raspuns corect, cu precizarea ca se va indica si pagina unde se gaseste raspunsul. Scopul acestui test este de a veni in sprijinul angajatilor pentru o rapida asimilare a cunostintelor. 59 • uploadarea de fisiere (in format .pdf, .doc etc...) care sa vina in completarea cursului. Tinand cont de faptul ca angajatii au posibilitatea de a-si exprima opiniile legate de continutul cursurilor, utilizatorii „Sef-Departament” vor vizualiza rezultatele voturilor legate de cursurile pe care le administreaza. 4. participare la discutii Pe langa faptul ca sunt responsabili de administrarea continutului unui curs, utilizatorii „Sef-Departament” vor avea ca sarcina sa raspunda la intrebarile venite din partea angajatilor. De asemenea, sefii de departament vor putea deschide subiecte noi legate de anumite aspecte ale continutului unui curs. 4.2.5 utilizatorul „Supervizor” Cazul de utilizare general pentru utilizatorul „Supervizor” Logare aplicatie Adaugare/Editare capitole Adau gare/Editare Intrebari Adaugare Teste Rulare Rapoarte Supervizor Setari Cont Figura nr. 4.12 Utilizatorul „Supervizor”, reprezentat prin senior managerii din cadrul Credit Europe Bank, se logheaza in cadrul aplicatiei e-Learning prin intermediul unui cont special bazat pe username si parola. Acest tip de utilizator va avea urmatoarele optiuni: 1. verificarea activitatii utilizatorului „Sef-Departament” 60 - utilizatorul „Supervizor” va avea in subordine unul sau mai multe departamente descrise in figura nr. .Astfel, utilizatorul are posibilitatea sa verifice datele introduse in aplicatie de catre utilizatorul „Sef-Departament”: capitole, intrebari etc... - Supervizor are aceleasi optiuni ca si seful de departament cu mentiunea ca el controleaza unul sau mai multe departamente. In cazul in care informatiile introduse de catre utilizatorul „Sef Departament” sunt gresite, Supervizorul va avea posibilitatea sa le editeze. 2. definirea unui test Utilizatorul „Supervizor” are posibilitatea definirii testelor ce urmeaza sa fie parcurse de catre angajati. Initial testele sunt inactive, fiind ulterior activate de catre utilizatorul „Administrator”. Prin definirea unui test se intelege urmatoarele: - alegerea de „noduri frunza” (capitole, subcapitole etc...) Figura nr. 4.13 - Definirea de ponderi pentru fiecare „nod frunza”, suma tuturor ponderilor fiind 100%. Stabilirea numarului total de intrebari ce va contine testul. Stabilirea numarului de secunde per intrebare. Specificarea faptului daca utilizatorii din cadrul departamentului de Resurse Umane au sau nu acces la rezultatele acestui test. 61 - Intervalul de timp ales pentru test va fi doar o sugestie pentru programarea de catre „administrator” a testelor, deoarece exista posibilitatea ca in acelasi interval sa fie mai multe teste cerute pentru activare. In momentul realizarii structurii unui test (prin structura ne referim la „nodurile frunza” alese), utilizatorul „Supervizor” va avea posibilitatea sa genereze un pdf cu totalitatea intrebarilor ACTIVE din categoriile ales pentru test. Diagram de activitate: Alegerea de „noduri frunza” Stabilirea numarului total de intrebari Stabilirea numarului de secunde per intrebare Stabilirea intervalului de timp pentru test Introducerea ponderilor pentru fiecare „nod frunza” Suma ponderi != 100 NU DA Nr intreb nod frunza_i< NU pondere_i*nr_total_intreb DA 3. rularea de rapoarte Figura nr. 4.13 Utilizatorul „Supervizor” poate rula in cadrul aplicatiei „e-Learning” urmatoarele rapoarte: 62 - lista teste - In cadrul acestui raport, utilizatorul are posibilitatea vizualizarii tuturor testelor efectuate de catre angajati precum si a detaliilor pentru fiecare test: nume angajat, denumire test, numar total intrebari, procentaj obtinut, data incepere test, durata. In cazul in care se doreste, lista poate fi filtrata dupa: interval de timp, username angajat si denumire test. Utilizatorul „Supervizor” poate exporta rezultatele filtrate intr-un fisier .csv. De asemenea pentru fiecare test efectuat de catre angajat, Supervizorul are posibilitatea generarii unui pdf detaliat cu intrebarile corespunzatoare testului in cauza. Pentru fiecare intrebare se prezinta raspunsul corect si raspunsul dat de catre angajat. - evolutie angajat – Utilizatorul „Supervizor” poate vizualiza pentru fiecare angajat evolutia activitatii (atat sub forma grafica cat si sub forma de raport generat in pdf). Figura nr. 4.14 - raport detaliat per test ID intrebare 1 2 3 4 5 7 8 Corecte Durata 63 bogdan.ciocan Total intrebari Total gresite Raspuns A(%) C D E 0 0 0 1 1 0.00 1 1 0.00 1 1 0.00 1 0 0.00 0 0 0 1 1 0.00 Raspuns B(%) 0 0.00 0.00 0.00 0 100.00 Raspuns C(%) Raspuns D(%) Raspuns E(%) Fara raspuns(%) 0 0 0 0.00 100.0 0 0.00 0.00 100.00 0.00 0.00 0 0 0 0.00 0.00 0.00 0 0.00 0.00 0 0.00 0.00 0.00 100.00 0.00 0.00 100.00 0.00 0.00 C B 1 00:00:12 Tabel nr 4.1 Semnificatie tabel: - pe prima linie se vor genera id-urile tuturor intrebarilor corespunzatoare categoriilor ce definesc testul in cauza (in cazul nostru avem intrebarile cu id-urile de la 1 la 8). - pe liniile urmatoare se vor genera raspunsurile oferite de catre angajatii care au completat testul (in cazul de fata avem un singur angajat care a efectuat testul) precum si a numarului de raspunsuri corecte si durata testului. OBS. In cazul in care in cadrul unei intrebari nu avem nici un raspuns dat de catre angajat , se va complate X iar daca intrebarea nu a fost generata in testul respectiv atunci se lasa spatiu liber. - total intrebari – pentru fiecare intrebare se va calcula numarul aparitiilor in testele date de catre angajati. - total gresite – pentru fiecare intrebare se va calcula numarul de raspunsuri gresite. - raspuns A ... E, fara raspuns – pentru fiecare intrebare se va calcula ponderea fiecarei variante de raspuns (de la A la E) precum si ponderea pentru intrebarile la care nu s-a dat nici un raspuns. Rapoartele prezentate mai sus pot fi rulate doar pentru testele ce au fost definite de catre supervizorul respectiv, neexistand posibilitatea rularii rapoartelor pentru teste definite de catre alti supervizori. 4.2.6 utilizatorul „HR” Utilizatorul HR reprezentat de catre angajati din cadrul departamentului de Resurse Umane are posibilitatea rularii in aplicatia e-Learning de rapoarte similare celor destinate utilizatorului „Supervizor”, cu mentiunea ca utilizatorul HR va rula rapoartele pentru testele care au bifata optiunea „Test prin HR”. Utilizatorul HR va avea acces la toate testele care au bifata aceasta optiune, indiferent de utilizatorul care a definit testul. 4.3 Proiectarea sistemului informatic Diagrama de componente 64 Baza de Date Angajati Credit Europe Bank Aplicatia E-Learning Figura nr 4.15 Sistemul conceput are următoarele componente: - baza de date cu informaţiile despre utilizatori, intrebari, teste si cursuri; - proced proceduri uri ce sun suntt respo responsa nsabil bilee cu valida validarea rea date datelo lor; r; formulare ce asigura asigura înregistr înregistrarea area intrebari intrebari,test ,testee si cursuri cursuri noi, cat si formulare formulare - formulare spec specif ific icee part partii ii de admi admini nist strar raree a apli aplica cati tiei ei(i (inr nreg egis istr trar area ea de util utiliz izat ator orii noi, noi, modificarea setarilor contului); - interfaţa prietenoasa cu utilizatorii, fie ca sunt angajati care efectueaza testele sau parcurg parcurg cursuril cursurilee existent existentee sau administ administrator ratorii ii aplicatie aplicatieii care seteaza seteaza continut continutul ul testelor sau a cursurilor; - gen generat eratoa oare re de de rapo rapoar artte. Diagrama de desfasurare Baza de Date Client Server Figura nr 4.16 4.4 Dezvoltari ulterioare 65 Exista numeroase imbunatatiri care pot fi aduse aplicatiei. Tinand cont de faptul ca aplicatia e-Learning prezentata mai sus contine doar doua componente folosite la managementul unui sistem de educatie la distanta: - component componentaa e-Testin e-Testingg (administ (administrarea rarea contin continutul utului ui intreba intrebarilor rilor,, variantel variantelor or de raspun raspuns, s, administrarea continutului continutului unui test etc...); continutului educational; - componenta de management a continutului se pot dezvolta si alte componente cum ar fi: - Sisteme Sisteme pentru pentru man manageme agementul ntul informaţ informaţiilo iilorr (Manageme (Management nt Informati Information on System System – MIS).Acestea se referă la diferite activităţi efectuate de secretariat, bibliotecă şi sistemul administrativ; administrativ; creareaa unu unuii me mediu diu virtu virtual al intera interacti ctiv, v, de exem exemplu plu o clasă clasă de cursur cursuri, i, în care care - creare participanţii să se simtă cât mai aproape de una reală. În acelaşi timp, chiar anumite obiecte parte dintr-un curs tehnic de exemplu, pot fi vizualizate 3D. Pe langa adaugarea de noi module, se pot aduce imbunatatiri celor existente: - implemen implementarea tarea unei unei facili facilitati tati pent pentru ru uploadar uploadarea ea continu continutulu tuluii unui unui test test sau a unui unui curs prin intermediul unui fisier XML. - Integrarea Integrarea in cadrul cadrul aplicati aplicatiei ei a unui unui messenge messengerr online online disponi disponibil bil pentru pentru cursanti. cursanti. - Imple Implemen mentar tarea ea de noi rapoart rapoartee care sa evidenti evidentieze eze inform informati atiii precum: precum: numaru numarull si timpul utilizarii aplicatiei de catre cursanti, timpul parcurgerii unui curs etc... CONCLUZII Cresterea continua a volumului de informatii si utilizarea tehnologiilor moderne necesita acumularea si intelegerea unui numar tot mai mare de cunostinte si de informatii, de catre tot mai 66 multi oameni. Tehnicile moderne de invatare, pentru a fi eficiente, trebuie sa aiba un anumit grad de interactivitate cu subiectul uman si sa transmita informatia pe mai multe canale (text, sunet si imagine) intr-o maniera asociata. Forma nu trebuie sa fie excesiv de variata, dar suficient de adaptata continutului, pentru a transmite ideile cât mai firesc. Dezvoltarea exploziva a Internetului si a tehnologiilor Web a creat premisele unor oportunitati si unor noi provocari pentru relatiile dintre oameni. In aceasta noua economie digitala, exista pericolul ca o institutie sa constate ca nu poate face fata avalansei se informatii si ca propria retea Intranet a ajuns la un nivel de saturare, care nu ii mai poate asigura gestionarea eficienta a datelor. Pentru a ramâne in “business”, o astfel de organizatie nu trebuie decât sa implementeze implementeze un portal care sa ii permita optimizarea sigura si scalabila a accesului la informatie, precum si o administrare centralizata a tuturor serviciilor prin intermediul unui simplu Browser. Intr-un studiu IDC (International Data Corporation), se estimeaza ca din ce in ce mai multe companii mari si de marime medie isi vor construi portaluri de corporatie. Astfel, aplicatiile e-Learning vor deveni mai viabile si mai utile. Particularităţile specifice tehnologiilor de e-Learning aduc noi dimensiuni în educaţie şi pot fi complementare sau alternative faţă de metodele tradiţionale din domeniul educaţiei. Aceste particularităţi oferă posibilitatea organizării învăţământului online pe subiecte sau teme, în timp ce învăţământul tradiţional este organizat pe grupe/clase de vârstă. Procesul Procesul de predare-în predare-învăţar văţare-ex e-examin aminare are capătă capătă noi dimensiu dimensiuni ni şi caracterist caracteristici ici prin utilizarea tehnologiilor e-Learning. e-Learning. Sistemul de învăţământ din ţara noastră este în mod direct şi determina determinant nt implicat implicat în fundamen fundamentarea tarea şi construire construireaa societăţii societăţii informaţio informaţionale nale.. O societate societate informaţională se naşte într-un mediu în care marea majoritate a membrilor ei are acces la tehnologii IT&C şi utilizează frecvent tehnologiile tehnologiile informaţionale privind rezolvarea unor probleme economice, sociale, etc. Constr Construir uirea ea unei unei societ societăţi ăţi infor informa maţio ţional nale, e, ce va reprez reprezent entaa trecer trecerea ea la societ societate ateaa cunoaşterii, nu se poate realiza fără cercetare şi proiecte de investiţii, atât în domeniul IT&C, cât şi în domeniul educaţiei. Dezideratul final fiind competenţa, nici o tehnologie, nici o teorie, nici o abordare nu va elimina sau neglija relaţia profesor-elev/student. Toate vor fi instrumente comode şi eficiente la îndemână, atât a profesorului, profesorului, cât şi a studentului. BIBLIOGRAFIE - Well Wellin ing, g, Luk Lukee Tho Thoms mson on,, Lau Laura ra,, Dezvoltarea aplicaţiilor Web cu PHP SI MySQL, ediţia a II-a, Editura Teora, Bucureşti, 2005; 67 - Meloni, Julie C., PHP, MySQL si Apache, Editura Corint, Bucureşti, 2005. - Darie, Cristian, PHP 5 si Mysql pentru comerţ electronic, Editura Teora, Bucureşti, 2006. - Sabau, Gheorghe Velicanu , Manole Lungu, Ion Muntean, Mihaela - Sisteme informatice. Analiza, proiectare si implementare, Editura Economica, Bucureşti, 2003 - Functii - http://www.php.net/manual/ro/ref.ldap.php LDAP – LDAP - ADODB - ADOdb Database Abstraction Library for PHP -http://adodb.sourceforge.net/ - Wikipedia - Why PostgreSQL Instead of MySQL: Comparing Reliability and Speed in 2007 - http://wiki.postgresql.org/wiki/Why_PostgreSQL_Instead _of_MySQL:_Comp aring_Reliability_and_Speed_in_2007 - Ajax - A library of DHTML and Ajax scripts - http://www.dhtmlgoodies.com/ - www.php.net - www.postgresql.org ANEXA 1 – CLASA ADODB ADODB este o clasa PHP care asigură control asupra unei baze de date, dar fără a cere o anumită bază de date. Asta înseamnă că acelasi cod poate fi folosit pentru a accesa MySQL, Oracle si PostgreSQL. Cum funcţionează? Abstractizare! Aceasta este capacitatea de a generaliza 68 un sistem sau API, astfel încât detaliile să fie ascunse. Cei mai mulţi dintre noi folosim abstractizări, fără să ne dăm seama. Chiar si programatorii în ‘C’, îsi fac viaţa mai usoară cu ajutorul abstractizărilor. Fiecare funcţie, expresie si afirmaţie abstractizează anumite detalii hardware ale procesorului faţă de programator, prin intermediul limbajului ‘C’. Aceasta e o abstractizare de nivel inferior. Programarea de baze de date cu SQL este o abstractizare de nivel superior. Baza de date (fie MySQL, PostgreSQL sau Oracle) poate funcţiona în orice mod, poate să aibă orice algoritm si pote folosi orice fisiere doreste. Alegând un limbaj comun (SQL) pentru comunicare, nu mai trebuie să ne facem griji pentru anumite detalii specifice. În schimb, ne putem dedica timpul unor sarcini mai importante, cum ar fi crearea unor chestionare inner joins si select cât mai eficiente! Această abstractizare nu se extinde la modul în care programăm baza de date, deoarece fiecare are propriul API. În PHP, puteţi iniţia un dialog cu o bază de date MySQL numită fredbloggs folosind, $db = mysql_connect(“localhost“, “myuser”, “mypass”); mysql_select_db(“fredbloggs”); în timp ce PostgreSQL cere, $db = pg_connect(“host=localhost dbname=fredbloggs user=myuser password=mypass”); Desi cei mai mulţi dintre acesti parametrii sunt opţionali, transferarea de cod între baze de date este destul de dificilă, deoarece fiecare handler connect, select si error trebuie rescris pentru a corespunde bazei de date. Și asta de fiecare dată când sunt folosite. Nu doar o modificare a numelui funcţiei, ci si a structurii si a formatului argumentelor. La fel ca si codurile de eroare. Soluţia este abstractizarea funcţiei specifice database_connect dintr-o anumită bază de date si folosirea unui apel API comun. Exemplu conectare la baza de date de tip PostgreSQL debug = false; $db->Connect($db_host, $db_user, $db_pass, $db_name); ?> ANEXA 2 - CLASA adLDAP 69 var $_domain_controllers = array ("buc-ho-dc.int.finansbank.ro"); var $_ad_username=NULL; var $_ad_password=NULL; var $_user_dn; var $_user_pass; var $_conn; var $_bind; // default constructor function adLDAP(){ //conectarea la serverul LDAP $this->_conn = ldap_connect($this->random_controller()); ldap_set_option($this->_conn, LDAP_OPT_PROTOCOL_VERSION, 3); return true; } function random_controller(){ mt_srand(doubleval(microtime()) * 100000000); $rand=mt_rand(1,count($this->_domain_controllers)); $rand--; return $this->_domain_controllers[$rand]; } function authenticate($username,$password){ $returnval=false; if ($username!=NULL and $password!=NULL){ //prevent null bind $this->_user_dn=$username.$this->_account_suffix; $this->_user_pass=$password; $this->_bind = @ldap_bind($this->_conn,$this->_user_dn,$this>_user_pass); if ($this->_bind){ $returnval=true; } } return $returnval; } function rebind(){ $ad_dn=$this->_ad_username.$this->_account_suffix; $this->_bind = @ldap_bind($this->_conn,$ad_dn,$this->_ad_password); if ($this->_bind){ return true; } else { return false; } } function user_info($user,$fields){ 70 if ($user!=NULL){ if ($this->_ad_username!=NULL){ $this->rebind(); } if ($this->_bind){ $filter="samaccountname=".$user; if ($fields==NULL) { $fields=array("samaccountname","mail","memberof","department","displayname","telephonen umber"); } ldap_set_option($this->_conn, LDAP_OPT_REFERRALS, 0); $sr=ldap_search($this->_conn,$this->_base_dn,$filter,$fields); $entries = ldap_get_entries($this->_conn, $sr); return $entries; } } return false; } function user_groups($user){ if ($this->_ad_username!=NULL){ $this->rebind(); } if ($this->_bind){ $info=@$this->user_info($user,array("memberof")); $groups=$info[0][memberof]; $group_array=array(); for ($i=0; $i<$groups["count"]; $i++){ $line=$groups[$i]; $group_name=""; $line_length=strlen($line); for ($j=3; $j<$line_length; $j++){ if ($line[$j]==","){ $j=$line_length; } else { $group_name.=$line[$j]; } } $group_array[$i]=$group_name; } return $group_array; } else { return false; } } function user_ingroup($user,$group){ if (($user!=NULL) && ($group!=NULL)){ if ($this->_ad_username!=NULL){ $this->rebind(); } 71 if ($this->_bind){ $groups=$this->user_groups($user,array("memberof")); if (in_array($group,$groups)){ return true; } } } return false; } } ?> Exemplu: include ("lib/class/adLDAP.php"); //se creeaza o conexiune LDAP $adldap = new adLDAP(); //autentificare utilizator if ($adldap -> authenticate($user,stripslashes($password))) { $HTTP_SESSION_VARS['username'] = true; session_register('username'); $_SESSION['username'] = $user; $HTTP_SESSION_VARS['password'] = true; session_register('password'); $_SESSION['password'] = md5($password); $HTTP_SESSION_VARS['timplogin'] = true; session_register('timplogin'); $_SESSION['timplogin'] = time(); $HTTP_SESSION_VARS['nivel'] = true; session_register('nivel'); $_SESSION['nivel'] = 4; header("Location:utilizatori/index.php"); } else { $eroare_login="Parola este gresita "; } ANEXA 3 – EXTENSII FPDF CLASA Sector 72 Descriere Acest script PHP permite desenarea unui sector de cerc. De asemenea poate fi folosit pentru generarea de grafice de tip “pie”. function Sector(float xc, float yc, float r, float a, float b [, string style [, boolean cw [, float o]]]) xc: abscisa centrului. yc: coordonata centrului. r: raza. a: unghi initial (in grade). b: unghi final (in grade). style: D, F, FD or DF (draw, fill, fill and draw). Default: FD. cw: indica daca se foloseste sensul acelor de ceas (default: true). $b) $b +=360; $b = $b/360*2*M_PI; $a = $a/360*2*M_PI; $d = $b-$a; if ($d == 0 ) $d =2*M_PI; $k = $this->k; $hp = $this->h; if($style=='F') $op='f'; elseif($style=='FD' or $style=='DF') $op='b'; else $op='s'; if (sin($d/2)) $MyArc = 4/3*(1-cos($d/2))/sin($d/2)*$r; //first put the center 73 $this->_out(sprintf('%.2f %.2f m',($xc)*$k,($hp-$yc)*$k)); //put the first point $this->_out(sprintf('%.2f %.2f l',($xc+$r*cos($a))*$k,(($hp-($yc-$r*sin($a)))*$k))); //draw the arc if ($d < M_PI/2){ $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), $xc+$r*cos($b), $yc-$r*sin($b) ); }else{ $b = $a + $d/4; $MyArc = 4/3*(1-cos($d/8))/sin($d/8)*$r; $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), $xc+$r*cos($b), $yc-$r*sin($b) ); $a = $b; $b = $a + $d/4; $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), $xc+$r*cos($b), $yc-$r*sin($b) ); $a = $b; $b = $a + $d/4; $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), $xc+$r*cos($b), $yc-$r*sin($b) ); $a = $b; $b = $a + $d/4; $this->_Arc($xc+$r*cos($a)+$MyArc*cos(M_PI/2+$a), $yc-$r*sin($a)-$MyArc*sin(M_PI/2+$a), $xc+$r*cos($b)+$MyArc*cos($b-M_PI/2), $yc-$r*sin($b)-$MyArc*sin($b-M_PI/2), $xc+$r*cos($b), $yc-$r*sin($b) ); } //terminate drawing 74 $this->_out($op); } function _Arc($x1, $y1, $x2, $y2, $x3, $y3 ) { $h = $this->h; $this->_out(sprintf('%.2f %.2f %.2f %.2f %.2f %.2f c', $x1*$this->k, ($h-$y1)*$this->k, $x2*$this->k, ($h-$y2)*$this->k, $x3*$this->k, ($h-$y3)*$this->k)); } } ?> CLASA Diagrams Descriere Acest script permite generarea graficelor de tip “pie” si a diagramelor. Necesita clasa prezentata mai sus. PieChart(float w, float h, array data, string format [, array colors]) w: latimea maxima a diagramei. h: inaltimea maxima a diagramei. data: vector asociativ care contine etichetele si datele corespunzatoare. format: folosit pentru legenda. Sir de caractere care poate contine urmatoarele valori: %l (eticheta), %v (valoare) and %p (procent). colors: vector ce contine culorile. BarDiag(float w, float h, array data, string format [, array colors [, int maxVal [, int nbDiv]]]) w: latimea diagramei. h: inaltimea diagramei. data: vector asociativ care contine etichetele si datele corespunzatoare. format: folosit pentru legenda. Sir de caractere care poate contine urmatoarele valori: %l (eticheta), %v (valoare) and %p (procent). color: vector ce contine culorile. maxVal: valoarea maxima a scalei. nbDiv: numar de subdiviziuni pentru scala.(default:4). 75 class PDF_Diag extends PDF_Sector { var $legends; var $wLegend; var $sum; var $NbVal; function PieChart($w, $h, $data, $format, $colors=null) { $this->SetFont('Courier', '', 10); $this->SetLegends($data, $format); $XPage = $this->GetX(); $YPage = $this->GetY(); $margin = 2; $hLegend = 5; $radius = min($w - $margin * 4 - $hLegend - $this->wLegend, $h - $margin * 2); $radius = floor($radius / 2); $XDiag = $XPage + $margin + $radius; $YDiag = $YPage + $margin + $radius; if($colors == null) { for($i = 0;$i < $this->NbVal; $i++) { $gray = $i * intval(255 / $this->NbVal); $colors[$i] = array($gray, $gray, $gray); } } //Sectors $this->SetLineWidth(0.2); $angleStart = 0; $angleEnd = 0; $i = 0; foreach($data as $val) { $angle = floor(($val * 360) / doubleval($this->sum)); if ($angle != 0) { $angleEnd = $angleStart + $angle; $this->SetFillColor($colors[$i][0], $colors[$i][1], $colors[$i][2]); $this->Sector($XDiag, $YDiag, $radius, $angleStart, $angleEnd); $angleStart += $angle; } $i++; } if ($angleEnd != 360) { $this->Sector($XDiag, $YDiag, $radius, $angleStart - $angle, 360); } //Legends $this->SetFont('Courier', '', 10); $x1 = $XPage + 2 * $radius + 4 * $margin; $x2 = $x1 + $hLegend + $margin; $y1 = $YDiag - $radius + (2 * $radius - $this->NbVal*($hLegend + $margin)) / 2; 76 for($i=0; $i<$this->NbVal; $i++) { $this->SetFillColor($colors[$i][0], $colors[$i][1], $colors[$i][2]); $this->Rect($x1, $y1, $hLegend, $hLegend, 'DF'); $this->SetXY($x2, $y1); $this->Cell(0, $hLegend, $this->legends[$i]); $y1+=$hLegend + $margin; } } function BarDiagram($w, $h, $data, $format, $color=null, $maxVal=0, $nbDiv=4) { $this->SetFont('Courier', '', 10); $this->SetLegends($data, $format); $XPage = $this->GetX(); $YPage = $this->GetY(); $margin = 2; $YDiag = $YPage + $margin; $hDiag = floor($h - $margin * 2); $XDiag = $XPage + $margin * 2 + $this->wLegend; $lDiag = floor($w - $margin * 3 - $this->wLegend); if($color == null) $color=array(155, 155, 155); if ($maxVal == 0) { $maxVal = max($data); } $valIndRepere = ceil($maxVal / $nbDiv); $maxVal = $valIndRepere * $nbDiv; $lRepere = floor($lDiag / $nbDiv); $lDiag = $lRepere * $nbDiv; $unit = $lDiag / $maxVal; $hBar = floor($hDiag / ($this->NbVal + 1)); $hDiag = $hBar * ($this->NbVal + 1); $eBaton = floor($hBar * 80 / 100); $this->SetLineWidth(0.2); $this->Rect($XDiag, $YDiag, $lDiag, $hDiag); $this->SetFont('Courier', '', 10); $this->SetFillColor($color[0], $color[1], $color[2]); $i=0; foreach($data as $val) { //Bar $xval = $XDiag; $lval = (int)($val * $unit); $yval = $YDiag + ($i + 1) * $hBar - $eBaton / 2; $hval = $eBaton; $this->Rect($xval, $yval, $lval, $hval, 'DF'); //Legend $this->SetXY(0, $yval); $this->Cell($xval - $margin, $hval, $this->legends[$i], 0, 0, 'R'); 77 $i++; } //Scales for ($i = 0; $i <= $nbDiv; $i++) { $xpos = $XDiag + $lRepere * $i; $this->Line($xpos, $YDiag, $xpos, $YDiag + $hDiag); $val = $i * $valIndRepere; $xpos = $XDiag + $lRepere * $i - $this->GetStringWidth($val) / 2; $ypos = $YDiag + $hDiag - $margin; $this->Text($xpos, $ypos, $val); } } function SetLegends($data, $format) { $this->legends=array(); $this->wLegend=0; $this->sum=array_sum($data); $this->NbVal=count($data); foreach($data as $l=>$val) { $p=sprintf('%.2f', $val/$this->sum*100).'%'; $legend=str_replace(array('%l', '%v', '%p'), array($l, $val, $p), $format); $this->legends[]=$legend; $this->wLegend=max($this->GetStringWidth($legend), $this->wLegend); } } } ?> 78 Sign In
Our partners will collect data and use cookies for ad personalization and measurement. Learn how we and our ad partner Google, collect and use data. Agree & close
|