Arhitectura Software

Cuprins

Introducere

ei ăș

internetului

se impune acordarea unei atenții ridicate compatibiltății i

soluiei se dorete utlizarea de tehnologii care

Obiectivele și Specificațiile proiectului

Obiective

Principalul obiectiv al acestei lucrări este de a realiza unei platforme online care să faciliteze studiul la distanță prin intermediul internetului. Se dorește accesul cursanților la materialele de curs/laborator cu ajutorul calculatorului, tabletei sau a oricărui alt dispozitiv mobil cu conexiune la internet.

În cazul acestor tipuri de aplicații, contactul direct dintre profesor si elev este mult diminuat sau dispare complet. Lia dialogului nemijlocit a fost suplinit prin mesaje motivaționale afișate cursantului în funcție de profil său. Informațiile aferente profilului au fost culese pe baza atât a cursurilor i materialelor urmărite n interiorul platformei, cât și a timpului petrecut în studierea acestora.

Având n vedere faptul că realizarea unei astfel de platforme necesită implicarea un număr mai mare de persoane,

În aceast primă faz, obiectivul principal este reprezentat de realizarea funcionalităților de bază precum:

definirea specificațiilor

definirea unei arhitecturi

administrarea utilizatorilor

autorizarea sau restricționarea accesului la anumite materii

o buna separare a rolurilor si a funcțiilor ndeplinite de fiecare tip de utilizator

definirea rutelor pentru fiecare tip de utilizator i ierarhia rolurilor

Un alt aspect important urmărit în această aplicație este mbunătățirea experienței utilizatorilo și a functionalităților spre o utilizare intuitivă. Utilizatorii își vor putea direcționa atenia cât mai mult spre acumularea de informații și cât mai puțin pe căutarea și regăsirea acesteia.

Din punctul de vedere al tipului de comunicare, aplicaiile de tip e-learning se mpart în două categorii:

implică comunicarea sincronă

implică comunicare asincronă

Comunicarea sincronă este comunicarea n timp real cu toți participanții. Un bun exemplu este discuția faț în față sau întlnirile de tip conferinț realizate cu ajutorul aplicațieiSkype sau orice alt sistem de comunicare . Comunicarea asincronă, în schimb, se poate rezuma la transmiterea de e-mail-uri sau la interschimb de mesaje pe forumuri fiind condde lipsa necesiii unei reacii imediate.Aplicația se va axa mai mult pe comunicarea asincronă. Acest tip de comunicare se poate dovedi foarte utilă în cazul în care persoanele implicate nu au un orar comun, recuperarea unui curs pierdut putnd fi realizată oricând. La fel de utilă se poate dovedi în cazul persoanelor cu dizabilități care nu pot urma un curs la zi.

Specificațiile proiectului

Definirea acțiunilor de fiecare tip de utilizator

Aplicația va fi împrțită n trei componente pricipale corespunzătoare celor trei roluri: student, profesor și administrator, fiecare având acces la anumite rute ale aplicației. Administratorul va avea acces la la pagina dedicată profesorului, dar și la pagina dedicată studentului și va putea realiza urmatoarele operații:

adăugare de utilizatori noi

activarea conturilor noi

schimbarea rolurilor

ștergerea de utilizator

restricționarea sau acordarea accesului la cursuri.

Profesorul va avea rolul de a adauga materii sau cursuri noi de a le administra, lista funcționalităților la care va avea acces fiind urmatoarea:

adăugare / ștergere / editare / vizualizare materi

adăugare / ștergere / editarea / vizualizarea cursuri

adăugare / ștergere / editare / vizualizare mesaje motivaionale pentru fiecare curs n parte

vizualizare statistică pentru fiecare curs n parte(timpul petrecut de fiecare pe un curs);

restricționarea accesului la cursuri;

Studentul va avea acces la o lista mai restrânsă de funcționalități precum vizualizarea cursurilor, posibilitatea de a cere acces la cursurile private

Mesaje motivaționale i sistemul de monitorizare a timpului

Sistemul de monitorizare a timpului petrecut pe aplicație va rula n background-ul aplicației. Cursantul va putea vizualiza mesajele motivaționale de-a lungul parcurgerii cursurilor.

Mesajele motivaționale vor fi actualizate pe parcurs ce timpul petrecut în paginile materialelor aferente unui anumit curs crește, fiind stabilite zece niveluri; acest numar nu este fix.

Rolul mesajelor moțivaționale este de a face cursantul sa continue studiul, dar și de a suplini rolul contactului direct cu profesorul sau ceilalți cursanți.

Responsive design

Realizarea arhitecturii trebuie să asigure bun funcționare, atât în cadrul a diferite navigatoare de web, precum Firefox, Chrome, Safari, Internet Explorer, cât și în cadrul navigatoarelor native pentru tablete sau alte dispozitive mobile.

Pentru a ndeplini aceste condiții se va folosi pachetul Twitter Bootstrap care asigur o serie de clase CSS și fiiere destinate adaptrii designului la rezoluția dispozitivului de lucru.

Fiabilitatea si disponibilitatea

Disponibilitatea unei aplicații este strâns legată de fiabilitate. Dacă o aplicație nu este disponibilă la orice solicitare a utilizatorului, este puțin probabil că își îndeplinește rolul pentru care ea a fost dezvoltată. Aplicațiile Internet trebuie însă să fie disponibile 24 din 24. Disponibilitatea poate fi măsurată ca și raportul de timp în care aplicația este utilizabilă.

Apariția unei defecțiuni face ca aplicația să fie indisponibilă. Defecțiunile influențează fiabilitatea unei aplicații care se măsoară ca fiind timpul mediu dintre apariția defecțiunilor (Mean Time Beween Failure). De obicei, sistemele software care necesită o disponibilitate mare trebuie să nu conțină așa numitul “singur punct de defectare” (single point of failure) și să conțină mecanisme care să detecteze defecțiunea automat și să repornească componenta defectată.

componentelor este o metod eficientă de a crește fiabilitatea și evident disponibilitatea unui sistem software. Astfel, atunci când apare o defecțiune la o componentă replicată, sistemul poate să funcționeze pentru că folosește celelalte replici ale componentei care încă funcționează. Se poate însă ca performanța sistemului să fie afectată de defecțiune, dar el va fi totuși disponibil.

Recuperarea după apariția unei defecțiuni afectează, de asemenea, disponibilitatea sistemului. Un sistem software are capacitatea de a se recupera dacă el revine la parametrii de funcționare normali după ce a apărut o defecțiune. Este de dorit ca defecțiunea să fie detectată automat, iar procedura de recuperare,de asemenea să fie inițiată automat. Având în vedere că pe parcursul cât se execută procedura de recuperare sistemul nu este disponibil, este de dorit ca această procedură să fie cât mai scurtă ca durată.

Studiu bibliografic

Ce este E-Learning ?

E-learning(sau eLearning) este un mijloc de educație, care include auto-motivare, comunicare, eficiențăși tehnologie. E-learning este un termen folosit pentru a descrie flexibil un mijloc de predare prin intermediul tehnologiei.

 În sens larg, prin eLearning se înțelege totalitatea situațiilor educaționale în care se utilizează semnificativ mijloacele Tehnologiei Informației și Comunicării (TIC). Termenul a fost preluat din literatura anglo-saxonă, fiind extins de la sensul primar, etimologic, de învățare prin mijloace electronice, și acum aria de intersecție a acțiunilor educative cu mijloacele informatice moderne. Computerul și materialele electronice/ multimedia sunt utilizate ca suport în predare, învățare, evaluare sau ca mijloc de comunicare.

În sens restrâns, elearning-ul reprezintă un tip de educație la distanță, o experiență planificată de predare-învățare organizată de o instituție ce furnizează mediat materiale într-o ordine secvențială și logică pentru a fi asimilate de studenți în maniera proprie. Medierea se realizează prin noile tehnologii ale informației și comunicării – în special prin Internet. Internetul constituie atât mediul de distribuție al materialelor, cât și canalul de comunicare între actorii implicați.

Avantajele utilizării E-learning-ului

alveaz timp

ste confortabil

ste mai economic

rezintă flexibilitate

oate fi accesat oricând este nevoie

ursanții il prefer deoarece poate fi acomodat pentru mai multe stiluri de predat i o pot face n spațiul lor

ncurajează cursantul s caute informații relevante pentru necesitațile sale

Dezavantajele utilizării E-learning-ului

ste necesar accesul la un calculator(i internet)

unotine de lucru cu programe,browser i e-mail

onexiune slab sau computere vechi pot face accesul la informaii dificil

la fel de mult timp ca si cursurile clasice

tudentul se poate simi izolat de profesor

Elementele necesare pentru un curs online

Pentru implementarea unui curs online trebuie ndeplinite o serie de condiții pentru a se asigura beneficiile unui astfel de curs.

O prezenț continuă a profesorului

Rolul instructorului este foarte important în procesul de e-learning pentru că e în mâinile sale puterea de a încuraja, de a inspira și de a se asigura ca elevii nu simt c s-au angajat singuri pe drumul de învățare. De asemenea, profesorul trebuie să se asigure că elevii vor fi urmăriți și vor primii feedback-ul propriu-zis, care este foarte important pe tot parcursul procesului de învățare. Pentru a facilita o astfel de relație, L.M.A.(Learning Management Systems) oferă opțiuni cum ar fi mesagerie instant între colegi, e-mail

Un LMS bine definit i ușor de utilizat

Atunci când vorbim despre succesul unui LMS, înseamnă în primul rând că vorbim de un site de e-learning, care este uor de navigat, este bine organizat și conține materiale de înaltă calitate. Sarcinile de zi cu zi includ distribuirea de noi materiale și trimiterea, primirea și clasificare informațiilor. Un LMS bine conceput se va asigura că aceste sarcini sunt ușor de realizat și că utilizatorii pot sa le acceseze cu ușurință.

Ca și cu orice alt site web, aplicație sau produs, compatibilitate este întotdeauna o chestiune delicată. Trebuie să fii întotdeauna sigur că materialul postat

Teste online i quizz-uri

În ciuda faptului că e-learning-ului îi lipsește elementul de prezență fizică, testele și chestionarele sunt în continuare o parte esențială a procesului de învățământ. Prin teste online și chestionare un instructor este capabil să urmărească progresele înregistrate de elevi și să evalueze eficacitatea materialelor, același timp, elevii au posibilitatea de a urmări propriul progres și de a-și îmbunătăți abilitățile.

Eficientizarea sistemului de e-learning

Oricine poate creea un curs online, nsă crearea unui curs eficient de e-learning este cu totul diferit. Un curs eficient un mamagement bun al timpului, muncă grea și un conținut de înaltă calitate.

O buna cunoaștere a materialelor

Nu există nici o regulă de aur de cât de mult timp ai nevoie pentru a crea material cu conținut de calitate, dar un lucru este sigur – ai nevoie de timp pentru a cerceta materialul înainte de a le pune la dispoziția elevilor. Motivele sunt simple, trebuie să fi pregătit să poți explica orice întrebare sau nelămurire făcută în cadrul materialul. Desigur, nu toți cursanii parcurg mental informațiile în același mod, iar unii ar putea avea nevoie de mai multe explicații, prin exemple sau dovezi suplimentare.

Adaptarea cursurilor la diferite tipuri

Designul cursului online ar trebui să ia fiecare stil de învățare în considerare. De exemplu, în timp ce un student poate beneficia de prezentări multimedia vizuale de cursuri și lecții, un alt student poate fi capabil de a absorbi mai bine informațiile atunci când sunt prezentate sub formă de text. Un curs eficient de e-learning are întotdeauna aceste diferite stiluri de învățare în considerare atunci când lecțiile sunt create.

Facilitarea contactului

Elevii și profesorii ar trebui să fie în măsură să stabilească o linie deschisă de comunicare. De asemenea, cadrele didactice ar trebui să specifice ce mijloace de comunicare preferă și în timpul căror ore. Acest lucru va asigura că așteptările sunt îndeplinite și că studentul prearning, care este uor de navigat, este bine organizat și conține materiale de înaltă calitate. Sarcinile de zi cu zi includ distribuirea de noi materiale și trimiterea, primirea și clasificare informațiilor. Un LMS bine conceput se va asigura că aceste sarcini sunt ușor de realizat și că utilizatorii pot sa le acceseze cu ușurință.

Ca și cu orice alt site web, aplicație sau produs, compatibilitate este întotdeauna o chestiune delicată. Trebuie să fii întotdeauna sigur că materialul postat

Teste online i quizz-uri

În ciuda faptului că e-learning-ului îi lipsește elementul de prezență fizică, testele și chestionarele sunt în continuare o parte esențială a procesului de învățământ. Prin teste online și chestionare un instructor este capabil să urmărească progresele înregistrate de elevi și să evalueze eficacitatea materialelor, același timp, elevii au posibilitatea de a urmări propriul progres și de a-și îmbunătăți abilitățile.

Eficientizarea sistemului de e-learning

Oricine poate creea un curs online, nsă crearea unui curs eficient de e-learning este cu totul diferit. Un curs eficient un mamagement bun al timpului, muncă grea și un conținut de înaltă calitate.

O buna cunoaștere a materialelor

Nu există nici o regulă de aur de cât de mult timp ai nevoie pentru a crea material cu conținut de calitate, dar un lucru este sigur – ai nevoie de timp pentru a cerceta materialul înainte de a le pune la dispoziția elevilor. Motivele sunt simple, trebuie să fi pregătit să poți explica orice întrebare sau nelămurire făcută în cadrul materialul. Desigur, nu toți cursanii parcurg mental informațiile în același mod, iar unii ar putea avea nevoie de mai multe explicații, prin exemple sau dovezi suplimentare.

Adaptarea cursurilor la diferite tipuri

Designul cursului online ar trebui să ia fiecare stil de învățare în considerare. De exemplu, în timp ce un student poate beneficia de prezentări multimedia vizuale de cursuri și lecții, un alt student poate fi capabil de a absorbi mai bine informațiile atunci când sunt prezentate sub formă de text. Un curs eficient de e-learning are întotdeauna aceste diferite stiluri de învățare în considerare atunci când lecțiile sunt create.

Facilitarea contactului

Elevii și profesorii ar trebui să fie în măsură să stabilească o linie deschisă de comunicare. De asemenea, cadrele didactice ar trebui să specifice ce mijloace de comunicare preferă și în timpul căror ore. Acest lucru va asigura că așteptările sunt îndeplinite și că studentul primește ajutorul sau sprijinul de care are nevoie. De asemenea, elevii ar trebui să aibă informații de contact pentru persoanele de suport IT, și să aibă acces la un membru al personalului în mod regulat, dacă este necesar. Exemple ale modului în care elevii pot comunica cu instructorii lor sunt: forum-uri de discuții, mass-media sociale, chat-uri, e-mail, conferințe video și alte tehnologii VoIP.

La proiectarea platformei de e-learning, ușurința de navigare și funcționalitate ar trebui să fie prioritate de top. O platformă bine organizată și intuitivă de învățare bazată pe web permite elevilor să se concentreze pe cursuri, mai degrabă decât să fie nevoit să rezolve problemele tehnice care pot apărea de la site-uri și sisteme prost concepute.

Stabilirea unor obiective clare

dintre motivele pentru care echipele sunt în imposibilitatea de a atinge obiectivele este pentru că nu are orientări suficient de clare cu privire la modul de a ajunge la ele. Parte a conținutului de la orice curs ar trebui să fie ceea ce se va face, atunci când se va face, și ceea ce este necesar pentru finalizarea cu succes a sarcinilor. Prin urmare, este important ca toți instructorii stabili și comunica obiective clare pentru elevii lor într-un mod în care acestea sunt sigur că ei vor înțelege și va fi capabil de a pune în acțiune.

Studiu colaborativ

Învățarea colaborativă este o abordare de e-learning în care elevii sunt capabili de a interacționa social cu alți studenți, precum și instructori. În esență, învață să lucreze împreună, în scopul de a extinde cunoștințele lor pe un anumit subiect sau pe o anumită calificare. În mediile de e-learning, acest lucru se face de obicei prin intermediul chat-uri live, panouri de mesaje, sau mesagerie instant.

Învățarea colaborativă se bazează pe principiul că elevii pot îmbogăți experiențele lor de învățare prin interacțiunea cu alte persoane . În situații de învățare de colaborare, elevii sunt responsabili pentru acțiunile și sarcinile altora, fapt care încurajează munca în echipă.

Avantajele studiului colaborativ

Această metodă de învățare poate fi efectuată fie offline sau de pe web, și se poate face asincron sau sincron. Astflse permite elevilor să învețe din ideile, competențele, sau experiența altora înscriși în curs. Angajându-se într-o sarcină comună (fie că este un proiect sau lecție), elevii câștiga posibilitatea de a învața o varietate de aptitudini, cum ar fi analiza de grup și de colaborare abilități de construcție munca în echipă.

În plus, chiar și studenții care sunt în imposibilitatea de a participa la un eveniment live online, pot participa la procesul de învățare de colaborare, datorită forumuri online, panouri de mesaje, precum și alte diverse site-uri de înregistrare care nu se bazează pe interacțiunea în timp real.

Platforme existente

Exista deja o serie de platforme online de e-learning dar principalele ar fi:

Alice

E-front

Atutor

Docebo

Ilias

Alice

Proiectul Alice() este un proiect acestui proiect fiind eliminarea lipsurilor de perormanță ale platformelor existente pe piață.2Unele din lipsurile platformelor existente ar fi: lipsa interacțiunii, lipsa de competiție, lipsa identității sociale.

Participanții la acest proiect au fost de la mai multe universități din diferite :

Graz University of Technology Austria

ObertaCatalunya

MOMA S.p.A. ICT company of the “Pole of Excellence on Knowledge” 

CRMPA

COVUNI

3

4

e între componente

Una din cele mai importante reguli de care trebuie să se țină cont în proiectarea unei arhitecturi este aceea de a minimiza dependențele între componente. Între două componente există o dependență dacă modificarea unei componente implică modificarea celeilalte. Prin eliminarea dependențelor inutile modificările sunt localizate și nu se propagă prin întreaga arhitectură. Un număr prea mare de dependențe face ca sistemul să fie greu de modificat, întreținut și testat.

În sunt prezentate două exemple de împărțire în componente. În este prezentată o aplicație care constă din trei componente fiecare dintre ele depinzând de o a patra componentă dezvoltată de o altă companie decât cea care dezvoltă aplicația. Faptul că fiecare componentă din 3 aplicație depinde de o componentă terță constituie un grad ridicat de risc și anume: daca interfața de comunicare cu componenta terță se modifică toate cele trei componente care depind de ea vor trebuie să fie modificate. Riscul poate fi însă redus dacă se proiectează o componentă care să intermedieze comunicarea cu componenta terță, așa cum este cazul în b.

Figura 41

Unul din cele mai puternice mecanisme pentru descrierea unei arhitecturi este reprezentat de descompunerea ierarhică. În este prezentat un exemplu de arhitectură care a fost proiectată utilizând descompunerea ierarhică. Astfel, la nivelul cel mai de sus aplicația constă din trei componente care interacționează. Componenta C2 este descompusă în alte două componente, C21 și C22, iar componenta C3 este descompusă în trei componente, C31, C32 și C33.

Figura 42 Exemplu de descompunere ierarhică.

Securitatea aplicației

Aplicațiile web au cunoscut o dezvoltare uluitoare de-a lungul ultimilor ani. Odată cu

intrarea în era WEB 2.0 și dezvoltarea cloud computing-ului o mare parte din activitatea internauților s-a mutat în mediul web 5

Dezvoltarea spectaculoasă a aplicațiilor web a fost posibilă datorită inovațiilor tehnologice în domeniu, specifice WEB 2.0, care au transformat simplele pagini web în care erau afișate informații statice, în pagini dinamice, interactive ce permit o interacțiune ridicată a utilizatorului cu aplicația.

Dezvoltarea uluitoare a web-ului a creat premisa apariției vulnerabilităților specifice

oricărui produs tehnologic. Numărul acestora este în continuă creștere deși cele mai populare atacuri se bazează pe vulnerabilități identificate pentru prima dată acum câțiva ani buni.

Internetul abundă în numeroase surse de documentație pentru securizarea aplicațiilor web precum și de topuri ale celor mai populare tipuri de atacuri asupra serverelor web.

Cele mai intalnite tipuri de atacuri asupra unei aplicații sunt:

SQL Injection

Cross-site Scripting (XSS)

Verbose Errors

Logic Flaw

Authorization Bypass

Authentication Bypass

Vulnerable Third Party Software

Session Handling Flaw

Cross-site Request Forgery (CSRF)

O vulnerabilitate de tip SQL injection (injecție cu cod sursă SQL) apare atunci când

un atacator poate introduce orice date într-o interogare SQL transmisă unei baze de date sau când, prin injectarea sintaxei, logica declarației este modificată în asemenea fel încât să execute o acțiune diferită. Injecția SQL poate fi crucială pentru sistem dar, în ciuda pericolului pe care îl prezintă, este cea mai frecvent întâlnită vulnerabilitate.

Un exemplu de SQL Injection este prezentat in .

Tabel 41 Exemplu SQL Injection

instrumente

Ajax

JSON

StarUML 5.0

43t

După cum se poate vedea în oricare dintre programatori poate primi sau trimite modificările sale pe origin. O astfel de abordare scade probabilitatea apariției erorilor datorită conflictelor ce pot apărea.

De exemplu cnd doi programatori modifică aceași linie de cod este foarte probabil să apară un conflict. În momentul când al doilea programator va încerca să trimită sau să preia modificările de/pe origin îi va aparea un conflic, ce va fi obligat să il rezolve dar avantajul este că va putea vizualiza și modificarile făcute de celălalt programator.

44

o serie de comenzi de GIT dar cele mai

g

git –dif origin/master # vizualizarea diferențelor dintre origin si

branch-ul actual

PHP este un limbaj de programare. Numele PHP provine din limba engleză și este un acronim recursiv: PhpHypertext Preprocessor. Folosit inițial pentru a produce pagini web dinamice, este folosit pe scară largă în dezvoltarea paginilor și aplicațiilor web.

Este unul din cele mai importante 6limbaje de programare web open-source și server-side, existând versiuni disponibile pentru majoritatea web serverelor și pentru toate sistemele de operare.

PHP este simplu de utilizat, fiind un limbaj de programare structurat, ca și C-ul, Perl-ul sau începând de la versiunea 5 chiar Java, sintaxa limbajului fiind o combinație a celor trei. Datorită modularității sale poate fi folosit și pentru a dezvolta aplicații de sine stătătorare, de exemplu în combinație cu PHP-GTK sau poate fi folosit ca Perl sau Python în linia de comandă. Probabil una din cele mai importante facilități ale limbajului este conlucrarea cu majoritatea bazelor de date relaționale, de la MySQL și până la Oracle, trecând prin MS Sql Server, PostgreSQL, sau DB2.

PHP poate rula pe majoritatea sistemelor de operare, de la UNIX, Windows, sau Mac OS X și poate interacționa cu majoritatea serverelor web. Codul dumneavoastră PHP este interpretat de serverul WEB și generează un cod HTML care va fi văzut de utilizator (clientului -browserului- fiindu-i transmis numai cod HTML).

Popularitatea de care se bucură acest limbaj de programare se datorează următoarelor caracteristici :

Familiaritatea : sintaxa limbajului este foarte ușoară combinând sintaxele unora din cele mai populare limbaje Perl sau C;

Simplitatea : sintaxa limbajului este destul de liberă. Nu este nevoie de includere de biblioteci sau de directive de compilare, codul PHP inclus într-un document executându-se între marcajele speciale;

Eficiența : PHP-ul se folosește de mecanisme de alocare a resurselor, foarte necesare unui mediu multiutilizator, așa cum este web-ul;

Securitate : PHP-ul pune la dispoziția programatorului un set flexibil și eficient de măsuri de siguranță;

Flexibilitate : fiind apărut din necesitatea dezvoltării web-ului, PHP a fost modularizat pentru a ține pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit server web, PHP-ul a fost integrat pentru numeroasele servere web existente: Apache, IIS, Zeus, server, etc.;

Gratuitate : este probabil cea mai importantă caracteristică a PHP-ului. Dezvoltarea PHP-ului sub licența open-source a determinat adaptarea rapidă a PHP-ului la nevoile web-ului, eficientizarea și securizarea codului.

JSON

ș. Unele din cele mai importante servicii publice care folosesc acest format pentru inerfațarea informațiilor ar fi și Twitteriinformații

45

z

Dezvoltarea folosind acest framework este mult mai elegantă, datorită separării celor trei mari componente(Model, View, Controller), astfel renunțânduse la vechea medodă n care se combin codul HTML cu codul PHP.

librării,

46

47

ă

o

48

AngularJS

AngularJS este un framework open-source creat și întreținut de Google. Are o înreag comunitate care ajut la dezvoltarea aplicațiilor ntr-o singura pagină(sigle-page application) prin exemple postate i tutoriale video.

Singurele cerințe pentru dezvoltarea unei astfel de aplicație necesită doar HTML, CSS și JavaScript pentru partea de client. Această abordare este foarte utilă deoarece oferă o separare foarte bine definită ntre interfața care se încarcă n calculatorul utilizatorului i partea de de backend. Astfel se crește testabilitatea aplicației.

Această librărie citește n conținutul HTML al paginii i caută atribute speciale puse pe elementele DOM și implementează funcționalități specifice pe acele elemente.

Scopurile pentru care a fost proiectat acest framework sunt:

Decuplarea manipulării DOM de logica aplicației;

Testarea aplicației este la fel de importantă ca și scrierea aplicației;

Decuplarea de client de partea de server – astfel se poate lucra pe ambele părți in paralel;

Ghidarea programatorului prin toți pași contruirii unei aplicații web: designul interfeței, scrierea logici și testarea;

Angular respectă arhitectura MVC și încurajează decuplarea componentelor de prezentare, date și logica. Folosind Angular o mare parte din ce țin de interfața utilizatorului, astfel scade solicitarea pe server, ducând la aplicați mai rapide.

ă

Implementare

Instalarea Wamp Server

Instalarea acestui program asigură următoarele componente necesare dezvoltării aplicați:

Apache 2.4.4

PHP 5.4.1

MySql 5.6.1

Este un program gratuit și poate fi descărcat pe site-ul:

http://www.wampserver.com/

Instalarea framework-ului Symfony

Înainte de instalarea efectivă framework-ului trebuie instalat Composer (manager de dependințe). Pentru instalarea acestuia se rulează în consolă:

curl -s https://getcomposer.org/installer | php

O altă variantă de instalare este descărcarea executabilului de la link-ul:

https://getcomposer.org/

După instalarea managerului de dependințe se poate descărca fișierele framework-ului

rulând în consolă urmatoarea comandă:

composer.exe create-project symfony/framework-standard-edition /path/to/webroot/Symfony 2.x.*

sau descarcărea unei arhive ce conține pachetul inițial de la adresa:

http://symfony.com/download

Până la acest pas s-a realizat descărcarea unui proiect Symfony în care se va realiza dezvoltarea proiectului. Un proiect symfony depinde de o serie de librării externe. Acestea sunt descărcate în directorul vendor cu ajutorul Composer.

Pentru descărcarea dependințelor proiectului actual trebuie să te poiționezi în directorul principal al proiectului și să rulezi comanda următoare:

composer.exe install –all

În acest moment avem o aplicație demo, funcțională ce poate fi accesată în browser la adresa http://localhost/app_dev.php și care arată ca în .

Figura 51 Pagina demo Symfony

Structura inițială de directoare arată ca în figura .

Figura 52 Structura inițială a fișierelor și directoarelor

Crearea unui bundle

Un bundle este un director care are o structură bine definită și care poate conține orice, de la clase până la controllere și orice altă resursă web.

Bundle-lul creat pentru această aplicație este numit Elearning, numele acesta va prefixa namespace-ul oricărei clase sau controller din interiorul lui. Pentru generarea acestuia se pot executa o serie de comenzi din linia de comandă, acestea sunt descrise în rândurile următoare.

Comandă pentru generarea unui bundle

php app/console generate:bundle

Alegerea namespace-ului

Bundle namespace: Elearning/ElearningBundle

Primul „Elearning” este numele directorului în care vrei să creezi bundle-ul, dup care urmează numele bundle-ului efectiv „Elearning” care trebuie obligatoriu să fie postfixat de cuvântul „Bundle”.

Specificarea căii unde să creeze bundle-lul

Target directory [E:/licenta/src]:

La acest pas este bu selectat automat i trebuie apată tasta „Enter”.

În acest moment vom avea n proiect un director cu structura Error! Reference source not found..

Figura 53 Structura directoarelor unui Bundle

Creare și configurarea conexiunii la baza de date

Pentru crerea bazei de date se rulează query-ul următor acesând instrumentul phpMyadmin din browser la url-ul http://localhost/phpmyadmin/. Acesta vine instalat cu WampServer (instalat anterior):

CREATE DATABASE `elearing` CHARACTER SET utf8 COLLATE utf8_general_ci;

Pentru configurarea conexiunii la baza de date a proiectului trebuie modificat fișierul app/config/parameters.yml astfel:

parameters:

database_driver: pdo_mysql

database_host: 127.0.0.1

database_port: null

database_name: elearning

database_user: root

database_password:null

Primul parametru, database_driver este tipul bazei de date în cazul nostru Mysql. Cel de-al doilea reprezint ip-ul la care este disponibilă baza de date.

54

Implentarea sistemului de înregistrare și autentificare

Pentru a putea integra sistemul de autentificare în aplicație avem nevoie de o entitate User care s implementeze interfaa AdvancedUserInterface și repository-ului UserRepository care va extinde clasa EntityRepository și va implementa interfața UserProviderInterface Diagrama claselor este prezentă n .

Figura 55 Diagrama claselor sistem autentificare

Definirea rolurilor și a rutelor de acces

Crearea fișierului de configurare pentru sistemul de autentificare este primul pas ce trebuie făcut. Astfel vom adăuga în fișierul app/config/security.yml rolurile de care vom avea nevoie, în acest caz vom avea trei roluri: ROLE_STUDENT, ROLE_PROFESOR, ROLE_ADMIN

security:

encoders:

Elearning\ElearningBundle\Entity\User:

algorithm: plaintext

role_hierarchy:

ROLE_PROFESOR: [ROLE_STUDENT]

ROLE_ADMIN: [ROLE_PROFESOR, ROLE_STUDENT]

providers:

user_db:

entity: { class: ElearningElearningBundle:User }

firewalls:

main:

pattern: /.*

provider: user_db

form_login:

login_path: /Security/Login

check_path: /login_check

remember_me: true

always_use_default_target_path: false

default_target_path: /Home

logout:

path: /logout

target: /Security/Login

remember_me:

key: MiPassphrase

lifetime: 1800

path: /.*

domain: ~

security: true

anonymous: true

access_control:

– { path: /login, roles: IS_AUTHENTICATED_ANONYMOUSLY }

– { path: /Profesor.*, roles: ROLE_PROFESOR }

– { path: /Admin.*, roles: ROLE_ADMIN }

– { path: /Student.*, roles: ROLE_STUDENT }

– { path: /.*, roles: IS_AUTHENTICATED_ANONYMOUSLY }

Dupa ce modificările au fost făcute o sa avem trei căi principale de acces, /Student, /Profesor și /Admin corespunzătoare fiecrui rol. Astfel dac un utilizator va încerca să acceseze ruta /admin/editare se va face o verificare dac este autentificat i are rolul corespunzător, n acest caz ROLE_ADMIN.

Dacă nu va îndeplini aceste condiii va i redirecționat la formularul de autentificare. Acest comportament este simulat și n diagrama de secvene din .

Figura 56 Diagrama de secvențe pentru rolurile userilor

Crearea paginii de înregistrare

Pentru crearea paginii de îregistrare s-a creat un nou url la adresa http://localhost/Security/Signup urmând următorii pași.

Crearea unei medote noi în controllerul SecurityController este primul pas. Orice metod dintr-un cotroller trebuie sa fie post-fixată cu cuvntul „Action“ pentru a putea fi executată de utilizatori;

public function loginAction(){

…….

return $this->render('ElearningElearningBundle:Security:signup.html.twig', $viewData);

}

După cum se vede în exemplul de mai sus, metoda returnează fișierul .twig ce va fi randat, iar cel deal doilea parametru ($viewData) reprezintă un array asociativ cu datele necesare pentru randarea codului html din fișierul .twig.

Pentru a face publică această metodă mai trebuie setat url-ul la care se va putea accesa pagina de înregistrare (http://localhost/Security/Signup). Pentru realizarea acestei operți a fost creat fiierul src\Elearning\ElearningBundle\Resources\config\ routing\security.yml cu conținutul următor :

elearning_elearning_security_signup:

pattern: /Signup

defaults: { _controller: ElearningElearningBundle:Security:signup }

Prima linie(elearning_elearning_security_signup) reprezintă numele configurări și ne va oferi posibilitatea de a prelua url-ul pentru înregistrare oriunde în interiorul aplicației. Cheia patern se refer la url-ul specific al acțiunii create pentru înregistrare. Ultima linie face efectiv legtura cu controllerul și mtoda corespunztoare astfel:

ElearningElearningBundle – numele bundle-lului;

Security – numele controller-ului;

signup – numele aciunii(metodei);

După crearea i scrierea fișierului trebuie inclus în fișierul principal de rutare al bundle-lului (\Elearning\ElearningBundle\Resources\config\routing.yml) astfel :

elearning_elearning_security_router:

resource: "@ElearningElearningBundle/Resources/config/routing/security.yml"

prefix: /Security

Prima linie din exemplul anterior va defini un set de url-uri prefixate cu textul „/Security“. Linia secundară definește fiierul de tip .yml ce va fi inclus.

Crearea formularului HTML

Formularul de nregistrare conține câteva informați indispensabile precum: adresa de email, nume de utilizator, parola, numele, prenumele i udeul. Acest formular a fost realizat folosit HTML, CSS, Bootstrap 3.0 iar pentru validrile unor câmpuri jQuery Validation. Vizualizarea formularului folosind un browser de desktop (Chrome 35.0.1) arată ca și în . iar pe un dispozitiv mobil ca în .

Figura 57 Vizualizare pagina înregistrare desktop(Chrome 3.5.0.1)

Figura 58 Vizualizare pe dispozitiv mobil (rezoluție: 320x480px)

Servicii Ajax pentru validarea datelor din formular

Pentru validarea datelor au fost create dou servicii ajax, unul pentru verificarea unicității adresei de email i unul pentru validarea username-ului.Celelalte câmpuri sunt validate cu jQuery Validator (făra requesturi la server). Comportamentul celor dou servicii sunt descrise în .

Tabel 51 Descrierea serviciilor ajax pentru validare

În momentul în care se apasă butonul de trimitere a datelor, dac formularul este gol, o serie de mesaje de eroare specifice fiecărui tip de câmp,ca în .

Figura 59 Afișare erori – formular înregistrare

Crearea paginii de autentificare

Pentru implementarea paginii de autentificare s-a folosit același design .

Figura 510 Formular autentificare

Utilizator se pot autentifica folosind adresa de email și parola selectate la înregistrare. Dacă butonul de autentificare va fi apăsat fară a fi completate ambele câmpuri vor aprea mesaje care să indice câmpurile invalide .

Figura 511 Formular autentificare câmpuri goale

Prin intermediul acestei pagini se pot autentifica cele trei tipuri de utilizatori, aceștia fiind redirecționați ctre paginile alocate rolului lor. Autentificarea necesită o acțiune în controller-ul SecurityController la care se vor trimite datele din formular. Acțiunea creată este loginAction și va verifica autenticitatea datelor . Dacă datele de autentificare sunt invalide utilizatorul va fi redirecționat din nou la pagina de autentificare, dar de aceast dată îi va aprea un mesaj care îl va notifica c datele sale de autentificare folosite sunt invalide .

Figura 512 Date autenficare invalide

Pentru deconectarea de la site trebuie defintă o rută i o aciune n cotrollerul de securitate pentru a șterge sesiunea userului. Ruta defintă este logoutAction, iar dup invalidarea datelor din sesiune va redireciona userul la pagina de autentificare. Codul pentru aceast acțiune fiind prezentat în .

Tabel 52 Funcție PHP pentru

Funcționalități pagin profesorului

Primul pas pentru dezvoltarea sistemului de administrare a materiilor și a cursurilor pentru profesori a fost trasarea unei diagrame use-case pentru o mai bun vizibiate asupra funcționalităilor pe care profesorul poate să le performeze .

După cum se vede n profesorul poate să execute o serie de acțiuni precum adăugarea de cursuri și posibilitatea de editare a acestora. Pentru implementarea acestora s-au creat două controllere, unul pentru randarea html-ului inițial(ProfesorController) iar cel dal doilea va conține implementarea serviciilor ajax necesare acestei pagini (ProfesorAjaxServicesController). Toate metodele controller-ului de servici vor returna un răspuns în format JSON( obiect JsonResponse).

Apelul acestora va fi făcut cu ajutorul metodelor AngularJS prin intermediul unui request HTTP conform cu .

Figura 514 Diagramă de secvențe editre materii/cursuri

Listarea materiilor

Crearea serviciului Ajax

În controllerul ProfesorAjaxServicesController s-a implementat metoda getMateriiAction care va reprezenta serviciul AJAX care va lista materiilor predate de profesorul autentificat. Meoda preia utlizatorul curent din sesiune i formează o listă cu materiile predate de acesta, returnând un obiect de tipul JsonResponse creat cu această listă. Codul este exemplificat în .

Tabel 53 Implementare seviciu AJAX – generare listă materii

Crearea clientului A

Crearea apelului a fost făcută folosind AngularJS. În primul rând trebuie să se includă librăriile necesare :

bundles/elearningelearning/js/angular/angular.min.js

bundles/elearningelearning/js/angular/angular-route.min.js

bundles/elearningelearning/js/angular/angular-resource.min.js

in fișierul .twig src\Elearning\ElearningBundle\Resources\views\Profesor\index.html.twig. Urmtorul pas este crearea a trei fișiere .js care vor facilita atât aducerea datelor în browserul utilizatorului cât și randarea acestora n pagin :

bundles/elearningelearning/js/angular/profesor/app.js

bundles/elearningelearning/js/angular/profesor/services.js

bundles/elearningelearning/js/angular/profesor/controllers.js

După crearea acestor fișiere i includerea lor n pagina HTML, n fișierul profesor/services.js trebuie creat clientul AJAX ca și n . Toți clienții AJAX pentru această pagin vor fi definiți n acest fiier.

Tabel 54 Exemplu client Ajax AngularJS.

Răspunsul returnat n urma cererii HTTP facut de clientul AJAX prin metoda GET arată ca în .

Figura 515 ăspunsul apelului Ajax

Crearea controllerului de AngularJs

Pentru aceast pagin o să avem mai multe controllere de AngularJs, toate trebuind declarate în fișierul bundles/elearningelearning/js/angular/profesor/controllers.js. Pentru listarea materiilor o să avem cotrollerul listareMateriiCtrl care va avea structura din . Variabila $scope va face legatura ntre elementele DOM din pagin i valorile atribuite din controller.

Figura 516 Structura controller-ului de AngularJs

Implementarea listei în HTML și Angular

Pentru implementarea listei vom folosi o list neordonată din HTML și se va itera pe un element cu ajutorul directivei ng-repeat din Angular. Dupa cum se vede în , se definește structura pentru un element din listă, apoi Angular va cuta directiva nr-repeat și va crea câte un element în list pentru fiecare materie. Metodele apelate n interiorul modelului HTML trebuie să fie definite n interiorul controller-ului listareMateriiCtrl.

Exemplu 51 Iterare pe un element din lista

Definirea aplicației AngularJs

n fișierul bundles/elearningelearning/js/angular/profesor/app.js trebuie defintă aplicația Angular care se va ocupa de pagina de administrare a profesorului. Aplicați va defini toate ancorele paginii i controllerele care se vor ocupa de ele.

Exemplu 52 Fișier app.js

Descrierea serviciilor AJAX

Tabel 55 Descriere servicii de salvare pentru materie și curs

Tabel 56 Servicii ștergere materie/curs

Tabel 57 Descriere seviciu de citire a statsticii cursurilor

Vizualizarea rezultatelor implementării

În avem lista materiilor predate de un profesor autentificat. El are posibilitatea de a vizualiza lista cursurilor apăsând pe titlul cursului sau pe textul „Vizualizare”. Butonul „Adaugă Materie” va deschide mai n josul paginii un formular pentru adugarea unei materii.

Figura 517 Vizualizare listă materii predate și buton pentru adaugare materie

În momentul în care se va apsa pe butonul de editare a materiei din , se va deschide formularul de editare al materie, precompletat cu datele actuale. Daca checkbox-ul „Materie Privată” este selectat, atunci cursanții vor avea nevoie de aprobare pentru a putea vizualiza cursurile corespunztoare acelei materii.

Figura 518 Formular adugare/editare materie

Un click pe titlul unei materii sau pe „Vizualizare” va duce la apariția listei cursurilor în partea dreaptă a ecranului .

Figura 519 Listare cursuri i buton pentru adăugarea unui curs

În avem o listă cu trei cursuri și un buton „Adăugare curs“. Pentru fiecare curs în parte avem posibilitatea să îl vizualizăm, edităm, șterge i de a vedea statistica cursului. Statistica cursului constă momentan, în vizualizarea timpului petrecut de fiecare utilizator pe fiecare curs în parte .

Figura 520 Vizualizare statistică curs

Pentru interogarea datelor despre statistica unui curs se face un apel la serviciul descris în . Serviciul va returna un răspuns JSON cu datele despre fiecare utilizator care a accesat cursul.

Dacă se apasă butonul „Adaugă curs“ din , în partea de jos a paginii va apărea un formular de adăugare a cursurilor. Pentru moment s-a optat doar pentru implementarea adăugării cursurilor direct n pagină cu ajutorul . Modul de adugare a cursurilor este prezentat în .

Figura 521 Adaugare/editare cursuri

Un curs poate să fie și un video încrcat pe youtube.com. Acest lucru este posibil deoarece CKEDITOR generează un cod HTML, iar acest lucru este foarte util dacă vrem să încărcăm un video exemplu .

Figura 522 Includerea unui video de pe Youtube

Funcionalități pagină cursant

În este prezentată diagrama use-case pentru acțiunile ce vor putea fi executate curanți.

Figura 523 Diagramă use-case funcționalități student

Dupa autentificare unui cursant i se va afișa o pagină n care sunt listate toate materiile de pe aplicație atât cele private cât i cele publice . Pentru aplicațiile private va avea nevoie de aprobarea administratorului sau a unui profesor.

Figura 524 Listare materii – cursant

Cursantul are posibilitatea să trimită o cerere pentru accesul la o materie apasând butonul „Trimite cerere”. Dupa ce cererea a fost trimisă butonul portocaliu se va transforma ntr-un buton inactiv de culoare albastr cu textul „Aprobare în curs”. Dacă cererea va fi aprobată de administrator, atunci butonul se va transforma ntr-un buton verde care la apare va accesa pagina de vizualizare a unei materii.

Căutarea materiilor

Căutarea materiilor se poate face după titlu, descriere, numele profesorului, sau data adăugării. În este prezentată o filtrare după numele materiei. Cutarea se poate face i dup mai multe filtre simultan.

Figura 525 Filtrare după titlul materie

Figura 526 Căutare cu mai multe filtre

Pentru aducerea informațiilor în pagina sa creat un serviciu Ajax care este descris în . Acesta aduce un pachet sumar de informații despre materii, precum: titlu, descriere, profesorul care o predă, i data la care a fost adăugat materia.

Tabel 58 Serviciu AJAX – listă materii

Listarea și vizualizarea cursurilor

După ce cursantul a obținut accesul la o materieau dacă materia este vizibilă pentru toți utilizatorii vizualizarea listei cursurilor va fi posibilă, cât i accesul la conținutul lor.

Figura 527 Vizualizarea listei cursurilor

În este prezentată vizualizarea unui curs. Daca sunt nregistrate mesaje motivaionale pentru cursul curent, va apărea un mesaj, care va „pluti“ în colțul din dreata jos

l ferestrei ca i în .

Figura 528 Vizualizare curs

Figura 529 Afișare mesaj motivațional

530

Sistemul de înregistrare a timpului i generarea mesajelor motivaționale

În este prezentată diagrama de clase pentru sistemul de înregistrare a timpului i a generări mesajelor motivaționale.

Figura 531 Diagramă clase – statistică și mesaje motivaționale

Înregistrarea timpului se face în momentul în care utilizatorul accesează un curs. Apelarea serviciului jax se face la fiecare minut trecut cu condiția ca utilizatorul să fi avut o acțiune(click, scroll) pe pagină în ultimile cinci minute. Pentru realizarea acestei funcționalități se vor face apeluri asincrone la server în fiecare minut din JavaScript codul este exemplificat n .

Exemplu 53 Apeluri asincrone la server în fiecare minut

Mesajele motivaționale vor fi afișate în funcție de timpul petrecut pe fiecare curs. Se stabilește un timp mediu de care este nevoie pentru a parcurge un curs(aprox. 250 minute dar este configurabil). Acest timp va fi împărțit în zece segmente de timp egale, iar în momentul când pragul pentru un segment este trecut, mesajul se va schimba automat. Pentru schimbarea mesajului se vor face apeluri asincrone la serviciul care furnizează mesajele motivaționale.

S-a ales metoda asincronă pentru c aciunile userului să nu fie oprite cât timp se face apelul la server.

Descrierea serviciilor ajax

Tabel 59 Descriere servicii –înregistrare timp si generare mesaje motivaționale

Functionalițăți pagin administra

532

54

55

533

534

535

510

511

536

537

538

61

62

63

e-iimpunereaunui set de date de intrare i a unor rezultate ateptate rezultatelor obinute

i

c

d

generarea automata de rapoarte,

c

ădespre care se tie se află

64

65

66

Concluzii

eavnd ca modelinstrumente software în limbajul

dedicate.- resurselor oferite de pachetele

atat ,Facilitile de a au reprezentatul din obiectivele importante;nrolul discipline noi

ăpentru studiul materialelor disponibile știlizatorului

se poate realiza prin intermediul îsau

a,c,navigatorulră

îs generat de server

iz timpulde raspuns al

ăpstra

a

Acronime

Anexa

Bilbliografie

[1] Gorton Ian, „Essential Software Architecture.2nd Edition”, 2011

[2] D. Garlan, M. Shaw, „An Introduction to Software Architecture, Advances in Software Engineering and Knowledge Engineering, Volume I.”, 1993.

[3] ANSI/IEEE, Recommended Practice for Architectural Description of Software-Intensive Systems, 1971-2000.

[4] Institute for Interactive Technologies, Bloomsburg University of Pennsylvania., „E-Learning Concepts and Technicques“, 2006

[5] SensioLabs, The book for Symfony 2.3 , 2013

[6] Ed Lecky-Thompson (Author), Heow Eide-Goodman (Author), Steven D. Nowicki (Author), Alec Cove (Author) , “Professional PHP5, 2004”

[7] OWASP Top 10 Most Critical Web Application Security Risks, https://www.owasp.org/index.php/Top_10

[8] 7th Framework Programme for Research and Technology Development, http://www.aliceproject.eu/

[9] Wikipedia Moodle, http://ro.wikipedia.org/wiki/Moodle

[10] Wikipedia PHP, http://ro.wikipedia.org/wiki/PHP

[11] World Wide Web Consortium’s (W3C) documentation on media queries, http://www.w3.org/TR/css3-mediaqueries/

[12] AngularJS — Superheroic JavaScript MVW Framework, https://angularjs.org/

[13] Larry Ullman, PHP 6 and MySQL 5 for Dynamic Web Sites: Visual QuickPro Guide,2007

[14] David Flanagan, „JavaScript: The Definitive Guide: Activate Your Web Pages (Definitive Guides)“,2011

Anexa

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;

class AccesMateriiController extends Controller

{

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getCereriAccesNeaprobateAction()

{

$cereriArray = array();

$cereriAcces = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri')->findBy(array('status'=>0));

foreach ($cereriAcces as $cer){

$cereriArray[] = $this->getCerereFormatata($cer);

}

return new JsonResponse($cereriArray);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getCereriAccesAprobateAction()

{

$cereriArray = array();

$cereriAcces = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri')->findBy(array('status'=>1));

foreach ($cereriAcces as $cer){

$cereriArray[] = $this->getCerereFormatata($cer);

}

return new JsonResponse($cereriArray);

}

public function schmbareStareCerereDeAprobareAction(){

$request = $this->getRequest();

$id = $request->request->getInt('id');

$status = $request->request->get('status') ==='true'?1:0;

$cerere = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri')->findOneBy(array('id'=>$id));

$em = $this->getDoctrine()->getManager();

$cerere->setDataActualizare(new \DateTime())->setStatus($status);

try{

$em->persist($cerere);

$em->flush();

return new JsonResponse(array('STATUS'=>'OK'));

} catch (Exception $ex) {

}

return new JsonResponse(array('STATUS'=>'KO'));

}

/**

*

* @param type $cer

* @return type

*/

private function getCerereFormatata( $cer){

$userRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:User');

$materieRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie');

$cerere = array();

$cerere['id'] = $cer->getId();

$user = $userRepo->findOneBy(array('id'=>$cer->getId()));

$materie = $materieRepo->findOneBy(array('id'=>$cer->getIdMaterie()));

if(!$materie){

return null;

}

if(!$user){

return null;

}

$cerere['materie'] = $materie->getTitluMaterie();

$cerere['user'] = $user->getNume() .' '.$user->getPrenume();

$cerere['data'] = $cer->getDataCerere()->format('d:m:Y');

$cerere['data_modificare'] = $cer->getDataActualizare()->format('d:m:Y');

$cerere['status'] = $cer->getStatus();

return $cerere;

}

}

////////////////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Elearning\ElearningBundle\Entity\User as User;

use Doctrine\Common\Collections\ArrayCollection;

use Symfony\Component\HttpFoundation\JsonResponse;

class AdminController extends Controller

{

public function indexAction()

{

$currentUser = $this->getUser();

$em = $this->getDoctrine()->getManager();

$usersObjects = $this->getDoctrine()->getRepository('ElearningElearningBundle:User')->findAll();

$users = array();

foreach ($usersObjects as $key => $user) {

if($currentUser->getId() != $user->getId() && $user->getRoles()[0]->getRole() != 'ROLE_ADMIN') {

$users[] = $user->__toArray();

}

}

return $this->render('ElearningElearningBundle:Admin:index.html.twig', array('users_json' => json_encode($users)));

}

/**

*

* @return \Elearning\ElearningBundle\Controller\JsonResponse

*/

function updateUserAction(){

$request = $this->getRequest();

$id = $request->request->get('id');

$username = $request->request->get('username');

$email = $request->request->get('email');

$nume = $request->request->get('nume');

$prenume = $request->request->get('prenume');

$roleString = $request->request->get('role');

$oras = $request->request->get('oras');

$isActive = $request->request->get('isActive');

$isActive = 'true' === $isActive;

$password = $request->request->get('password');

$role = $this->getDoctrine()

->getRepository('ElearningElearningBundle:Role')

->findOneByName($roleString);

$em = $this->getDoctrine()->getManager();

$user = $this->getDoctrine()->getRepository('ElearningElearningBundle:User')->findOneBy(array('id'=>$id));

if(!$user){

$user = new User();

}

$user->setUsername($username)->setEmail($email)->setIsActive($isActive)->setNume($nume)->setPrenume($prenume)->setPassword($password)

->setOras($oras)->setIsActive($isActive)->setRoles(new ArrayCollection())->addRole($role);

try{

$em->persist($user);

$em->flush();

return new JsonResponse(array('STATUS'=>'OK'));

} catch (Exception $ex) {

}

return new JsonResponse(array('STATUS'=>'KO'));

}

/**

*

* @return \Elearning\ElearningBundle\Controller\JsonResponse

*/

function deleteUserAction(){

$request = $this->getRequest();

$id = $request->request->get('id');

$user = $this->getDoctrine()->getRepository('ElearningElearningBundle:User')->findOneBy(array('id'=>$id));

if($user){

try{

$em=$this->getDoctrine()->getManager();

$em->remove($user);

$em->flush();

return new JsonResponse(array('STATUS'=>'OK'));

} catch (Exception $ex) {

}

}

return new JsonResponse(array('STATUS'=>'KO'));

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

function getRolesAction(){

$roles = $this->getDoctrine()

->getRepository('ElearningElearningBundle:Role')

->findAll();

$rolesArray = array();

foreach($roles as $key =>$val){

$rolesArray[] = array('text'=> $val->getName(),'value'=>$val->getName());

}

return new JsonResponse($rolesArray);

}

}

////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

class HeaderFooterController extends Controller

{

public function loggedHeaderAction($currentPage = null)

{

$viewData = array(

'currentPage'=>$currentPage

,

);

return $this->render('ElearningElearningBundle:HeaderFooter:loggedHeader.html.twig',$viewData);

}

public function loggedHeaderProfesorAction($currentPage = null)

{

$viewData = array(

'currentPage'=>$currentPage

,

);

return $this->render('ElearningElearningBundle:HeaderFooter:loggedHeaderProfesor.html.twig',$viewData);

}

public function loggedHeaderAdminAction()

{

return $this->render('ElearningElearningBundle:HeaderFooter:loggedHeaderAdmin.html.twig');

}

public function loggedFooterAction()

{

$viewData = array();

return $this->render('ElearningElearningBundle:HeaderFooter:loggedFooter.html.twig',$viewData);

}

public function unloggedHeaderAction($currentPage = null)

{

$viewData = array('currentPage'=>$currentPage);

return $this->render('ElearningElearningBundle:HeaderFooter:unloggedHeader.html.twig',$viewData);

}

public function unloggedFooterAction()

{

$viewData = array();

return $this->render('ElearningElearningBundle:HeaderFooter:unloggedFooter.html.twig',$viewData);

}

}

/////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Elearning\ElearningBundle\Entity\Role as Role;

class HomeController extends Controller

{

public function indexAction()

{

$user = $this->getUser();

if($user){

$roles = $user->getRoles();

if(count($roles) === 1){

if('ROLE_PROFESOR' == $roles[0]->getRole() && ($roles[0] instanceof Role) ){

return $this->redirect($this->generateUrl('Profesor_home'));

}elseif('ROLE_ADMIN' == $roles[0]->getRole()){

return $this->redirect($this->generateUrl('Admin_home'));

}elseif('ROLE_STUDENT' == $roles[0]->getRole()){

return $this->redirect($this->generateUrl('Student_index'));

}

}

}

return $this->redirect($this->generateUrl('logout'));

}

}

/////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\Request;

use Symfony\Component\HttpFoundation\JsonResponse;

use Elearning\ElearningBundle\Entity\Curs;

use Elearning\ElearningBundle\Entity\Materie AS Materie;

class ProfesorAjaxServiceController extends Controller

{

public function indexAction()

{

}

/**

* Get all courses for current user

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getMateriiAction(){

$response = array();

$user = $this->getUser();

$materii = $user->getMaterii();

foreach ($materii as $materie){

$response[$materie->getId()] = $materie->__toArray();

}

return new JsonResponse($response);

}

/**

*

* @param type $id

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getmATERIEAction($id){

$materie = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findOneById($id);

if(null !== $materie){

return new JsonResponse($materie->__toArray(),200);

}

return new JsonResponse(null,400);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function saveCursAction(){

$request = $this->getJsonRequest();

$responseFail = array('status'=>'KO');

$response = $responseFail;

$responseSuccess = array('status'=>'OK');

$em = $this->getDoctrine()->getManager();

$id = $request->request->getInt('id');

$idMaterie = $request->request->get('materie');

$titlu = $request->request->get('titlu');

$continut = $request->request->get('continut');

$descriere = $request->request->get('descriere');

if($id){

$curs = $this->getDoctrine()->getRepository('ElearningElearningBundle:Curs')->findOneById($id);

}else{

$curs = new Curs();

}

try{

$currentDate = new \DateTime();

$materie = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findOneById($idMaterie);

$curs->setContinut($continut)->setTitle($titlu)->setDescriere($descriere)->setDataAdaugare($currentDate)->setMaterie($materie);

$em->persist($curs);

$em->flush();

$response = $responseSuccess;

$cursRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:Curs');

$curs = $cursRepo->findBy(array('dataAdaugare' =>$currentDate))[0];

$response['curs'] = $curs->__toArray();

} catch (\Exception $e){}

return new JsonResponse($response);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function saveMaterieAction(){

$request = $this->getJsonRequest();

$id = $request->request->get('id');

$titlu = $request->request->get('titlu');

$privat = (boolean)$request->request->get('privat');

$descriere = $request->request->get('descriere');

if($titlu && $descriere){

$em = $this->getDoctrine()->getManager();

$user = $this->getUser();

$materieRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie');

$materie = $materieRepo->findOneById($id);

if(!$materie){

$materie = new Materie();

}

$currentDate = new \DateTime();

$materie->setActiv(false)->setTitluMaterie($titlu)->setPrivat($privat)

->setDescriereMaterie($descriere)->setDataAdaugare($currentDate)->setUser($user);

$em->persist($materie);

$em->flush();

$materieDB = $materieRepo->findBy(array('user'=>$user, 'dataAdaugare' =>$currentDate))[0];

return new JsonResponse(array('status'=>'OK','materie'=>$materieDB->__toArray()),200);

}

return new JsonResponse(array('status'=>'KO'),400);

}

/**

*

* @param type $id

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getCursAction($id){

$curs = $this->getDoctrine()->getRepository('ElearningElearningBundle:Curs')->findOneById($id);

if(null !== $curs){

return new JsonResponse($curs->__toArray(),200);

}

return new JsonResponse(null,400);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function stergeMaterieAction(){

$request = $this->getJsonRequest();

$id = $request->request->get('id');

$em = $this->getDoctrine()->getManager();

$materie = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findOneById($id);

try{

$em->remove($materie);

$em->flush();

return new JsonResponse(array('status'=>'OK'),200);

} catch (Exception $ex) {}

return new JsonResponse(array('status'=>'KO'),400);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function stergeCursAction(){

$request = $this->getJsonRequest();

$id = $request->request->get('id');

$em = $this->getDoctrine()->getManager();

$curs = $this->getDoctrine()->getRepository('ElearningElearningBundle:Curs')->findOneById($id);

try{

$em->remove($curs);

$em->flush();

return new JsonResponse(array('status'=>'OK'),200);

} catch (Exception $ex) {}

return new JsonResponse(array('status'=>'KO'),400);

}

/**

* Update mesaje Motivationale

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function updateMesajeMotivationaleAction(){

$request = $this->getJsonRequest();

$id = $request->request->get('id');

$mesaj = $request->request->get('mesaj');

$idCurs = $request->request->get('idCurs');

$procentajAparitie = $request->request->get('procentajAparitie');

$response = array('STATUS'=>'KO');

try{

$mesajeService = $this->get('elearning_el.mesaje_motivationale_service');

$mes = $mesajeService->uptadeMesajeMotivationale($procentajAparitie, $idCurs, $mesaj, $id);

$response['STATUS'] = 'OK';

$response['DATA'] = $mes;

} catch (Exception $ex) {

}

return new JsonResponse($response);

}

public function stergeMesajeMotivationaleAction(){

$request = $this->getJsonRequest();

$id = $request->request->get('id');

$response = array('STATUS'=>'KO');

$mesajeService = $this->get('elearning_el.mesaje_motivationale_service');

if($mesajeService->stergeMesajeMotivationale($id)){

$response = array('STATUS'=>'OK');

}

return new JsonResponse($response);

}

/**

*

* @return Symfony\Component\HttpFoundation\Request

*/

private function getJsonRequest(){

$request = $this->getRequest();

if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {

$data = json_decode($request->getContent(), true);

$request->request->replace(is_array($data) ? $data : array());

}

return $request;

}

}

//////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\Security\Core\SecurityContext;

use Elearning\ElearningBundle\Entity\User;

use Elearning\ElearningBundle\Form\UserType;

use Symfony\Component\HttpFoundation\Request;

use Symfony\Component\HttpFoundation\Response;

use Symfony\Component\HttpFoundation\JsonResponse;

class SecurityController extends Controller

{

/**

*

* @return type

*/

public function indexAction(){

$viewData = array(

'currentPage'=>'login'

);

return $this->render('ElearningElearningBundle:Security:homePage.html.twig', $viewData);

}

/**

*

* @return type

*/

public function loginAction()

{

$request = $this->getRequest();

$session = $request->getSession();

$error = null;

// get the login error if there is one

if ($request->attributes->has(SecurityContext::AUTHENTICATION_ERROR)) {

$error = $request->attributes->get(SecurityContext::AUTHENTICATION_ERROR);

} else {

$error = $session->get(SecurityContext::AUTHENTICATION_ERROR);

$session->remove(SecurityContext::AUTHENTICATION_ERROR);

}

$viewData = array(

'currentPage'=>'login'

);

if(null != $error){

$viewData['error'] = $error;

}

return $this->render('ElearningElearningBundle:Security:login.html.twig', $viewData);

}

/**

* Inregistrare user

* @param \Symfony\Component\HttpFoundation\Request $request

* @return type

*/

public function signupAction(Request $request)

{

$viewData = array(

'currentPage'=>'signup'

);

$entity = new User();

$form = $this->createCreateForm($entity);

$form->handleRequest($request);

if ($form->isValid()) {

try{

$em = $this->getDoctrine()->getManager();

$roleStudent = $this->getDoctrine()->getRepository('ElearningElearningBundle:Role')->findOneByName('student');

$entity->setIsActive(true)->addRole($roleStudent);

$em->persist($entity);

$em->flush();

return $this->render('ElearningElearningBundle:Security:contCreat.html.twig', $viewData);

} catch (\Doctrine\DBAL\DBALException $e){

return $this->redirect($this->generateUrl('elearning_elearning_security_signup'));

}

}

return $this->render('ElearningElearningBundle:Security:signup.html.twig',$viewData);

}

/**

*

* @param \Symfony\Component\HttpFoundation\Request $request

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function validateEmailAction(Request $request){

$email = $request->request->get('email');

$status = array('status'=>'mars');

if($email){

$em = $this->getDoctrine()->getManager();

$entity = $em->getRepository('ElearningElearningBundle:User')->findBy(array('email'=>$email));

$status['status'] = (!$entity)?'OK':'KO';

}

return new JsonResponse($status);

}

/**

*

* @param \Symfony\Component\HttpFoundation\Request $request

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function validateUsernameAction(Request $request){

$username = $request->request->get('username');

$status = array('status'=>'KO');

if($username){

$em = $this->getDoctrine()->getManager();

$entity = $em->getRepository('ElearningElearningBundle:User')->findBy(array('username'=>$username));

$status['status'] = (!$entity)?'OK':'KO';

}

return new JsonResponse($status);

}

/**

* Creates a form to create a User entity.

*

* @param User $entity The entity

*

* @return \Symfony\Component\Form\Form The form

*/

private function createCreateForm(User $entity)

{

$form = $this->createForm(new UserType(), $entity, array(

'action' => $this->generateUrl('User_create'),

'method' => 'POST',

));

$form->add('submit', 'submit', array('label' => 'Create'));

return $form;

}

/**

*

* @return type

*/

public function logoutAction()

{

$this->get('security.context')->setToken(null);

$this->get('request')->getSession()->invalidate();

return $this->redirect($this->generateUrl('login'));

}

/**

* returneaza informatii user

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getMyAccountDataAction(){

$user = $this->getUser();

if($user){

return new JsonResponse($this->getUser()->__toArrayEdit());

}

return new JsonResponse(null, 400);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function updateMyAccountDataAction(){

$user = $this->getUser();

$request = $this->getRequest()->request;

if($user){

$nume = $request->get('nume');

var_dump($nume);

$prenume = $request->get('prenume');

$oras = $request->get('oras');

if($nume && $prenume && $oras){

$user->setNume($nume)->setPrenume($prenume)->setOras($oras);

$em = $this->getDoctrine()->getManager();

$em->persist($user);

$em->flush();

return new JsonResponse(null, 200);

}

}

return new JsonResponse(null, 400);

}

}

///////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;

class StatisticaController extends Controller

{

/**

* track action

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function trackUserAction()

{

try{

$statisticaService = $this->get('elearning_el.statistica_curs_service');

$userId = $this->getUser()->getId();

$cursId = $this->getRequest()->get('idCurs');

$statisticaService->updateStatisticaCurs($userId, $cursId);

return new JsonResponse(null, 200);

} catch (Exception $e) {

JsonResponse(null, 400);

}

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getStatisticaCursAction()

{

$statisticaService = $this->get('elearning_el.statistica_curs_service');

$cursId = $this->getRequest()->get('idCurs');

$statistica = $statisticaService->getStatisticaByCursId($cursId);

if(empty($statistica)){

return new JsonResponse(array());

}

foreach ($statistica as $key => $value) {

$statistica[$key]['numeUser'] = $statisticaService->getNumeUserById($statistica[$key]['userId']);

}

return new JsonResponse($statistica);

}

public function updateMesajAction()

{

$mesajeMService = $this->get('elearning_el.mesaje_motivationale_service');

$cursId = $this->getRequest()->request->get('idCurs');

$id = $this->getRequest()->request->get('id');

$userId = $this->getUser()->getId();

$mesaj = $this->getRequest()->request->get('mesaj');

$nivel = $this->getRequest()->request->get('nivel');

try{

$mesajeMService->uptadeMesajeMotivationale($nivel, $cursId, $mesaj, $id);

return new JsonResponse(null, 200);

} catch (Exception $e) {

JsonResponse(null, 400);

}

}

public function getMesajMotivationalAction(){

$cursId = $this->getRequest()->get('idCurs');

$userId = $this->getUser()->getId();

$statisticaService = $this->get('elearning_el.statistica_curs_service');

$mesajeMService = $this->get('elearning_el.mesaje_motivationale_service');

$timp = $statisticaService->getStatisticaByUserIdAndCursid($userId, $cursId);

if(!$timp){

$timp = 0;

}

$timp = $timp->getTimpPetrecut();

$mesaj = $mesajeMService->getMesajMotivationalByCursIdAndTimp($timp, $cursId);

return new JsonResponse($mesaj);

}

}

/////////////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Symfony\Component\HttpFoundation\JsonResponse;

use Elearning\ElearningBundle\Entity\AccessCursuri as AccessCursuri;

class StudentController extends Controller

{

public function indexAction()

{

$viewData = array('currentPage' =>'homePage');

return $this->render('ElearningElearningBundle:Student:index.html.twig', $viewData);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getListaMateriiAction(){

$materii = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findAll();

$cereriAccesRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri');

$materiiArray = array();

foreach ($materii as $materie){

$arr = $materie->getListaSumara();

if($materie->getPrivat()){

$cerere = $cereriAccesRepo->findBy(array('userId' => $this->getUser()->getId(),'idMaterie'=>$materie->getId()));

if(empty($cerere)){

$arr['status'] = AccessCursuri::NOT_REQUESTED;

}elseif($cerere[0]->getStatus()){

$arr['status'] = AccessCursuri::ACCEPTED;

}else{

$arr['status'] = AccessCursuri::NOT_ACCEPTED;

}

}else{

$arr['status'] = AccessCursuri::PUBLIC_CURS;

}

$materiiArray[] = $arr;

}

return new JsonResponse($materiiArray);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getMaterieAction(){

$request = $this->getRequest();

$materieId = $request->get('idMaterie');

$cereriAccesRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri');

$cerere = $cereriAccesRepo->findBy(array('userId' => $this->getUser()->getId(), 'idMaterie' => $materieId));

$materie = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findOneById($materieId);

if(( $materie && 0 == $materie->getPrivat()) || (!empty($cerere) && $cerere[0]->getStatus())){

$materie = $this->getDoctrine()->getRepository('ElearningElearningBundle:Materie')->findOneById($materieId);

if($materie){

return new JsonResponse($materie->__toArray());

}

}

return new JsonResponse(array('status'=>'No acces'));

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function createCerereAction(){

$request = $this->getRequest();

$materieId = $request->request->get('idMaterie');

$cereriAccesRepo = $this->getDoctrine()->getRepository('ElearningElearningBundle:AccessCursuri');

$cerere = new AccessCursuri();

$cerere->setUserId($this->getUser()->getId())->setIdMaterie($materieId)->setDataActualizare(new \DateTime())

->setDataCerere(new \DateTime())->setStatus(0);

$em = $this->getDoctrine()->getManager();

try{

$em->persist($cerere);

$em->flush();

return new JsonResponse(array('STATUS'=>'OK'));

} catch (Exception $ex) {}

return new JsonResponse(array('STATUS'=>'KO'));

}

}

////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;

use Elearning\ElearningBundle\Entity\Oras;

use Symfony\Component\HttpFoundation\JsonResponse;

class UtilsController extends Controller

{

/**

* Returneaza Lista Oraselor

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function getListaOraseAction()

{

$orase = $this->getDoctrine()->getRepository('ElearningElearningBundle:Oras')->findAll();

$arrayOrase = array();

foreach ($orase as $oras){

$arrayOrase[] = array('text'=>$oras->getOras(),'value'=>$oras->getOras());

}

return new JsonResponse($arrayOrase);

}

/**

*

* @return \Symfony\Component\HttpFoundation\JsonResponse

*/

public function adaugaOrasAction(){

$request = $this->getRequest();

$oras = $request->request->get('oras');

$em = $this->getDoctrine()->getManager();

$orasObj = new Oras();

$orasObj->setOras($oras);

try{

$em->persist($orasObj);

$em->flush();

return new JsonResponse(array('STATUS'=>'OK'));

} catch (Exception $ex) {

}

return new JsonResponse(array('STATUS'=>'KO'));

}

}

/////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Services;

use Elearning\ElearningBundle\Entity\MesajeMotivationale as MesajeMotivationale;

use Doctrine\ORM\EntityManager;

/**

* Description of MesajeMotivationaleService

*

* @author marian radu

*/

class MesajeMotivationaleService {

/**

* timpul mediu de invatare pentru un curs

*/

const TIMP_MEDIU_STUDIU_CURS = 250;

const IMPARTITOR = 10;

function __construct(EntityManager $entityManager) {

$this->em = $entityManager;

$this->repository = $this->em->getRepository('ElearningElearningBundle:MesajeMotivationale');

}

/**

* Update mesaje motivationale

* @param int $procentaj

* @param int $idCurs

* @return boolean

*/

function uptadeMesajeMotivationale($procentaj, $idCurs, $mesaj, $idMesaj = null){

$entitate = null;

if($idMesaj){

$entitate = $this->repository->findOneById($idMesaj);

}

if(empty($entitate)){

$entitate = new MesajeMotivationale();

}

$entitate->setProcentajAparitie($procentaj)->setIdCurs($idCurs)->setMesaj($mesaj);

try{

$this->em->persist($entitate);

$this->em->flush();

return $entitate->__toArray();

} catch (Exception $ex) {

}

return null;

}

/**

* returneaza array cu procentajele posibile

* @return array

*/

function getProcente(){

$proc = array();

$procent = self::TIMP_MEDIU_STUDIU_CURS / self::IMPARTITOR;

for($i=$procent; $i<=self::TIMP_MEDIU_STUDIU_CURS;$i=$i+$procent){

$proc[] = array('value' => $i ,'text' => $i);

}

return $proc;

}

/**

* Returneaza cel Mai apropiat mesaj ca si procentaj de timp petrecut

* @param type $timpConsumat

* @param type $cursId

* @return type

*/

function getMesajMotivationalByCursIdAndTimp($timpConsumat, $cursId) {

$mesaje = $this->repository->findBy(array('idCurs' => $cursId));

$procent = $timpConsumat / self::IMPARTITOR;

if(empty($mesaje)){

return null;

}

$mesajApropiat = $mesaje[0];

foreach ($mesaje as $key => $mesaj) {

if($procent – $mesajApropiat->getProcentajAparitie() > $procent – $mesaj->getProcentajAparitie()

&& $mesaj->getProcentajAparitie() – $procent >= 0){

$mesajApropiat = $mesaj;

}

}

return $mesajApropiat->__toArray();

}

/**

* Returneaza toate mesajele pentru un curs

* @param type $cursId

* @return null

*/

function getMesajeByCurs($cursId){

$mesaje = $this->repository->findBy(array('idCurs' => $cursId));

if(empty($mesaje)){

return null;

}

foreach ($mesaje as $key => $value) {

$mesaje[$key] = $value->__toArray();

}

return $mesaje;

}

/**

* Sterge mesaj dupa $id

* @param type $id

* @return boolean

*/

function stergeMesajById($id){

$entitate = $this->repository->findOneById($id);

try{

$this->em->remove($entitate);

$this->em->flush();

return true;

} catch (Exception $e){

return false;

}

}

}

//////////////////////////////////////////////////////

<?php

namespace Elearning\ElearningBundle\Services;

/**

* Description of StatisticaCursService

*

* @author marian radu

*/

use Elearning\ElearningBundle\Entity\StatitsticaCurs as StatitsticaCurs;

use Doctrine\ORM\EntityManager;

class StatisticaCursService {

const INTERVAL = 1;

protected $em;

protected $repository;

protected $repoUser;

/**

* Initializare serviciu de statistica

* @param \Elearning\ElearningBundle\Services\EntityManager $entityManager

*/

function __construct(EntityManager $entityManager) {

$this->em = $entityManager;

$this->repository = $this->em->getRepository('ElearningElearningBundle:StatitsticaCurs');

$this->repoUser = $this->em->getRepository('ElearningElearningBundle:User');

}

/**

* Update inregistrare dupa idcurs si id user

* @param type $idUser

* @param type $idCurs

* @return boolean

*/

function updateStatisticaCurs($idUser, $idCurs){

$entitate = $this->repository->findBy(array('userId' => $idUser, 'cursId' => $idCurs));

if(empty($entitate)){

$entitate = new StatitsticaCurs();

$entitate->setUserId($idUser)->setCursId($idCurs)->setTimpPetrecut(0);

}else{

$entitate = $entitate[0];

}

$entitate->setTimpPetrecut($entitate->getTimpPetrecut()+self::INTERVAL);

try{

$this->em->persist($entitate);

$this->em->flush();

return true;

} catch (Exception $ex) {

return false;

}

}

/**

* Returneaza ingregistrare dupa iduser si id Curs

* @param type $idUser

* @param type $idCurs

* @return null| Elearning\ElearningBundle\Entity\StatisticaCurs

*/

function getStatisticaByUserIdAndCursid($idUser, $idCurs){

$entitate = $this->repository->findBy(array('userId'=>$idUser, 'cursId' => $idCurs));

if(empty($entitate)){

return null;

}

return $entitate[0];

}

/**

* returneaza toate inregistrarile pentru un curs

* @param type $idCurs

* @return array() || null

*/

function getStatisticaByCursId($idCurs){

$entitati = $this->repository->findBy(array('cursId' => $idCurs));

if(empty($entitati)){

return null;

}

foreach ($entitati as $key => $value) {

$entitati[$key] = $value->__toArray();

}

return $entitati;

}

/**

* returneaza toate inregistrarile pentru un user

* @param type $idUser

* @return null

*/

function getStatisticaByUserId($idUser){

$entitati = $this->repository->findBy(array('userId' => $idUser));

if(empty($entitati)){

return null;

}

return $entitati;

}

/**

*

* @param type $id

* @return string

*/

function getNumeUserById($id){

return $this->repoUser->findOneById($id)->getNumeIntreg();

}

}

////////////////////////////////////////

/**

*

* @type @exp;angular@call;module

*/

var profesorServices = angular.module('profesorServices', ['ngResource']);

/**

*

* @param {type} $scope

* @param {type} $http

* @param {type} getMaterii

* @returns {}

*/

profesorServices.factory('profesorServices', function($http, $rootScope, $location) {

var materii = [];

return {

/**

*

* @param {type} $scope

* @param {type} $http

* @param {type} profesorServices

* @returns {undefined}

*/

getMaterii : function() {

return $http.get(routing.getMateriiUrl)

.then(function(result) {

materii = result.data;

return result.data;

});

},

getMateriiCache : function(){

return materii;

},

setMateriiCache : function(materiiC){

materii = materiiC;

},

/**

*

* @param {type} id

* @returns {unresolved}

*/

getMaterie: function(id) {

if(materii){

return materii[id];

}

return {};

},

addCursInCache: function(curs){

if(0 == materii[curs.materie].cursuri.length){

materii[curs.materie].cursuri = {};

}

materii[curs.materie].cursuri[curs.id] = curs;

},

removeMaterieFromCache: function(id){

delete materii[id];

},

removeCursFromCache: function(idc,idm){

delete materii[idm].cursuri[idc];

},

addMaterieInCache : function(materie){

materii[materie.id] = materie;

},

/**

*

* @param {type} foaieCurs

* @returns 200 on succes 400 on fail

*/

createUpdateCurs: function(curs){

return $http.post(routing.saveCurs, curs, {})

.then(function(result) {

return result.data;

});

},

getStatisticaCurs: function(id){

return $http.get(routing.getStatisticaCurs+'?idCurs='+id)

.then(function(result) {

return result.data;

});

},

saveMaterie: function(materie){

return $http.post(routing.saveMaterie, materie, {})

.then(function(result) {

return result.data;

});

},

stergeMaterie: function(id){

return $http.post(routing.stergeMaterie, {id: id}, {})

.then(function(result) {

return result.data;

});

},

stergeCurs: function(id){

return $http.post(routing.stergeCurs, {id: id}, {})

.then(function(result) {

return result.data;

});

},

propagareDate: {

broadcastMaterie : function(){

$rootScope.$broadcast('broadcastMaterie');

return this;

},

broadcastCurs : function() {

$rootScope.$broadcast('broadcastCurs');

}

}

};

});

/////////////////////////////////////////////////

var viewControllers = angular.module('viewControllers', []);

viewControllers.controller('routingCtrl' , ['$scope','$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

profesorServices.getMaterie($routeParams.idC).then(function(data){

$scope.materie = data;

});

}]);

viewControllers.controller('listareMateriiCtrl' , ['$scope','$location', 'profesorServices',

function($scope, $location, profesorServices){

$scope.cursuri = [];

profesorServices.getMaterii().then(function(data){

$scope.materiiListare = data;

});

$scope.populeazaCursuri = function(mId){

$scope.materieCureta = $scope.materiiListare[mId];

try{

$scope.cursuri = $scope.materiiListare[mId].cursuri;

}catch(e){

$scope.cursuri = {};

}

jq('#lista_cursuri').fadeIn(400);

};

$scope.stergeMaterie = function (id){

profesorServices.stergeMaterie(id).then(function(data){

if('OK' == data.status){

profesorServices.removeMaterieFromCache(id);

$scope.materiiListare = profesorServices.getMateriiCache();

$scope.materieCureta = null;

$scope.cursuri = {};

jq('#lista_cursuri').fadeOut(400);

$location.path('/');

}

});

};

$scope.stergeCurs = function(idc,idm){

profesorServices.stergeCurs(idc).then(function(data){

if('OK' == data.status){

profesorServices.removeCursFromCache(idc, idm);

$scope.materiiListare = profesorServices.getMateriiCache();

$scope.materieCureta = $scope.materiiListare[idm];

$scope.cursuri = $scope.materieCureta.cursuri;

$location.path('/');

}

});

}

$scope.$on('broadcastMaterie', function() {

$scope.materiiListare = profesorServices.getMateriiCache();

if($scope.materieCureta){

var id = $scope.materieCureta.id;

$scope.materieCureta = $scope.materiiListare[id];

$scope.cursuri = $scope.materieCureta.cursuri;

}

});

}]);

viewControllers.controller('addEditMaterieCtrl' , ['$scope', '$routeParams','$location', 'profesorServices',

function($scope, $routeParams, $location, profesorServices){

if($routeParams.idC){

$scope.materie = profesorServices.getMaterie($routeParams.idC);

}

$scope.salveazaMaterie = function(materie){

profesorServices.saveMaterie(materie).then(function(data){

if('OK' == data.status){

profesorServices.addMaterieInCache(data.materie);

profesorServices.propagareDate.broadcastMaterie();

$location.path('/');

}

});

};

}]);

viewControllers.controller('saveUpdateCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

$scope.closeBox = false;

activeEditor = CKEDITOR.replace( 'i-ck-container' );

if($routeParams.idC){

$scope.curs = profesorServices.getMateriiCache()[$routeParams.idM].cursuri[$routeParams.idC];

activeEditor.setData($scope.curs.continut);

}

$scope.$back = function() {

window.history.back();

};

$scope.salveazaCurs = function(curs){

curs.materie = $routeParams.idM;

curs.continut = activeEditor.getData();

profesorServices.createUpdateCurs(curs).then(function(data){

if('OK' == data.status){

if('undefined' !== typeof data.curs){

profesorServices.addCursInCache(data.curs);

profesorServices.propagareDate.broadcastMaterie();

$scope.closeBox = true;

}

}

});

};

}]);

viewControllers.controller('vizualizareCursCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

try{

$scope.materie = profesorServices.getMateriiCache()[$routeParams.idM];

$scope.curs = $scope.materie.cursuri[$routeParams.idC];

jq('#i_continut_curs').html($scope.curs.continut);

}catch(e){

$scope.materie = {};

$scope.curs = {};

}

}]);

viewControllers.controller('vizualizareStatisticaCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

try{

profesorServices.getStatisticaCurs($routeParams.idC).then(function(data){

$scope.statistica = data;

});

}catch(e){

$scope.statistica = [];

}

}]);

//////////////////////////////////////////

var viewControllers = angular.module('viewControllers', []);

viewControllers.controller('routingCtrl' , ['$scope','$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

profesorServices.getMaterie($routeParams.idC).then(function(data){

$scope.materie = data;

});

}]);

viewControllers.controller('listareMateriiCtrl' , ['$scope','$location', 'profesorServices',

function($scope, $location, profesorServices){

$scope.cursuri = [];

profesorServices.getMaterii().then(function(data){

$scope.materiiListare = data;

});

$scope.populeazaCursuri = function(mId){

$scope.materieCureta = $scope.materiiListare[mId];

try{

$scope.cursuri = $scope.materiiListare[mId].cursuri;

}catch(e){

$scope.cursuri = {};

}

jq('#lista_cursuri').fadeIn(400);

};

$scope.stergeMaterie = function (id){

profesorServices.stergeMaterie(id).then(function(data){

if('OK' == data.status){

profesorServices.removeMaterieFromCache(id);

$scope.materiiListare = profesorServices.getMateriiCache();

$scope.materieCureta = null;

$scope.cursuri = {};

jq('#lista_cursuri').fadeOut(400);

$location.path('/');

}

});

};

$scope.stergeCurs = function(idc,idm){

profesorServices.stergeCurs(idc).then(function(data){

if('OK' == data.status){

profesorServices.removeCursFromCache(idc, idm);

$scope.materiiListare = profesorServices.getMateriiCache();

$scope.materieCureta = $scope.materiiListare[idm];

$scope.cursuri = $scope.materieCureta.cursuri;

$location.path('/');

}

});

}

$scope.$on('broadcastMaterie', function() {

$scope.materiiListare = profesorServices.getMateriiCache();

if($scope.materieCureta){

var id = $scope.materieCureta.id;

$scope.materieCureta = $scope.materiiListare[id];

$scope.cursuri = $scope.materieCureta.cursuri;

}

});

}]);

viewControllers.controller('addEditMaterieCtrl' , ['$scope', '$routeParams','$location', 'profesorServices',

function($scope, $routeParams, $location, profesorServices){

if($routeParams.idC){

$scope.materie = profesorServices.getMaterie($routeParams.idC);

}

$scope.salveazaMaterie = function(materie){

profesorServices.saveMaterie(materie).then(function(data){

if('OK' == data.status){

profesorServices.addMaterieInCache(data.materie);

profesorServices.propagareDate.broadcastMaterie();

$location.path('/');

}

});

};

}]);

viewControllers.controller('saveUpdateCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

$scope.closeBox = false;

activeEditor = CKEDITOR.replace( 'i-ck-container' );

if($routeParams.idC){

$scope.curs = profesorServices.getMateriiCache()[$routeParams.idM].cursuri[$routeParams.idC];

activeEditor.setData($scope.curs.continut);

}

$scope.$back = function() {

window.history.back();

};

$scope.salveazaCurs = function(curs){

curs.materie = $routeParams.idM;

curs.continut = activeEditor.getData();

profesorServices.createUpdateCurs(curs).then(function(data){

if('OK' == data.status){

if('undefined' !== typeof data.curs){

profesorServices.addCursInCache(data.curs);

profesorServices.propagareDate.broadcastMaterie();

$scope.closeBox = true;

}

}

});

};

}]);

viewControllers.controller('vizualizareCursCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

try{

$scope.materie = profesorServices.getMateriiCache()[$routeParams.idM];

$scope.curs = $scope.materie.cursuri[$routeParams.idC];

jq('#i_continut_curs').html($scope.curs.continut);

}catch(e){

$scope.materie = {};

$scope.curs = {};

}

}]);

viewControllers.controller('vizualizareStatisticaCtrl' , ['$scope', '$routeParams', 'profesorServices',

function($scope, $routeParams, profesorServices){

try{

profesorServices.getStatisticaCurs($routeParams.idC).then(function(data){

$scope.statistica = data;

});

}catch(e){

$scope.statistica = [];

}

}]);

Similar Posts