Aplicatia Prodrive Pentru Scoala de Soferi Categoria B

LISTĂ IMAGINI

Figura 2.1 Meniul Wamp Server [web3] 9

Figura 2.2 Procentajul diferitelor servere utilizate[web4] 9

Figura 2.3 Interacțiunea PHP – HTML 13

Figura 2.4 Instrucțiuni PHP 13

Figura 2.5 Instrucțiuni PHP 13

Figura 2.6 Instrucțiuni PHP 13

Figura 2.7 Instrucțiuni PHP 13

Figura 2.8 Output script PHP 14

Figura 2.9 Exemplu Echo 14

Figura 2.10 Interfața Adobe Dreamwaver CS6 18

Figura 3.1 Pagina Despre noi 22

Figura 3.2 Formular înregistrare utilizator 23

Figura 3.3 Eroare apărută la completarea câmpurilor obligatorii 24

Figura 3.4 Autentificare 24

Figura 3.5 Utilizator autentificat 25

Figura 3.6 Panoul de administrare 26

Figura 3.7 Panoul de administrare teme 26

Figura 3.8 Panoul de verificare răspunsuri 27

Figura 3.9 Exemplu de întrebare din chestionar 28

Figura 3.10 Exemplu de chestionar finalizat 29

Figura 3.11 Pagina principală a blogului 29

Figura 3.12 Arhiva din Noutăți școală 33

Figura 3.13 Adăugare răspuns 33

Figura 3.14 Structura bazei de date config 35

Figura 3.15 Structura bazei de date chestionare 35

Figura 3.16 Schema bazei de date config 36

Figura 3.17 Schema bazei de date chestionare 36

Figura 4.1 Arborele Problemelor 41

Figura 4.2 Arborele Obiectivelor 41

Figura 4.3 Arborele Strategiilor 42

Figura 4.4 Graficul Gantt 49

LISTĂ TABELE

Tabel 4.1 Factorii interesați care vor susține proiectul 39

Tabel 4.2 Matricea logică a proiectului 42

Tabel 4.3 Planul de resurse 46

Tabel 4.4 Analiza procesului, stabilirea listei activităților și a duratelor activităților 47

LISTĂ ACRONIME

Capitolul 1

Introducere

1.1 Motivarea temei alese

Internetul constituie una din cele mai importante invenții ale epocii moderne, oferind servicii ce ne-au făcut viața mult mai ușoară. Poșta electronică, paginile web, transferul de fișiere, transmiterea în timp real a programelor radio și TV, transferuri de bani, și multe altele sunt doar câteva dintre facilitățile oferite de Internet în prezent.

Totodată, Internetul a oferit posibilitatea firmelor mici și mijlocii de a avea acces pe o piață globală, putând astfel să se adreseze clienților de pretudindeni.

În acest sens, există în prezent diverse site-uri care au ca domeniu de activitate instrucția auto. Pentru a reuși pe această piață, firmele au nevoie atât de publicitate, pentru a-și face cunoscută activitatea în vederea creșterii numărului de clienți, cât și de aplicații specifice care să le vină în ajutor.

Pentru o firmă ce are ca activitate școala de șoferi, pe lângă mica publicitate a persoanelor care au mai apelat la serviciile firmei respective, s-au declarat mulțumite de serviciile oferite și au recomandat-o mai departe cunoscuților, publicitatea prin intermediul internetului are un rol important, deoarece prețurile pentru găzduirea unui site web sunt foarte mici, iar persoanele interesate de astfel de servicii pot găsi ceea ce își doresc cu o simplă accesare a unui motor de căutare.

Însă nu toate site-urile de profil oferă toate informațiile necesare obținerii permisului auto.

De aceea, am hotărât să pun bazele site-ului ProDrive care va oferă:

Posibilitatea de a susține simulări la examenul teoretic din cadrul examenului auto;

Posibilitatea de a face accesibile de acasă materialele necesare în vederea pregătirii pentru susținerea examenului auto;

Programul instructorilor, astfel încât clienții își pot alege instructorul și programul propus de acesta, dar și mașina pe care doresc să exerseze

Contribuția personală constă în: realizarea unei interfețe fluide, intuitive și ușor de utilizat pentru utilizatori; crearea bazei de date; realizarea logică a aplicației. Din punct de vedere economic am realizat o analiză folosind elemente de management de proiect, pe parcursul mai multor etape.

1.2 Alegerea produselor software pentru realizarea interfeței

Orice sistem de operare deține o interfață prin intermediul căreia realizează comunicarea cu operatorul uman. În domeniul interacțiunii om-mașină, interfața utilizatorului este spațiul în care au loc aceste activități. Interfața cu utilizatorul include atât component hardware (fizice) cât și software (logice) oferind un mijloc de:

Intrare, care permite utilizatorului să manipuleze un sistem;

Ieșire, care permite utilizatorului să observe efectele manipulării sale.

În general, scopul interacțiunii om-calculator, este de a realiza o interfață ce este intuitivă, usor de folosit, ce are la bază un mediu de lucru ordonat și care să ofere posibilitatea de manipulare a unui sistem cu un minim de efort. [web1]

În prezent, cele mai utilizate tipuri de interfețe sunt următoarele:

Interfață grafică (GUI – Graphical User Interface)- este o interfață cu utilizatorul bazată pe un sistem de afișaj ce utilizează elemente grafice. Mai exact, acceptă date prin intermediul dispozitivelor de intrare, cum ar fi tastatura si mouse-ul calculatorului și oferă date de ieșire afișate pe monitorul calculatorului;

Interfață ”touchscreen”- acestea acceptă informații de intrare prin intermediul unui stylus (creion special recunoscut de către ecranul tactil) sau deget. Acest tip de interfață este folosit în principal în cadrul dispozitivelor mobile precum: telefoane mobile, tablete sau PDA;

Interfața web (WUI – Web User Interface)- reprezintă o subclasă de GUI care acceptă date de intrare, iar valorile returnate sunt oferite prin generarea de pagini web care sunt transmise prin internet și vizualizate de către utilizator folosind un browser web. Implementarile mai noi utilizează Java, AJAX, Adobe Flex, sau tehnologii similare pentru a oferi control în timp real într-un program separat. [web2]

Pentru realizarea unei astfel de interfețe sunt necesare următoarele:

Un limbaj de programare orientat pe parte de server;

Baza de date care să conțină informațiile necesare;

Un server web care să interpreteze orice fișier solicitat de un browser și să afișeze rezultatul corect în conformitate cu codul din acel fișier. [EN05]

Pentru a crea interfața web destinată simplificării utilizării site-ului școlii de șoferi, se pot folosi în totalitate produse software gratuite. Această posibilitate există deoarece licențele se acordă gratuit publicului în condițiile în care software-ul este utilizat doar în scop didactic.

Pentru realizarea lucrării de față am folosit suita de dezvoltare web WAMPServer care constă din: Apache HTTP Server, MySQL database, PHP și phpMyAdmin. WAMPServer este disponibil pentru Microsoft Windows, Linux și Mac OS X și este utilizat în principal pentru dezvoltarea proiectelor web. Pentru partea de stil, m-am folosit de tehnicile HTML 5, CSS 3 și jQuery.

Capitolul 2

Tehnologii software folosite

2.1 WampServer

WampServer este o aplicație de dezvoltare web pentru sistemul de operare Windows, formată dintr-un pachet de programe create independent.

WAMP este un acronim format din inițialele sistemului de operare Microsoft Windows și componentele principale ale pachetului: Apache, MySQL si unul dintre PHP, Perl sau Python. Apache este un server web, MySQL este un sistem de management de baze de date, iar PHP este un limbaj open-source de programare, interpretat și orientat către dezvoltarea web. [web3]

Varianta folosită de mine este WAMPSERVER 2.2e, iar pachetul conține următoarele versiuni:

Apache 2.2.22

MySQL 5.5.24

PHP 5.4.3

phpMyAdmin

phpMyAdmin este un manager pentru bazele de date MySQL ce oferă unelte pentru administarea completă a structurii și a datelor.

Figura 2.1 Meniul Wamp Server [web3]

2.1.1 Server APACHE

Apache este un server HTTP de tip open-source, numele acestuia provenind de la triburile de amerindieni. Serverul joacă un rol important în dezvoltare, în prezent fiind folosit în aproximativ 60,7% din paginile web. [web4]

Figura 2.2 Procentajul diferitelor servere utilizate[web4]

Apache este un server web cu o contribuție notabilă la dezvoltarea Internetului, reprezentând prima alternativă viabilă la Netscape Communications Corporation (companie americană ce furnizează servicii pentru calculatoare, cel mai bine cunoscută pentru browser-ul său Netscape Navigator). Acesta a evoluat rapid în funcționalitate și performanță devenind foarte competitiv prin alte servere web bazate pe Unix.

Apache este dezvoltat și testat de un grup deschis de programatori, sub emblema Apache Software Foundation. Serverul este disponibil pentru multe sisteme de operare incluzând Unix, FreeBSD, Solaris, Mac OS X, Linux, Novell Neware și Microsoft Windows. Aplicația suportă de asemenea o mare varietate de module care îi extind astfel funcționalitatea. Printre aceste module se numără: sever side programming, suport SSL și TLS, modulul proxyun, modulul de rescriere URL, suportul de filtrare, etc. Pe lângă aceste module, Apache se laudă si cu mai mult limbaje suportate: mod_perl, mod_python, TCL și PHP.

Aplicația oferă și posibiltatea de a găzdui mai multe site-uri simulatan pe același server, prin opțiunea virtual hosting și permite autentificarea bazelor de date bazate pe DBMS și ”content negotiation-mecanism” definit în specificația HTTP. Acestea fac posibilă redarea diferitelor versiuni ale unui document în același URL. Astfel, utilizatorii pot alege ce versiune cred că li se potrivește mai bine. De asemenea, Apache oferă posibilitatea autentificării prin parolă sau prin certificat digital.

Toate aceste avantaje au făcut ca serverul Apache să fie folosit de unele din cele mai mari site-uri din lume. Google folosește o versiune modificată numită Google Web Server (GWS) pentru motorul său de căutare. De asemenea, proiectele Wikipedia și Wikimedia au la bază tot un server Apache. Principalii competitori ai serverului Apache sunt: Microsoft Internet Information Services (IIS), Sun Java System Web Server produs de compania Sun Mircosystems și Zeus Web Server. [web5]

2.1.2 MySQL

MySQL este un sistem de gestiune a bazelor de date relaționale și este distribuit în regim gratuit. O bază de date reprezintă o modalitate de stocare a unor informații și date pe un suport extern. Un sistem de management de baze de date reprezintă setul de programe folosit pentru crearea structurii, introducerea și extragerea datelor și gestionarea accesului la acestea. Comunicarea cu acesta se face prin intermediul unui limbaj de interogare structurat – Structured Query Language (SQL).

MySQL este disponibil atât în Windows cât și sub Linux/Unix. Interacțiunea între server și clienți se efectuează prin intermediul unui protocol de rețea, care este același indiferent de sistemul de operare al serverului și al clienților. De aceea, este posibil ca stațiile pe care rulează clienții să aibă sistem de operare diferit de cel aflat pe stația serverului.

Clienții MySQL se pot conecta la serverul MySQL efectuând cereri către acesta. Programele client pot rula pe mașini aflate în rețea cu serverul, în altă rețea sau chiar pe mașina serverului. [IM03]

Pachetul MySQL conține următoarele categorii de programe:

serverul MySQL – gestionează bazele de date stocate pe hard-disk sau în memorie, iar prin intermediul acestuia clienții pot efectua operațiile dorite cu bazele de date (creare/modificare/ștergere/populare cu date/etc);

clienții MySQL – pachetul MySQL conține și programe care interfațează cu serverul, conectându-se la el și efectuând cereri către acesta. Apar două categorii de utilitare:

cele pentru manipulare a structurii bazelor de date și a datelor conținute:

mysql, ce oferă utilizatorului o linie de comandă cu serverul SQL

mysqldump, care realizează un backup al unei tabele

mysqlimport, importă date dintr-un fișier într-o tabelă a unei baze de date

cele pentru administrarea serverului:

mysqladmin, un utilitare ce monitorizează și administrează serverul MySQL;

programe utilitare non-client – care nu se conectează la server, ele realizează funcții prin accesul direct la date, exemplu: programele de verificare și refacere a integrității bazelor de datela pe mașini aflate în rețea cu serverul, în altă rețea sau chiar pe mașina serverului. [IM03]

Pachetul MySQL conține următoarele categorii de programe:

serverul MySQL – gestionează bazele de date stocate pe hard-disk sau în memorie, iar prin intermediul acestuia clienții pot efectua operațiile dorite cu bazele de date (creare/modificare/ștergere/populare cu date/etc);

clienții MySQL – pachetul MySQL conține și programe care interfațează cu serverul, conectându-se la el și efectuând cereri către acesta. Apar două categorii de utilitare:

cele pentru manipulare a structurii bazelor de date și a datelor conținute:

mysql, ce oferă utilizatorului o linie de comandă cu serverul SQL

mysqldump, care realizează un backup al unei tabele

mysqlimport, importă date dintr-un fișier într-o tabelă a unei baze de date

cele pentru administrarea serverului:

mysqladmin, un utilitare ce monitorizează și administrează serverul MySQL;

programe utilitare non-client – care nu se conectează la server, ele realizează funcții prin accesul direct la date, exemplu: programele de verificare și refacere a integrității bazelor de date (cum ar fi, de exemplu, programele de verificare și refacere a integrității bazelor de date).

În afara aplicațiilor incluse în pachetul MySQL, există alte câteva programe care fac interacțiunea cu un server mai ușoră:

MySQL Query Browser – utilitar grafic pentru interogarea manuală a serverului MySQL, cu facilități multiple (creare de scripturi SQL, construire de interogare prin drag and drop, analiza și modificarea grafică a unei structuri de baze de date, etc)

MySQL Administrator – utilitar grafic pentru administrarea serverului MySQL ce cuprinde facilități precum urmărirea și reglarea parametrilor serverului, efectuarea de backup-uri și restaurări ale bazelor de date, etc.

phpMyAdmin – aplicație web pentru interacțiunea cu un server MySQL, folosită mai ales în cazul site-urilor web care interfațează cu servere de baze de date. Prin intermediul acestei aplicații se pot executa comenzi SQL pentru descrierea și pentru manipularea datelor. De asemenea, poate fi utilizat și la stabilirea relațiilor dintre tabele, gestiunea utilizatorilor bazei de date și a privilegiilor acestora, indexarea tabelelor, importul și exportul de baze de date. [IM03]

2.1.3 PHP, JavaScript/AJAX

PHP (PHP Hypertext Processor) este un limbaj de scripting utilizat la scară largă, realizat și distribuit în sistem open source, care este special realizat pentru a dezvolta aplicații web, prin integrarea codului PHP în documente HTML. Deși scopul principal al limbajului este acela de a scrie rapid pagini web dinamice, cu cu PHP se pot realiza mult mai multe operații.

PHP poate fi utilizat pe toate sistemele de operare majore, inclusiv Linux, multe variante Unix, Microsoft Windows, Mac OS X, RISC OS și are avantajul de a susține majoritatea serverelor web existente în prezent.

Mai mult, spre deosebire de limbajele de scripting (precum JavaScript), precum JavaScript, PHP rulează pe serverul Web, nu în browserul Web. În consecință, PHP poate obține accesul la fișiere, baze de date și alte resurse inaccesibile programului JavaScript. Acestea constituie bogate surse de conținut dinamic, care atrag vizitatorii.

PHP-ul este unul din cele mai folosite limbaje de programare server-side, conform unui studiu efectuat de Netcraft în aprilie 2002, apărând pe 9 din cele 37 milioane de domenii cercetate în studiu. Figura de mai jos reprezintă graficul creșterii folosirii PHP-ului.

Figura 2.3 Graficul creșterii folosirii limabjului PHP [web15]

Programele PHP execută trei categorii de operații elementare:

Obțin date de la un utilizator;

Execută prelucrări ale datelor, respectiv obțin accesul la datele stocate în fișiere și baze de date și le manipulează;

Afișează date astfel încât un utilizator să le poata vizualiza. [web6]

În ce scop se utilizează PHP?

PHP este folosit în principal în două scopuri:

pentru generarea dinamică a paginilor web – interpretorul PHP este folosit de către serverul web pentru a genera pe loc paginile web care sunt apoi livrate clienților.

pentru realizarea de scripturi pentru administrarea de sistem.

Paginile unui site web pot fi:

statice – un ansamblu de fișiere HTML împreună cu imaginile aferente; clienții vor putea vedea același conținut la fiecare accesare;

dinamice – paginile sunt generate pe loc în momentul accesării de către clienți, la generarea lor putându-se ține cont de parametrii conexiunii, identitatea clientului, input-ul furnizat de către acesta prin intermediul unui formular. Atunci când clientul solicită o anumită adresă web, în loc ca serverul web să facă simpla citire a conținutului unui fișier HTML de pe hard-disk, el execută un program PHP care generează codul HTML ce reprezintă sursa paginii web.

Mai jos sunt prezentate două exemple concrete de folosire a PHP:

generarea dinamică a paginilor web cu PHP: un motor de căutare. Atunci când utilizatorul introduce cuvintele cheie dorite și apasă butonul de căutare, pagina cu rezultatele căutării va fi generată pe loc în funcție de cuvintele cheie specificate;

administrarea de sistem cu PHP: administratorul unui server web scrie un script PHP construiește statistici de trafic. Scriptul este configurat să ruleze periodic și să trimită mail administratorului cu statisticile generate. [IM03]

Interacțiunea PHP – HTML:

PHP este un limbaj HTML încorporat și a fost gândit să fie inserat în cadrul paginilor web și rulat pe server în momentul în care este solicitată respectiva pagină. Interpretorul PHP parcurge fișierul primit spre execuție, executând numai porțiunile de cod PHP și ignorându-le pe cele HTML.

Figura 2.4 Interacțiunea PHP – HTML

Condiția ca porțiunile de cod PHP să fie recunoscute ca atare de către interpretor este ca ele să fie delimitate de o pereche de tag-uri (etichete de început/sfârșit de cod PHP ). Există 4 tipuri de tag-uri:

<?php instrucțiuni_php; ?> – modalitatea recomandată și cea mai des întâlnită, disponibilă întotdeauna.

Figura 2.5 Instrucțiuni PHP

<script language=”php”> instrucțiuni_php; </script> – această modalitate nu este întotdeauna agreată de către ediotare.

Figura 2.6 Instrucțiuni PHP

<? Instrucțiuni_php; ?> – „Short-tags”, acestea nefiind recomandate deoarece acestea pot fi dezactivate din fișierul de configurare al PHP, prin urmare nu sunt tot timpul disponibile. Un alt motiv pentru care nu sunt recomandate este conflictul cu tag-urile tradiționale XML, atunci când se inserează un cod PHP într-un fișier XML sau XHTML.

Figura 2.7 Instrucțiuni PHP

<% instrucțiuni_php %> – „ASP tags”. Nu este recomandată folosirea lor deoarece, și acestea, pot fi dezactivate din fișierul de configurare pentru portabilitate.

Figura 2.8 Instrucțiuni PHP

Output-ul final al execuției scriptului este alcătuit dintr-un cod HTML ce rezultă din compunerea a două tipuri de elemente:

codul HTML prezent în fișier în afara tag-urilor PHP și care rămâne nealterat.

output-urile execuției porțiunilor de script PHP.

Figura 2.9 Output script PHP

În exemplul concret de mai jos porțiunea de cod PHP (<?php….?>) este înlocuită cu rezultatul comenzii „echo”, adică cu adresa IP a clientului:

Figura 2.10 Exemplu Echo

JavaScript este un limbaj de programare orientat obiect, foarte popular, ce a fost dezvoltat de Netscape. Cea mai des întâlnită utilizare a JavaScript este în scriptarea paginilor web. Programatorii web pot îngloba în paginile HTML script-uri pentru diverse activități, cum ar fi verificarea datelor introduse de utilizatori sau crearea de meniuri și alte efecte animate. Browserele rețin în memorie o reprezentare a unei pagini web sub forma unui arbore de obiecte și pun la dispoziție aceste obiecte script-urilor JavaScript, care le pot citi și manipula. Arborele de obiecte poartă numele de Document Object Model sau DOM. Există un standard W3C (World Wide Web Consortium) pentru DOM-ul pe care trebuie să îl pună la dispoziție un browser, ceea ce oferă premiza scrierii de script-uri portabile, care să funcționeze pe toate browserele. Deși tendința browserelor este de a se alinia standardului W3C, unele încă prezintă incompatibilități majore, cum este cazul browserului Internet Explorer.

O tehnică de construire a paginilor web tot mai întâlnită în ultimul timp este AJAX, abrevierea de la „Asynchronous JavaScript And XML”. Această tehnică constă în executarea de cereri HTTP în fundal fără a reîncărca pagina web și actualizarea numai anumitor porțiuni ale paginii prin manipularea DOM-ului paginii. Tehnica AJAX permite construirea unor interfețe web cu timp de răspuns foarte mic, deoarece operația de încărcare a unei pagini HTML complete este în mare parte eliminată. [web7]

2.2 HTML

HTML este o abreviere de la Hypertext Markup Language și reprezintă un limbaj pentru crearea și marcarea (formatare, aranjare) unui document astfel încât să poată fi publicat pe World Wide Web și vizualizat cu ajutorul unui browser ((Mozilla Firefox, Google Chrome, Opera, Internet Explorer 9+). HTML nu este un limbaj de programare, ci un limbaj descriptiv prin care sunt descrise elementele structurale ale paginii Web: tabele, liste, titluri, paragrafe, legături cu alte pagini, precum și aspectul pe care îl are pagina din puncte de vedere grafic. Cu alte cuvinte, HTML reprezintă modul în care îi comunicăm browser-ului ce elemente dorim să introducem în pagina Web și aspectul acestora.

HTML nu este un limbaj case-sensitive, așadar nu face distincția între literele mici și cele mari (majuscule). Astfel, indiferent cum vor fi scrise etichetele, cu majuscule sau cu litere mici, ele vor fi corect interpretate de browser. [web8]

Un document HTML standard este compus din următoarele blocuri:

<html>

<head> . . . </head>
<body>
<h1> Primul titlu </h1>
<p> Primul paragraf. </p>
</body>
</html>

Blocul exterior este <html> . . . </html> și reprezintă tot documentul HTML, în interiorul acestuia se află patru blocuri standard <head> . . . </head> care reprezintă titlul paginii, <body> . . . </body> care reprezintă conținutul unei pagini web, <h1> . . . </h1> care reprezintă titlul textului din conținut, <p1> . . . </p1> reprezintă un paragraf din conținutul paginii web.

2.3 XHTML

XHTML este acronimul pentru Extensible HyperText Markup Language și este noua generație de HTML, conform cu tehnologia XML, astfel că XHTML are facilități moștenite de la ambele limbaje de programare:

Similar limbajului HTML, XHTML poate fi utilizat la crearea paginilor Web;

Similar limbajului HTML, XHTML poate fi utilizat cu toate aplicațiile XML;

Fișierele XHTML trebuie să conțină o declarație DOCTYPE. Pentru această declarație obligatorie, există trei posibilități:

XHTML 1.0 Strict: În acest caz nu se pot utilize elementele HTML 4.01 depreciate (<applet>, <basefont>, <center>, <dir>, <font>, <isindex>, <menu>, <s>, <strike> și <u>) și nici elementele HTML 4.01 depășite (<listing>, <plaintext> și <xmp>).

Sintaxa este: <!DOCTYPE html

PUBLIC ”-//W3C//DTD XHTML 1.0 Strict//EN”

”http:/www.w3.org/TR/xhtmll/DTD/xhtmll-strict.dtd.”>

XHTML 1.0 Transitional: Se pot utilize elementele depreciate, dar nu și cele depășite.

Sintaxa este: <!DOCTYPE html

PUBLIC ”-//W3C//DTD XHTML 1.0 Ttansitional//EN”

”http:/www.w3.org/TR/xhtmll/DTD/xhtmll-transitional.dtd.”>

XHTML 1.0 Frameset: Se pot utilize elemente <frameset> și <frame>.

Sintaxa este: <!DOCTYPE html

PUBLIC ”-//W3C//DTD XHTML 1.0 Frameset//EN”

”http:/www.w3.org/TR/xhtmll/DTD/xhtmll-frameset.dtd.”>

Toate declarațiile DOCTYPE precizează ”html” ca element rădăcină al fișierului XHTML și un identificator ”PUBLIC” care face referire la un fișier DTD (Document Type Definition). Aceasta conține regulile pe care trebuie să le respecte fișierul XHTML. Declarația DOCTYPE trebuie plasată înainte de elemental rădăcină ”html” al fișierului XHTML.

Extensia de nume pentru un fișier XHTML poate fi ”.html” sau ”.xhtml”. Pentru a se păstra compatibilitatea cu browserele mai vechi, s-a optat pentru utilzarea extensiei ”.html”. [TG09]

2.4 CSS

CSS (Cascading Style Sheets) sau foi de stil în cascadă, reprezintă un mecanism simplu de a adăuga elemente de stil (tipuri de caractere, culori, aliniere, spațiere etc.) unui document web.

Tag-urile HTML au avut inițial rolul de defini conținutul unui document, de a face distincția între titlul unui paragraf (definit prin tag-urile <h>), continutul paragrafului (definit prin tag-ul <p>), tabele (definite prin tag-ul <table>) etc. Aspectul și modul de afișare al unui site cădeau în sarcina browserului, fără a fi folosite niciun fel de tag-uri de formatare. [web9]

2.4.1 Prioritate în cascadă

CSS specifică o schemă a priorităților pentru a determina care regulă de stil are prioritate atunci când există mai multe reguli aplicate aceluiași element. Este vorba de așa-numita prioritate în cascadă, prioritatea fiind calculată conform anumitor reguli, astfel încât rezultatul să fie predictibil.

Informațiile de stil pot fi prezentate sub diferite forme. Astfel putem deosebi:

stiluri inline, definite în interiorul unui element HTML

foi de stil interne, definite în interiorul elementului <head>

foi de stil externe, definite într-un fisier cu extensia .css

Prioritatea cea mai mare o are stilul inline, după care, din punctul de vedere al priorității, urmează stilul definit în interiorul elementului <head> și, în cele din urmă, stilul din foaia externă. Prin urmare, o definire a stilului inline va predomina în fața stilului intern care, la rândul sau, va predomina în fața stilului extern. [web9]

2.4.2 Folosirea stilurilor

Sintaxa CSS este alcătuită din trei părți: un selector, o proprietate și o valoare, în următorul format:

selector { proprietate: valoare}

Selectorul este reprezentat de elementul (tag-ul) căruia i se dorește a-i aplica un anumit stil, proprietatea este atributul care se schimbă și fiecare proprietate putând lua o anumită valoare. Propritatea și valoarea sunt separate de două puncte (:) și sunt încadrate de acolade {}.

De exemplu: body {color: blue}

Dacă se dorește modificarea a mai multor proprietăți ale aceluiași element, trebuie să se separe fiecare proprietate cu punct și virgulă (;). Exemplul de mai jos arată cum se definește un paragraf aliniat pe centrul paginii iar textului i se aplică culoarea roșie:

p {text-align: center; color: red}

Pentru a evidenția mai bine proprietățile definitie de stil, se poate scrie fiecare proprietate pe câte un rând, precum în exemplul următor:

p {

    text-align: center;

    color: red

}

De asemenea, ca și în HTML, pentru a putea introduce și explicații ce pot fi utile ulterior, în CSS pot fi inserate comentarii ce vor fi ignorate de către browser. Comentariile încep cu (/*) și se încheie cu (*/), precum în exemplul următor:

/* Acesta este un comentariu */ [web9]

2.5 Editorul Adobe Dreamwaver

Adobe Dreamweaver (cunoscut anterior ca Macromedia Dreamweaver) este o aplicație de dezvoltare web a companiei americane Adobe Systems, disponibilă atât pentru MS Windows, cât și pentru Apple Mac OS. Versiunile recente includ suport pentru tehnologii web cum ar fi CSS, JavaScript, PHP, Cold Fusion, cât și cadre ASP.

Figura 2.11 Interfața Adobe Dreamwaver CS6

Dreamweaver s-a bucurat de un larg succes încă de la sfârșitul anilor '90 și momentan deține aproximativ 80% din piața editoarelor HTML. Produsul poate fi rulat pe diferite platforme software: Mac, Windows, dar suportă în același timp și platforme UNIX cu ajutorul unor emulatoare software, cum ar fi Wine.

Ca orice alt editor, Dreamweaver poate ascunde detaliile de implementare a paginilor HTML, făcând astfel posibilă crearea cu ușurință a paginilor web de către utilizatorii neexperimentați.
Unii creatori de pagini web critică aceste tipuri de editoare deoarece produc pagini de dimensiuni mult mai mari decât ar fi necesar, ceea ce conduce la o funcționare neperformantă a browserelor web. Această afirmație este în mare parte adevărată deoarece paginile web produse folosesc design-ul pe bază de tabel. În plus, produsul a mai fost criticat în trecut și pentru producerea de coduri care adesea nu erau conform standardelor W3C, dar acest aspect a fost mult îmbunătățit în versiunile recente. Cu toate acestea, Macromedia a crescut suportul pentru tehnologia CSS, precum și alte modalități de design fără a fi necesară folosirea design-ului pe bază de tabel.
Pentru a previzualiza website-ul creat Dreamweaver permite folosirea majorității browserelor instalate pe calculatorul utilizatorului. De asemenea, conține și câteva utilitare pentru administrarea site-urilor, cum ar fi cele pentru a găsi și modifica un paragraf sau o linie de cod, în întregul web site, pe baza oricăror parametri specificați de către utilizator. Cu ajutorul panourilor de stare se poate crea cod JavaScript fără a avea cunoștințe de programare.
Odată cu apariția versiunii MX, Macromedia a încorporat utilitare de generare dinamică a conținutului. De asemenea este oferit suport pentru conectarea la baze de date (cum ar fi MySQL și Microsoft Access) pentru a filtra și afișa conținutul folosind script-uri de genul PHP, ColdFusion, Active Server Pages (ASP) și ASP.NET, fără a avea nevoie de o prealabilă experiență în programare.
Un aspect foarte lăudat al Dreamweaver-ului îl reprezintă arhitectura sa extensibilă. Extensiile, așa cum sunt ele cunoscute, sunt mici programe, pe care orice dezvoltator le poate scrie (de obicei în HTML și JavaScript) și pe care oricine le poate descărca și instala, acestea aducând un spor de performanță și funcționalitate îmbunătățită programului. Există o comunitate de dezvoltatori care produc aceste extensii și le publică (atât comercial cât și gratuit) pentru probleme de dezvoltare web, de la simple efecte rollover până la soluții complete de vânzare online. [web10]

2.6 Adobe Photoshop

Adobe Photoshop este produs și distribuit de compania americană Adobe Systems și este un software folosit pentru editarea imaginilor digitale pe calculator.

Interfața intuitivă permite o multitudine de modificări necesare în mod curent utilizatorilor cum ar fi editări de luminozitate și contrast, culoare, focalizare, aplicare de efecte pe imagine sau pe zone (selecții), retușare de imagini degradate, număr arbitrar de canale de culoare, suport de canale de culoare pe 8, 16 sau 32 biți etc. Alături de aplicația Photoshop (ajuns la versiunea CS6), este inclusă și aplicația ImageReady, cu un impresionant set de instrumente Web pentru optimizarea și previzualizarea imaginilor (dinamice sau statice), prelucrarea pachetelor de imagini cu ajutorul sistemului droplets-uri (mini-programe de tip drag and drop) și realizarea imaginilor rollover (imagini ce își schimbă aspectul la trecerea cu mouse-ul peste), precum și pentru realizarea de GIF-uri animate.

Principalele elemente prin care Photshop se diferențiază de aplicațiile concurente și prin care stabilește noi standarde în industria prelucrării de imagini digitale sunt:

Selecțiile

Straturile (Layers)

Măștile (Masks)

Canalele (Channels)

Retușarea

Optimizarea imaginilor pentru Web

Photoshop poate citi majoritatea fișierelor raster și vector. De asemenea, are o serie de formate proprii:

PSD (abreviere pentru Photoshop Document). Acest format conține o imagine ca un set de straturi (Layers), incluzând text, măști (mask), informații despre opacitate, moduri de combinare (blend mode), canale de culoare, canale alfa (alpha), căi de tăiere (clipping path) precum și alte elemente specifice Photoshop. Acesta este un format popular și des răspândit în rândul profesioniștilor (și nu numai), astfel că este compatibil și cu unele aplicații concurente Photoshop.

PSB (denumit Large Document Format) este o versiune mai nouă a formatului PSD, conceput special pentru fișiere mai mari (2GB) sau cu o informație prezentă pe o suprafață definită de laturi mai mari de 30.000 de pixeli (suportă până la 300.000×300.000 pixeli).

PDD este un format mai puțin întâlnit, fiind asociat inițial aplicației Adobe PhotoDeluxe, astăzi (după 2002) compatibil doar cu aplicațiile Adobe Photoshop sau Adobe Photoshop Elements. [web11]

2.7 WordPress

WordPress este o platformă de tip sursă deschisă (open-source) pentru publicarea blogurilor. Platforma WordPress este scrisă în limbajul PHP, folosind pentru gestionarea bazelor de date sistemul MySQL. Avantajele majore prezentate de WordPress sunt simplitatea și numeroasele opțiuni create de către comunitate care pot modifica funcționalitatea WordPress-ului tranformându-l în aproape orice tip de site web. [web12]

Utilizatorii WordPress pot instala și schimba teme unele gratuite, altele cu plată. Cu ajutorul temelor, utilizatorii pot schimba funcționalitatea și aspectul unui site WordPress, fără a afecta conținutul și structura site-ului. Temele sunt bazate pe PHP, HTML, CSS și pot fi modificate, incluzând astfel facilități noi, sau modificându-le aspectul.

O facilitate foarte populară a WordPress este folosirea opțiunilor care ajută utilizatorii sau dezvoltatorii/programatorii să îmbunătățească un site Wordpres cu facilități adiționale celor standard. Există o bază de date de peste 24 de mii de opțiuni gratuite pe site-ul WordPress.org. Acestea adaugă sau modifică facilități cum ar fi SEO (Search Engine Optimization – optimizarea pentru motoarele de căutare), adăugarea de slidere de imagini, formulare, alte tipuri de widget-uri, etc.

Ce oferă WordPress:

Managementul articolelor bazat pe categorii și cuvinte cheie sau etichete;

Actualizări regulate (3-4 pe an) care oferă siguranța că site-ul folosește ultimele tehnologii și are ultimele actualizări de securitate, fără a pierde conținutul. Există și opțiunea de actualizare automată sau actualizare cu un clic;

Interfață de administrare facilă;

Conținutul este ușor de administrat: pagini, articole, imagini, video, audio, link-uri. Pot fi adăugate și alte tipuri de conținut, ca produse, servicii, testimonial;

Integrare cu platformele Social Media și e-commerce cu ajutorul widget-urilor;

WordPress poate fi folosit ca blog, site de prezentare, forum, sau magazin virtual;

Conține o funcție de comentarii nativă cu posibilitatea de moderare a comentariilor sau funcție de anti Spam;

Are grupuri de utilizatori native, implementate;

Structura și  aspectul site-ului pot fi personalizate prin teme și/sau opțiuni;

Capabilitatea de a proteja paginile și articolele, fie cu o parolă separată fie pot fi disponibile doar pentru anumite grupuri de utilizatori;

Conținutul poate fi publicat de oriunde cu ajutorul aplicațiilor pentru tablete sau telefoane mobile, sau se poate trimite un email către o adresă de mail (creată automat de WordPress pentru site-ul în cauză) și conținutul se va publica automat;

WordPress are o facilitate de căutare în site;

WordPress este tradus în peste 60 de limbi;

Ceea ce vezi este ceea ce obții sau What You See Is What You Get (WYSIWYG), însemnând că așa cum apare în momentul editării, așa va arăta și după publicare. [web14]

Capitolul 3

Proiectarea și implementarea tehnică a aplicației

3.1 Descrierea generală a aplicației

ProDrive este un site destinat în principal utilizatorilor ce își doresc obținerea informațiilor necesare în vederea susținerii examenului auto. Aceștia au la dispoziție un blog în care sunt informați în permanență cu privire la schimbările ce au loc în codul rutier dar și noutăți legate de școala. De asemenea, clienții înscriși în cadrul școlii au posibilitatea de a susține chestionare online în vederea pregătirii pentru examenul teoretic.

Pagina principală

Această pagină oferă utilizatorilor posibilitatea de a naviga pe întreaga interfață a site-ului. În partea de sus (antet sau header) a pagini se află logo-ul site-ului împreună cu numele acestuia. Tot aici se află secțiunile Autentificare și Creare Cont, precum și subcategoriile Despre Noi, Legislație, Înscriere, Contact, Blog.

Coloana din stânga propune o modalitate de navigare în site, navigarea după categorie-subcategorie. La clickul pe o subcategorie, în componenta din centru sunt returnate toate informațiile asociate subcategoriei respective.

În partea de mijloc se află componenta centrală (main) unde vor fi afișate toate informațiile din site. În partea de jos a pagini (footer) se află termenii și condițiile de utilizare ale site-ului.

Figura 3.1 Pagina Despre noi

Înregistrarea unui nou utilizator

În continuare va fi prezentat scriptul necesar înregistrării potențialilor clienți. Scriptul efectuează următoarele:

Afișează și manipulează formularul;

Afișează din nou formularul cu vechile valori în cazul apariției unei probleme;

Asigură un nume de utilizator (username) și o adresă unică de poștă electronică;

Parola utilizatorului este înregistrată criptat;

Folosește ca măsură de siguranță suplimentară CAPTCHA (metodă automată de a determina dacă utilizatorul unui software este o persoană sau un program de calculator).

Figura 3.2 Formular înregistrare utilizator

După ce utilizatorul completează formularul cu datele personale, informațiile vor fi colectate și verificate prin expresii de validare pentru a se asigura completarea tuturor câmpurilor.

Informațiile înregistrate se vor trimite prin metoda POST pentru a putea fi colectate și ulterior introduse în script pentru a fi folosite.

$userid=$_POST['userid'];
$password=$_POST['password'];
$password2=$_POST['password2'];
$agree=$_POST['agree'];
$todo=$_POST['todo'];
$email=$_POST['email'];
$name=$_POST['name'];
$sex=$_POST['sex'];

Datele transmise prin POST nu apar în URL și nu pot fi alterate usor, ceea ce oferă un grad de securitate mai mare.

Următoarea porțiune de cod verifică unicitatea username-ului și a adresei de email:

$count=$dbo->prepare("select userid from plus_signup where userid=:userid");

$count->bindParam(":userid",$userid);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Acest username nu este disponibil. Va rugam introduceti un alt username.<br>";

$status= "NOTOK";}

$count=$dbo->prepare("select email from plus_signup where email=:email");

$count->bindParam(":email",$email);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Aceasta adresa de email deja exista. Daca ati uitat parola contului va rugam accesati link-ul<a href=forgot-password.php> Ai uitat parola?</a> Sau introduceti o alta adresa de email.<BR>";

$status= "NOTOK";

}

Figura 3.3 Eroare apărută la completarea câmpurilor obligatorii

După ce utilizatorul completează toate câmpurile obligatorii și apasă butonul Înregistrare este redirecționat către pagina Autentificare unde se poate conecta cu username-ul și parola alese anterior.

Autentificare

Figura 3.4 Autentificare

Fragment din codul HTML folosit la realizarea paginii:

<form action='loginck.php' method=post>
<table border='0' cellspacing='0' cellpadding='0' align=center>
<tr id='cat'>
<tr> <td bgcolor='#f1f1f1' ><font face='verdana, arial, helvetica' size='2' align='center'>  Username:    
</font></td> <td bgcolor='#f1f1f1' align='center'><font face='verdana, arial, helvetica' size='2' >
<input type ='text' class='bginput' name='userid' ></font></td></tr>

În scriptul loginck.php vom folosi o linie de cod SQL pentru a obține răspuns de la baza de date unde sunt stocate datele de înregistrare ale utilizatorilor:

"SELECT * FROM plus_signup WHERE userid='$userid' AND password = '$password'"

userid și password sunt câmpurile, iar plus_signup tabelul. Linia de cod va returna o înregistrare în cazul în care username-ul și parola se regăsesc în baza de date. Astfel, am folosit o singură instrucțiune if care procesează scriptul dacă datele de înregistrare au fost introduse corect și se regăsesc în baza de date.

Următorul cod colectează datele introduse:

$userid=$_POST['userid'];
$password=$_POST['password'];

Apoi am verificat baza de date cu următoarea interogare:

$count=$dbo->prepare("select password,mem_id,userid from plus_signup where userid=:userid");

În codul de mai jos, dacă validarea s-a realizat cu success se va creea o sesiune de lucru.

$count->bindParam(":userid",$userid,PDO::PARAM_STR);
$count->execute();
$row = $count->fetch(PDO::FETCH_OBJ);
if($row->password==md5($password)) {

echo " Inside ";
// Se începe o nouă sesiune
$_SESSION['id']=session_id();
$_SESSION['userid']=$row->userid;
$_SESSION['mem_id']=$row->mem_id;

//echo " Inside session ". $_SESSION['userid'];
$msg=" Bună $_SESSION[userid] te-ai autentificat cu succes , vă rugăm

așteptați … ";
echo $msg;
echo "<script language='JavaScript' type='text/JavaScript'>
<!–
window.location='welcome.php';
//–>
</script>";

} else {

$msg = " Autentificare eșuată, încercați din nou … <br><INPUT TYPE='button' VALUE='Back' onClick='history.go(-1);'>";

}

echo $msg;

Astfel, în header va fi evidențiat faptul că un utilizator este autentificat (logged in), mai exact, în locul secțiunii de autentificare, unde a apărut mesajul de întâmpinare și numele utilizatorului.

Figura 3.5 Utilizator autentificat

Chestionare

Asigurarea unei modalități de testare a cunoștințelor acumulate este esențială atunci când subiectul discuției este o școală de șoferi. Acest site pune la dispoziția utilizatorului un număr de chestionare pe care acesta trebuie să le rezolve contra timp. Astfel, se încearcă crearea unor condiții de testare cât mai apropiate de cele reale.

Mai jos este prezentat panoul de administrare al unui instructor ce are posibilitatea de a crea noi chestionare și a le repartiza utilizatorilor în funcție de gradul de pregătire al fiecăruia.

Figura 3.6 Panoul de administrare

Porțiune a codului PHP folosit la realizarea paginii:

$hedaers = array("Nume", "Descriere","Data","Intrebari","&nbsp;","&nbsp;");

$columns = array("quiz_name"=>"text", "quiz_desc"=>"text","added_date"=>"short date");

$grd = new grid($hedaers,$columns, "index.php?module=quizzes");

$grd->edit_link="index.php?module=add_edit_quiz";

$grd->id_links=(array("Intrebari"=>"?module=questions"));

$grd->id_link_key="quiz_id";

if($grd->IsClickedBtnDelete()){

quizDB::DeleteQuizById($grd->process_id);

}

$query = quizDB::GetQuizQuery();

$grd->DrowTable($query);

$grid_html = $grd->table;

if(isset($_POST["ajax"])){

echo $grid_html;

}

function desc_func()

{

return "Chestionare";

}

Instructorul are posibilitatea de a verifica oricând starea temelor distribuite utilizatorilor și a răspunsurilor oferite de aceștia la chestionare. Astfel, se creează o relație mult mai strânsă instructor-client, clientul primind feedback personalizat pentru rezultatele obținute.

Figura 3.7 Panoul de administrare teme

În momentul accesării câmpului Detalii se va deschide chestionarul ce va conține atât răspunsurile corecte cât și răspunsurile oferite de utilizator.

Figura 3.8 Panoul de verificare răspunsuri

Pentru crearea paginii Web care să permită testarea cunoștiințelor utilizatorului, am folosit scriptul start_quiz.php, respectiv scriptul start_quiz_tmp.php.

Scriptul start_quiz_tmp.php creează modul de afișare al întrebărilor în pagină și adaugă funcția cronometru chestionarului.

Mai jos este o porțiune a codului HTML ce organizează modul de afișare al întrebărilor:

<table width="400px" cellspacing="0" cellpadding="0" style="border:0;border-width:2;border-color:#ED7C36" border=0 >

<tr >

<td style="width:1%" align=left valign=bottom > <imgsrc="i/tool/tb_l.gif"></img></td>

<td style="width:98%" bgcolor="#F9DD93"></td>

<td style="width:2px" align="left" ><img src="i/tool/tb_r.gif"></img></td>

</tr>

<tr bgcolor="#F9DD93">

<td colspan=3 align=center>

<font face="arial" size="2" color="#63665B">&nbsp;<span id="divText"></span></font>

</td>

</tr>

<tr valign="top">

<td style="width:1%" align="left"><img src="i/tool/tb_l_b.gif"></img></td>

<td style="width:400px" bgcolor="#F9DD93"></td>

<td style="width:2px" align="left" ><img src="i/tool/tb_r_b.gif">

</img></td>

</tr>

</table>

Funcția cronometru este apelată de următorul cod javascript:

<script language="javascript">

TimerRunning = false;

//call the Init function when u need to start the timer

function Init_Timer(quiz_time, seconds)

{

mins = quiz_time;

secs = seconds;

StopTimer();

StartTimer();

}

function StopTimer()

{

if (TimerRunning)

clearTimeout(TimerID);

TimerRunning = false;

}

function StartTimer()

{

// if (document.getElementById('<%=txtTimerState.ClientID %>').value == "0")

// return;

TimerRunning = true;

document.getElementById('lblTimer').innerHTML = Pad(mins) + ":" + Pad(secs);

TimerID = self.setTimeout("StartTimer()", 1000);

Check();

if (mins == 0 && secs == 0) StopTimer();

if (secs == 0) {

mins–;

secs = 60;

}

secs–;

}

function Check()

{

if (mins == 5 && secs == 0) {

} else if (mins == 0 && secs == 0) {

alert("Timpul a luat sfarsit !");

StopTimer();

TimerRunning = false;

// HideTable();

window.location.reload(false);

}

}

function Pad(number) //pads the mins/secs with a 0 if its less than 10

{

if (number < 10)

number = 0 + "" + number;

return number;

}

</script>

Figura 3.9 Exemplu de întrebare din chestionar

Chestionarul se salvează apoi automat în fișierul start_quiz.php. Acest lucru permite utilizatorului să vizualizeze la final dacă a obținut un punctaj de trecere și ulterior, în contul său ce chestionare a susținut, precum și starea acestora.

function GetQuizResults($row)

{

global $quiz_type;

$msg = "Finalizat . Va multumim . <br>";

if($row['show_results']=="1" && $quiz_type=="1")

{

$total = $row['total_point'];

if($row['results_mode']=="2")

$results_mode = $row['total_perc']." %";

$msg.="Ati acumulat: $total . Punctaj trecere: ".$row['pass_score']." .";

$msg.="<br>";

if($row['quiz_success']=="1") {

$msg.="Ati trecut acest examen!";

} else {

$msg.="Ne pare rau, nu ati trecut acest examen!";

}

}

return $msg;

}

Figura 3.10 Exemplu de chestionar finalizat

Blog

Secțiunea de blog a site-ului conține articole actualizate atât despre partea organizatorică a școlii de șoferi, cât și despre noutățile survenite în codul rutier. Actualizarea blogului va consta în adăugarea de texte noi, contribuțiile fiind afișate în ordine cronologică.

La crearea acestui blog am folosit platforma WordPress, versiunea 3.8.1 .

Figura 3.11 Pagina principală a blogului

În momentul în care vizitatorii accesează prima pagină a blogului, index.php, următoarea linie de cod va activa tema:

define('WP_USE_THEMES', true);

În continuare, WordPress verfică ce șabloane sunt active. WordPress lucrează cu o serie de șabloane ce se asambleză în mod dinamic pentru a crea pagina dorită. Mai departe, sunt verificate setările stocate în baza de date, atât cele implicite, cât și cele personalizate, cum ar fi titlul site-ului, urmând ca apoi să retragă un număr de postări recent adăugate. Numărul de postări afișate poate fi modificat din setările generale de pe platforma WordPress. Anumite informații despre postări sunt stocate în variabile. Mai exact, sunt stocate informații despre autor, titlu, data postării și eventualele răspunsuri, inclusiv conținutul postării propriu-zise. La final, toate aceste informații sunt afișate în pagina principală conform schemei de codare și a stilurilor CSS.

Pentru acest blog am ales să construiesc propria temă pentru a se potrivi cât mai bine cerințelor școlii de șoferi.

Fișierele individuale ce alcătuiesc tema blogului sunt numite fișiere șabloane. O temă de bază pentru pagina principală conține 5 fișiere șabloane diferite. Primele elemente ale unei pagini principale provin din fișierul șablon header.php și acestea sunt: DOCTYPE și tag-ul HTML de deschidere. Următoarea secțiune a blogului provine din fișierul index.php, ce este responsabil cu afișarea conținutului principal, de regulă una sau mai multe postări. Deoarece este pagina principală, index.php conține de asemenea și funcții WordPress care ajută la intregrarea altor porțiuni din pagină, cum ar fi porțiunea de antet (header). În temele WordPress întâlnim cel puțin o bară de meniuri, al cărui conținut provine din fișierul sidebar.php. Bara de meniuri conține widget-uri ce sunt folosite ca link-uri de navigare pentru întreg blogul. De exemplu, link-uri către Arhivă, Postări recente sau Categorii. Fișierul footer.php conține atât secțiunea de subsol (footer) a paginii, cât și tag-urile de sfârșit deschise în prealabil în secțiunea de header. În final, pentru organizarea în pagină și prezentare am folosit fișierul style.css. Tot în acest fișier se regăsesc informații despre tema propriu-zisă, numele, autorul. Aceste informații sunt necesare în momentul activării temei de către WordPress.

/*

* Theme Name: Custom Theme

* Theme URI: http://lynda.com

* Description: A custom WordPress theme, built from the ground-up

* Author: Cristina

* Version: 1.00

*/

În continuare este prezentat codul ce ajută la realizarea fișierelor menționate anterior.

header.php

<!DOCTYPE HTML>

<html <?php language_attributes(); ?>>

<head>

<meta charset="<?php bloginfo('charset');?>">

<title>

<?php

global $page, $paged;

wp_title( '|', true, 'right' );

bloginfo( 'name' );

$site_description = get_bloginfo( 'description', 'display' );

if ( $site_description && ( is_home() || is_front_page() ) )

echo " | $site_description";

if ( $paged >= 2 || $page >= 2 )

echo ' | ' . sprintf( __( 'Page %s' ), max( $paged, $page ) );?>

</title>

<link rel="stylesheet" type="text/css" media="all" href="<?php bloginfo( 'stylesheet_url' ); ?>" />

<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />

<!–[if lt IE 9]>

<script src="<?php echo get_template_directory_uri(); ?>/js/html5.js" type="text/javascript"></script>

<![endif]–>

<?php if ( is_singular() && get_option( 'thread_comments' ) ) wp_enqueue_script('comment-reply'); ?>

<?php wp_head(); ?>

</head>

<body <?php body_class(); ?>>

<div id="outerWrapper">

<header>

<h1><a href="<?php echo get_option('home'); ?>/"><?php bloginfo('name'); ?></a></h1>

<nav class="mainMenu">

<?php wp_nav_menu(); ?>

</nav>

</header>

index.php

<?php get_header(); ?>

<div id="contentWrap">

<div id="content">

<?php if ( have_posts() ) : ?>

<?php while ( have_posts() ) : the_post(); ?>

<article <?php post_class() ?> id="post-<?php the_ID(); ?>">

<h2><a href="<?php the_permalink() ?>"><?php the_title(); ?></a></h2>

<div class="meta">

<em>Postat:</em> <?php the_time('F jS, Y') ?>

<em>de</em> <?php the_author() ?>

</div>

<div class="entry">

<?php the_content(); ?>

</div>

<div class="postmetadata">

<?php the_tags('Tags: ', ', ', '<br />'); ?>

Postat in <?php the_category(', ') ?> |

<?php comments_popup_link('Nu exista postari &#187;', '1 Postare &#187;', '% Postari &#187;'); ?>

</div>

</article>

<?php endwhile; ?>

<?php else : ?>

<h2>Nu exista</h2>

<?php endif; ?>

</div> <!– end content –>

<?php get_sidebar(); ?>

</div> <!– end contentWrap –>

<?php get_footer(); ?>

sidebar.php

<div class="widget-area">

<?php if ( ! dynamic_sidebar( 'Sidebar Widgets' ) ) : ?>

<aside id="search" class="widget">

<?php get_search_form(); ?>

</aside>

<aside id="archives" class="widget">

<h3 class="widget-title">Archives</h3>

<ul>

<?php wp_get_archives('type=monthly&limit=12'); ?>

</ul>

</aside>

<?php endif; // end sidebar widget area ?>

</div>

footer.php

<footer>

<p>&copy;Copyright ProDrive 2014. Toate drepturile rezervate-Powered by Puchianu Cristina &nbsp;&nbsp;&nbsp;&nbsp; <a href="#">Termeni si conditii</a></p>

</footer>

</div> <!– end outerWrapper –>

<?php wp_footer(); ?>

</body>

</html>

Pentru o navigare mai ușoară a site-ului, postările vor fi împărțite pe categorii, astfel: Noutăți legislative și Noutăți școală. În acest fel, utilizatorii vor avea acces mult mai rapid la informațiile ce îi interesează.

Figura 3.12 Arhiva din Noutăți școală

Totodată, utilizatorii vor avea posibilitatea de a adăuga comentarii și de a răspunde la postări.

Figura 3.13 Adăugare răspuns

3.2 Proiectarea bazei de date

O bază de date reprezintă o colecție structurată de informație stocată într-un sistem de calcul. Structura ei este specificată înaintea introducerii datelor și determină:

Tipul și compoziția datelor memorate;

Felul în care datele se află în relație unele cu altele.

Scopul memorării datelor (fie în format electronic, fie într-altul) este ca mai apoi ele să poată fi consultate cu rapiditate sau modificate. Structura unei baze de date este de așa natură gândită încât să optimizeze aceste operații de manipulare a datelor.

O bază de date relațională este una în care organizarea informației respectă modelul relațional.

De-a lungul timpului au fost elaborate diferite modele de organizare a informației într-o bază de date, fiecare având în spate un anumit model matematic:

Modelul flat-file – cea mai simplă (dar nu și cea mai eficientă/flexibilă) modalitate de a memora date. Informația este plasată într-un fișier text sau binar, fiecare înregistrare ocupând câte o linie, valorile componente ale fiecărei înregistrări fiind separate prin delimitatori prestabiliți;

Modelul ierarhic – informația este structurată sub forma unui arbore în care fiecare înregistrare are un părinte și mai multe sub-înregistrări posibile;

Modelul rețea – o extensie a modelului ierarhic, în care fiecare înregistrare poate avea mai multe sub-înregistrări dar și mai multe înregistrări părinte;

Modelul relațional – este un model bazat pe teoria mulțimilor și pe logica predicatelor, în care informația este grupată în mulțimi de înregistrări numite tabele. Între tabele pot fi definite relații în mod flexibil, de așa natură încât datele să poată fi stocate și manipulate eficient.

O bază de date, așa cum a fost definită până acum, este o noțiune abstractă. Pentru a putea defini structura unei astfel de baze de date și a memora efectiv informație în interiorul său avem nevoie de un program care să realizeze toate funcțiile pe care aceste nevoi le implică. Un astfel de program se numește sistem de gestiune a bazelor de date, prescurtat DBMS (DataBase Management System).

Un DBMS implementează funcțiile necesare pentru diferitele aspecte ale lucrului cu bazele de date:

Memorarea fizică a datelor, într-un format optimizat în vederea operațiilor viitoare;

Definirea și modificarea structurii bazelor de date;

Introducerea informațiilor noi și manipularea celor existente;

Filtrarea accesului la datele memorate (ex: un sistem de privilegii care să facă distincție între diverși utilizatori/clienți/aplicații);

Implementarea unei modalităti de acces la toate aceste facilități (deseori, resursele puse la dispoziție de către un DBMS sunt accesate de către utilizatori sau aplicații aflate pe alte stații decât cea pe care rulează software-ul de gestiune a bazelor de date).

Cine are nevoie să introducă și să manipuleze informația:

Informația este introdusă/accesată/manipulată de către un utilizator (ex: un instructor adaugă cursanți noi în baza de date în care sunt memorați cursanții școlii);

Informația este introdusă/accesată/manipulată de către o aplicație (ex: un program care monitorizează activitatea unui server web memorează într-o bază de date informații despre paginile accesate, tipul de browser folosit, etc)

Remarcăm însă în primul caz că, deși spunem ”utilizatorul introduce date”, această operație presupune interacțiunea utilizatorului cu un DBMS și trimiterea de comezi către acesta. Utilizatorul interfațează cu DBMS prin intermediul unui program de tip client – așadar tot o aplicație. În concluzie, putem unifica cele două cazuri vorbind – la modul general – despre aplicații client. [IM03]

În cazul de față, pentru realizarea aplicației am folosit ca sistem de gestiune relațional phpMyAdmin din pachetul WampServer.

În dezvoltarea oricărei aplicații structura bazei de date reprezintă un element foarte important. Aceasta oferă datele necesare încărcării unei pagini de către utilizator. Baza de date a fost realizată cu scopul de a nu creea întârzieri care să reducă timpul de încărcare al unei pagini. De asemenea au fost luate în calcul și eventualele modificări ce pot fi aduse aplicației.

În figurile de mai jos este prezentată structura bazelor de date, denumite config aferentă site-ului și blogului și chestionare aferentă chestionarelor, mai exact câmpurile fiecărei tabele, cheile primare și tipurile de date.

Figura 3.14 Structura bazei de date config

Figura 3.15 Structura bazei de date chestionare

În continuare vor fi reprezentate schemele bazelor de date reprezentate cu ajutorul softului MySQL Workbench.

Schema unei baze de date ilustrează fiecare tabelă împreună cu coloanele sale, precum și relațiile care se stabilesc între cheile acestora.

Figura 3.16 Schema bazei de date config

Figura 3.16 Schema bazei de date chestionare

Capitolul 4

Managementul Proiectului

Pornind de la definiția propusă de Guvernul României în cadrul ”Manualului Managerului de Proiect”, managementul proiectelor reprezintă un domeniu relativ recent apărut, dar cu o importanță majoră la nivel european și internațional. Termenul de Managementul Proiectelor sau, mai complet, Managementul ciclului de proiect, este frecvent folosit în domeniul scrierii, implementării și evaluării proiectelor, fiind adoptat în 1992 de către Comisia Europeană.

Standardul român SR ISO 10006:2005[2] conține următoarea definiție (punctul 4.1.4) cu privire la conținutul și utilizarea termenului: ”Managementul proiectului include planificarea, organizarea, monitorizarea, controlarea, raportarea și întreprinderea acțiunilor corective necesare tuturor proceselor proiectului, de care este nevoie pentru realizarea obiectivelor proiectului, în mod continuu."

Standardul român SR 13465:2007 conține o definiție mai cuprinzătoare a managementului proiectelor: "Managementul proiectelor reprezintă planificarea, organizarea, monitorizarea și controlul tuturor aspectelor proiectului, precum și managementul și leadership-ul tuturor celor implicați pentru a realiza în siguranță obiectivele proiectului în cadrul criteriilor agreate de timp, costuri, domeniu de aplicare și performanțe/calitate." Trebuie avut în vedere faptul că un proiect este caracterizat de un efort temporar în vederea realizării unui produs sau serviciu cu caracter de unicitate. În mod implicit, caracterul de unicitate al produsului, serviciului sau rezultatului implică unicitatea și irepetabilitatea proiectului. [web15]

Managementul proiectului în forma sa timpurie, se concentra mai mult pe furnizarea de informații referitoare la planificare și resurse. Aceste informații au fost preluate și utilizate ulterior în managementul proiectului în forma sa modernă, ce urma să se dezvolte cu repeziciune mai ales după anii 1990.

Câteva din avantajele utilizării unui management performant al proiectelor sunt:

Un control mai eficient asupra resurselor (materiale, financiare, umane și informaționale);

Micșorarea duratei etapelor de dezvoltare;

Reducerea costurilor de cercetare-dezvoltare;

Coordonarea mai bună a activităților.

Pentru designul și managementul proiectului se utilizează Abordarea în Cadrul Logic (Logical Framework Approach-LFA). Cadrul Logic, ca instrument de abordare a unui proiect, a fost creat în anii 1970 ajungând să fie folosit pe scară largă de un număr mare de instituții și organizații la nivel European și mondial. Metoda prezintă rezultatele analizei unei probleme, numită în cele de mai jos ”situație problematică”, astfel încât din aceasta să reiasă, într-o manieră sistematică și logică, obiectivele proiectului.

Această abordare reflectă relația cauză-efect pentru diferitele nivele ale obiectivelor, identificând totodată modul în care se verifică realizarea acestora și situațiile care pot să influențeze succesul proiectului. Rezultatele analizei sunt sintetizate într-o matrice care prezintă cele mai importante aspecte ale unui proiect (”Matricea Logică”).

Pe lângă fazele de analiză (programare, identificare) și formulare, Cadrul Logic este de asemenea util în faza de implementare, ca și la evaluarea proiectului, cu alte cuvinte joacă un rol important în fiecare fază a ciclului de viață a proiectului. [web16]

4.1 Scoaterea din anonimat al site-ului „prodrive.ro”

FAZELE CONSTRUIRII CADRULUI LOGIC

Abordarea prin intermediul cadrului logic:

FAZA DE ANALIZĂ. Este faza în care se realizează analiza aprofundată a unei situații existente nedorite, ca bază pentru planificarea ulterioară.

FAZA DE ELABORARE/PLANIFICARE. Este faza în care ideea proiectului este elaborată practic, operațional, pentru a permite implementarea sa. În această fază se definitivează cadrul logic (matricea logică), se formulează și se planifică atât activitățile cât și resursele.

4.1.1 Definirea situației problemă:

În urma unei analize efectuate asupra celor mai vizitate site-uri din România, destinate persoanelor ce doresc obținerea permisului auto, am constatat că cele mai multe dintre acestea se concetrază în principal pe publicitatea școlii de șoferi și mai puțin pe partea de informații necesare care ar putea prezenta interes din partea viitorilor clienți.

Serviciile oferite de aceste firme sau persoane fizice autorizate sunt destinate persoanelor care au o vârstă mai mare de 18 ani. Din acest motiv, există întotdeauna posibilitatea ca printre acești potențiali clienți să existe persoane care au nevoie de permisul auto cât mai repede posibil, astfel încât nevoia unui site cât mai bine structurat și care să prezinte toate informațiile necesare este foarte ridicată. De asemenea, clientul își doreste flexibilitate, posibilitatea de a-și ajusta programul orelor de condus în funcție de timpul liber disponibil.

În urma celor menționate mai sus, se dorește ca viitorul produs software să ofere în plus față de produsele concurentilor, urmatoarele:

Posibilitatea clienților de a susține simulări ale examenului auto pentru partea teorerică;

Afișarea atât a numărului persoanelor înregistrate la cursuri, cât si informații despre instructori și mașinile disponibile;

Posibilitatea elaborării propriilor ședințe practice;

Posibilitatea aducerii la cunoștința clienților a informațiilor de importanță majoră.

Pe lângă toate aceste cerințe, site-ul va mai oferii clienților accesul la material în format electronic, respectând termenii și condițiile proprietății intelectuale.

4.1.2 Analiza factorilor interesați:

Ideea cheie este aceea că proiectele sunt elaborate pentru a se adresa problemelor unor grupuri țintă/diferiți beneficiari, nevoile și interesele lor. Orice individ, grup de oameni, instituție sau organizație care poate avea un interes în proiect, poate influența/afecta sau este influențat/afectat de proiect, este definit ca factor interest (stakeholder). [CS06]

Tabel 4.1 Factorii interesați care vor susține proiectul

4.1.3 Analiza problemelor:

Analiza problemelor, prezentată sub forma unei scheme grafice, are rolul de a identifica aspectele negative ale situației existente și de a stabili relațiile de cauză-efect între acestea.

Figura 4.1 Arborele Problemelor

4.1.4 Analiza Obiectivelor

Analiza obiectivelor presupune descrierea situației viitoare, odată cu rezolvarea problemelor prin participarea părților reprezentative. Practic se verifică ierarhizarea obiectivelor cu ilustrarea grafică a relațiilor cauză-efect.

Figura 4.2 Arborele Obiectivelor

4.1.5 Analiza Strategiilor

Alegerea strategiei reprezintă pasul final al fazei de analiză a proiectului. Analiza strategiilor se referă la luarea deciziei asupra obiectivelor care vor fi incluse în proiect și cele care vor rămâne în afara acestuia, precum și stabilirea scopului proiectului și a obiectivelor generale.

Figura 4.3 Arborele Strategiilor

4.2 Faza Planificării

Planificarea proiectului este procesul de definire a cerințelor proiectului într-un mod structurat, folosind instrumentele managementului de proiect, pentru comunicarea cerințelor proiectului către toate părțile implicate, măsurarea performanțelor, precum și pentru organizarea și asigurarea controlului utilizării resurselor în scopul realizării obiectivelor propuse ale proiectului.

Planificarea proiectului este un proces foarte dinamic și continuu care se încheie doar odata cu terminarea proiectului.

În cadrul managementului de proiect, planificarea reprezintă un proces de structurare si gândire logică care are ca obiectiv general coordonarea deciziilor în scopul atingerii obiectivelor predeterminate. [web17]

4.2.1 Construcția Matricei Logice

Matricea logică a proiectului este un instrument analitic utilizat în planificarea, implementarea și evaluarea proiectelor. Acest instrument a fost creat în anii 1970 și este utilizat pe o scară tot mai largă de către organisme care asigură finanțarea unor proiecte sau care sunt implicate în realizarea acestora.

Metoda presupune prezentarea rezultatelor a unor diferite analize necesare pentru realizarea proiectelor astfel încât să pună în evidență într-o manieră sistematică și logică obiectivele proiectului. De asemenea, trebuie evidențiate relațiile cauzale dintre diferitele niveluri de obiective și modul în care atingerea obiectivelor propuse poate fi verificată prin ipotezele principale (factori externi) care au o influență asupra succesului proiectului. [web18]

În tabelul de mai jos este prezentată matricea logică a proiectului:

Tabel 4.2 Matricea logică a proiectului

Pentru a vedea cât de realist este un proiect și care sunt șansele lui de succes se poate face analiza riscurilor. Analiza riscurilor se aplică ipotezelor din matricea logică. Pentru fiecare ipoteză, participanții estimează doi parametrii:

Daunele ce vor fi provocate proiectului dacă ipoteza nu se adeverească;

Probabilitatea ca ipoteza să nu se adeverescă. [CS06]

4.2.2 Analiza riscurilor

În urma consultării matricei logice, riscurile care pot apărea și afecta bunul mers al proiectului sunt următoarele:

Serverul pe care sunt stocate fișierele aplicației nu funcționează. Impactul este unul foarte mare, deoarece vizitatorii nu mai pot accesa site-ul;

Nivelul scăzut de pregătire al programatorilor Web și rezolvarea erorilor de program în timp îndelungat. Impactul acestui risc este unul foarte mare, el duce la o întarziere a finalizării proiectului. Acest risc poate fi evitat printr-o selecție riguroasă a persoanelor care vor lucra în cadrul proiectului;

Defectarea calculatoarelor și apariția problemelor în inutilizarea produselor software. Deși acest risc prezintă cel mai ridicat impact, blocând astfel întregul proiect. Probabilitatea de realizare este foarte mică.

4.2.3 Pregătirea planului de resurse

După completarea “Planului de activități” trebuie specificate mijloacele necesare realizării acestora. De asemenea, informațiile referitoare la costurile acestora sunt necesare:

Tabel 4.3 Planul de resurse

4.2.4 Metoda drumului critic (C.P.M.)

Metoda drumului critic este o metodă care programează procese complexe și se bazează pe teoria grafurilor. Timpul reprezintă parametrul care face obiectul programării și al controlului. Particularitatea ,,timp determinist” se referă la faptul că duratele activităților se consideră mărimi unice, determinabile.

Tabel 4.4 Analiza procesului, stabilirea listei activităților și a duratelor activităților

4.2.5 Graficul Gantt

Diagrama Gantt este un instrument de planificare, elaborat în 1917 de Henry L. Gantt, inginer și sociolog de origine americană. Frecvent utilizată în managementul de proiect, o diagramă Gantt oferă o ilustrare grafică a unui program de activități, care ajută la planificarea, coordonarea și monitorizarea unor sarcini specifice dintr-un proiect.

Principalul obiectiv al diagramei Gantt este stabilirea timpului necesar desfăsurarii unui proiect și stabilirea ordinii în care trebuie să se desfășoare sarcinile. În figura de mai jos este reprezentat graficul Gantt al acestui proiect. [web19]

Am realizat graficul Gantt cu ajutorul programului Gantt Project versiunea 2.6.1 Brno. Acest program este disponibil gratuit și poate fi descărcat de pe site-ul http://www.ganttproject.biz/.

Figura 1.4 Graficul Gantt

În cazul ideal, conform graficului Gantt și datei de început (14.05.2014), activitățile se încheie la data de 30.07.2014 cu o durată totală a proiectului de 56 zile lucrătoare.

Capitolul 5

Concluzii

Această aplicație, ProDrive, oferă utilizatorilor un sprijin în vederea obținerii permisului de conducător auto, prin punerea la dispoziție atât a chestionarelor pe care le pot rezolva cronometrat cât și a informațiilor actualizate în permanență privind la legislația în vigoare.

Cerințele de proiectare au fost îndeplinite: a fost creată o interfață intuitivă, ușor de folosit, care asigură o navigare ușoară și plăcută pe site. Această interfață asigură înregistrarea a două tipuri de utilizatori, instructori și potențialii clienți, prin autentificarea cu nume utilizator și parolă (parola de înregistrare este stocată criptat).

De asemenea, a fost creată structura bazei de date, structură necesară funcționalității site-ului. Totodată, aplicația a fost gândită și realizată astfel încât să poată suporta schimbări ulterioare (au fost create tabele care încă nu sunt folosite, dar vor putea fi folosite ulterior). Aceste schimbări pot fi făcute de către administrator și se referă la adăugarea sau ștergerea câmpurilor din toate tabelele din baza de date.

S-a obținut un sistem dinamic, interactiv și atractiv datorită posibilităților pe care le oferă oricărei categorii de utilizatori.

Aplicația a fost testată pe ultimele variante ale browser-elor: Mozzila (versiunea 30.0 beta 9), Google Chrome (versiunea 35.0.1916.114 m).

Cu ajutorul elementelor de management de proiect s-a putut face o evaluare estimativă în privința realizării site-ului. Un astfel de proiect se poate implementa într-un timp relativ scurt (56 de zile lucrătoare) și nu presupune costuri foarte ridicate (aproximativ 650 Euro).

Deși site-ul este funcțional, ar mai putea fi aduse următoarele îmbunătățiri:

Optimizarea SEO pentru ca site-ul să apară pe primele poziții în lista de rezultate oferită de un motor de căutare pentru anumite cuvinte-cheie;

Dezvoltarea unei aplicații mobile pe baza site-lui;

Adăugarea mai multor filtre de căutare și rezervare.

Bibliografie

Partea Tehnică:

Resurse tipărite:

[EN05] Elisabeth Naramoren, Jason Cerner – Beginning PHP5 Apache and MySQL Web Development, 2005

[IM03] Ionuț Morar, Fundamente ale bazelor de date relaționnale, 2003

[IM03] Ionuț Morar, Noțiuni de bază PHP, 2003

[TG09]Teodoru Gugoiu HTML, XHTML, CSS si XML prin exemple, 2009

Resurse internet:

[web1] http://nitpicker.pbworks.com/w/page/12451253/The%20Humane%20Interface ,

Accesat 06.04.2014

[web2] http://en.wikipedia.org/wiki/User_interface, Accesat 06.04.2014

[web3] http://myphpscriptz.com/php-scripts-tutorials/what-is-wamp-and-how-to-install-and-use-it/ , Accesat 06.04.2014

[web4] http://w3techs.com/, Accesat 06.04.2014

[web5] http://httpd.apache.org/ABOUT_APACHE.html , Accesat 06.04.2014

[web6] http://www.php.net/manual/ro/ , Accesat 08.04.2014

[web7] http://www.scribd.com/doc/80355209/Javascript, Accesat 13.04.2014

[web8] http://www.scribd.com/doc/68594106/61070373-html#outer_page_1, Accesat 13.04.2014

[web9] http://www.ghid-html.info/140-introducere-in-css.html, Accesat 13.04.2014

[web10] http://tutoriale-webdesign.blogspot.ro/p/1.html, Accesat 13.04.2014

[web11] http://ro.wikipedia.org/wiki/Adobe_Photoshop, Accesat 23.04.2014

[web12] http://www.dexblog.ro/despre/wordpress/, Accesat 29.04.2014

[web13] http://www.vadmin.ro/definitii, Accesat 06.05.2014

[web14] http://nadoluco.ro/wordpress/, Accesat 29.04.2014

[web15] http://php.net/usage.php, Accesat 29.05.2014

Partea Economică:

Resurse tipărite:

[CS06] Cezar Scarlat-Managementul Proiectelor, Editura Printech, 2006

[CA07] S.L. Catalin Alexe-Material suport-Proiect-Managementul Proiectelor

Resurse internet:

[web15] http://ro.scribd.com/doc/175551231/Managementul-proiectelor, Accesat 24.05.2014

[web16] http://www.scritub.com/diverse/CADRUL-LOGIC75896.php, Accesat 24.05.2014

[web17] http://consultingreview.ro/articole/managementul-proiectelor-planificarea-proiectului.html, Accesat 24.05.2014

[web18] http://www.ramp.ase.ro/_data/files/articole/1_06.pdf, Accesat 24.05.2014

[web19] http://www.scritub.com/stiinta/informatica/Ce-este-diagrama-Gantt1032201711.php , Accesat 26.05.2014

Anexe

Mai jos sunt prezentate fișierele principale ale aplicației:

Pagina Căutare

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Cautare </title>

</head>

<body>

<img border="0" src="_images/2.jpg" width="1350" height="70">

<br><br>

<?php

$button = $_GET ['submit'];

$search = $_GET ['search'];

if(!$button)

echo "Nu ati introdus nimic";

else

{

if(strlen($search)<=1)

echo "Cuvantul este prea scurt";

else{

echo "Cautare pentru <b>$search</b> <hr size='1'></br>";

mysql_connect("localhost","root","");

mysql_select_db("config");

$search_exploded = explode (" ", $search);

foreach($search_exploded as $search_each)

{

$x = NULL; $construct = NULL;

$x++;

if($x==1)

$construct .="keywords LIKE '%$search_each%'";

else

$construct .="AND keywords LIKE '%$search_each%'";

}

$construct ="SELECT * FROM search WHERE $construct";

$run = mysql_query($construct);

$foundnum = mysql_num_rows($run);

if ($foundnum==0)

echo "Ne pare rau, nu exista rezultate pentru <b>$search</b>.</br></br>

</br>2. Incercati cuvinte diferite dar cu acelasi sens.</br>3. Verificati corectiudinea cuvantului introdus";

else

{

echo "$foundnum resultate gasite !<p>";

while($runrows = mysql_fetch_assoc($run))

{

$title = $runrows ['title'];

$desc = $runrows ['description'];

$url = $runrows ['url'];

echo "

<a href='$url'><b>$title</b></a><br>

$desc<br>

<a href='$url'>$url</a><p>

";

}

}

}

}

?>

<article id="mainContent" >

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='welcome.php' rel="nofollow">Înapoi la ProDrive</a></font>

</body>

</html>

Pagina Autentificare

<?Php

include "include/session.php";

include "config.php"; // database connection details stored here

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

$userid=$_POST['userid'];

$password=$_POST['password'];

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Autentificare </title>

</head>

<body>

<?Php

//$password=md5($password); // Encrypt the password before comparing

//// Checking userid and password //////

$msg='';

$status='OK';

if(!isset($userid) or strlen($userid) <3){

$msg=$msg."Username-ul trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if ( strlen($password) < 3 ){

$msg=$msg."Parola trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if($status<>"OK"){

echo "<font face='Verdana' size='2' color=red>$msg</font><br><br><input type='button' value='Încearcați din nou' onClick='history.go(-1)'>";

exit;

}

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

$count=$dbo->prepare("select password,mem_id,userid from plus_signup where userid=:userid");

$count->bindParam(":userid",$userid,PDO::PARAM_STR);

if($count->execute()){

$no=$count->rowCount();

if($no <> 1 ) {

$msg=" Username-ul introdus nu este corect. Vă rugăm încercați din nou… ";

}else {

$row = $count->fetch(PDO::FETCH_OBJ);

if($row->password==md5($password)){

echo " Inside ";

// Start session n redirect to last page

$_SESSION['id']=session_id();

$_SESSION['userid']=$row->userid;

$_SESSION['mem_id']=$row->mem_id;

//echo " Inside session ". $_SESSION['userid'];

$msg=" Bună $_SESSION[userid] logarea s-a efectuat cu succes , vă rugăm așteptați … ";

echo $msg;

echo "<script language='JavaScript' type='text/JavaScript'>

<!–

window.location='welcome.php';

//–>

</script>

";

}

else

{

$msg = " Autentificare eșuată, vă rugăm încercați din nou … <br> <br><INPUT TYPE='button' VALUE='Înapoi' onClick='history.go(-1);'>";

} // end of if else for matching password

} // end of if elase for matching number of records <>1

}else{

$msg = " Autentificare eșuată, vă rugăm încercați din nou … <br><br><INPUT TYPE='button' VALUE='Back' onClick='history.go(-1);'>";

} //

echo $msg;

?>

<article id="mainContent" >

<center>

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='index1.html' rel="nofollow">Înapoi la ProDrive</a></font></center>

</body>

</html>

Pagina Înregistrare

<?Php

include "config.php"; // database connection details stored here

// Collect the data from post method of form submission //

$userid=$_POST['userid'];

$password=$_POST['password'];

$password2=$_POST['password2'];

$agree=$_POST['agree'];

$todo=$_POST['todo'];

$email=$_POST['email'];

$name=$_POST['name'];

$sex=$_POST['sex'];

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Inscriere </title>

</head>

<body background="_images/alb.jpg">

<?Php

if(isset($todo) and $todo=="post"){

$status = "OK";

$msg="";

// if userid is less than 3 char then status is not ok

if(!isset($userid) or strlen($userid) <3){

$msg=$msg."Username-ul trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if(!ctype_alnum($userid)){

$msg=$msg."Username-ul trebuie să conțină numai litere.<BR>";

$status= "NOTOK";}

$count=$dbo->prepare("select userid from plus_signup where userid=:userid");

$count->bindParam(":userid",$userid);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Acest username nu este disponibil . Vă rugăm introduceți un alt username.<br>";

$status= "NOTOK";

}

$count=$dbo->prepare("select email from plus_signup where email=:email");

$count->bindParam(":email",$email);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Această adresă de email deja există. Dacă ați uitat parola contului vă rugăm accesați link-ul<a href=forgot-password.php> Ai uitat parola?</a> Sau introduceți o altă adresă de email.<BR>";

$status= "NOTOK";

}

if ( strlen($password) < 3 ){

$msg=$msg."Parola trebuie să conțină mai mult de 3 caractere.<BR>";

$status= "NOTOK";}

if ( $password <> $password2 ){

$msg=$msg."Cele două parole nu coincid.<BR>";

$status= "NOTOK";}

if ($agree<>"yes") {

$msg=$msg."Trebuie să fiți de acord cu termenii și condițiile pentru a vă conecta.<BR>";

$status= "NOTOK";}

if($status<>"OK"){

echo "<font face='Verdana' size='2' color=red>$msg</font><br><input type='button' value='Înapoi' onClick='history.go(-1)'>";

}else{ // if all validations are passed.

$password_original = $password;

$password=md5($password); // Encrypt the password before storing

$sql=$dbo->prepare("insert into plus_signup(userid,password,email,name,sex) values(:userid,:password,:email,:name,:sex)");

$sql->bindParam(':userid',$userid,PDO::PARAM_STR, 15);

$sql->bindParam(':password',$password,PDO::PARAM_STR, 32);

$sql->bindParam(':email',$email,PDO::PARAM_STR, 75);

$sql->bindParam(':name',$name,PDO::PARAM_STR);

$sql->bindParam(':sex',$sex,PDO::PARAM_STR);

if($sql->execute()){

//echo " Inside ok loop ";

$mem_id=$dbo->lastInsertId();

/////////////////Posting confirmation mail ///////////////

$em="[anonimizat]"; // Change to your email address

$headers4=$em;

$headers="";

$headers.="Reply-to: $headers4\n";

$headers .= "From: $headers4\n";

$headers .= "Errors-to: $headers4\n";

//$headers = "Content-Type: text/html; charset=iso-8859-1\n".$headers;

$content="Your login details from ****** \n\n";

$content .="User ID= $userid \n";

$content .="Password = $password_original \n";

//echo $content;

$sub="Your login details";

//mail($email,"$sub",$content,$headers);

echo "<font face='Verdana' size='2' color=green>Felicitări! Înregistrarea s-a efectuat cu succes.<br><br><a href=index1.html>Înapoi la ProDrive</a><br></font>";

//////////////// End of posting mail ////////

}// if sql executed

else{print_r($sql->errorInfo()); }

}

} // end of todo if condition

?>

Pagina Modifiare Profil

<?Php

include "include/session.php";

include "config.php";

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

/*

while (list ($key,$val) = each ($_POST)) {

$$key = $val;

}

*/

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Administrare</title>

</head>

<body>

<?Php

require "check.php";

$todo=$_POST['todo'];

$name=$_POST['name'];

$email=$_POST['email'];

$sex=$_POST['sex'];

// check the login details of the user and stop execution if not logged in

if(isset($todo) and $todo=="update-profile"){

// set the flags for validation and messages

$status = "OK";

$msg="";

// if name is less than 5 char then status is not ok

if (strlen($name) < 5) {

$msg=$msg."Numele trebuie să conțină mai mult de 5 caractere.<BR>";

$status= "NOTOK";}

// you can add email validation here if required.

// The code for email validation is available at www.plus2net.com

if($status<>"OK"){ // if validation failed

echo "<font face='Verdana' size='2' color=red>$msg</font><br><input type='button' value='Retry' onClick='history.go(-1)'>";

}else{ // if all validations are passed.

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

$sql=$dbo->prepare("update plus_signup set name=:name,email=:email,sex=:sex where userid='$_SESSION[userid]'");

$sql->bindParam(':name',$name,PDO::PARAM_STR, 25);

$sql->bindParam(':email',$email,PDO::PARAM_STR, 15);

$sql->bindParam(':sex',$sex,PDO::PARAM_STR, 7);

if($sql->execute()){

echo "<font face='Verdana' size='2' color=green>Profilul a fost modificat cu succes!<br></font>";

}// End of if profile is ok

else{

print_r($sql->errorInfo()); // if any error is there it will be posted

$msg=" <font face='Verdana' size='2' color=red>Au existat niște probleme la modificarea profilului, vă rugăm contactați administratorul acestui site.<br></font>";

}// end of if else if database updation failed

}// end of if else for satus<> ok

echo $msg;

}// end of todo to check form inputs

require "bottom.php";

?>

<article id="mainContent" >

<center>

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='welcome.php' rel="nofollow">Înapoi la ProDrive</a></font></center>

</body>

</html>

Pagina Chestionare

<?php if(!isset($RUN)) { exit(); } ?>

<?php

access::allow("2");

require "grid.php";

require "db/questions_db.php";

require "db/asg_db.php";

require "qst_viewer.php";

$app_display = "";

$msg_display = "none";

$timer_display ="";

$msg_text = "";

$qst_html ="";

$timer_script = "";

$timer_display = "none";

$pager_html="";

$pager_display="";

$emulate_goto=true;

while($emulate_goto==true) { // emulating goto operator

$user_id = $_SESSION['user_id'];

$asg_id = util::GetID("?module=active_assignments");

$_SESSION['asg_id']=$asg_id;

$active_asg = asgDB::GetActAsgByUserID($user_id, $asg_id);

$asg_num = db::num_rows($active_asg);

if($asg_num==0)

{

DisplayMsg("error","Nu aveti acces la acest chestionar",false);

break;

}

$asg_row = db::fetch($active_asg);

$status = intval($asg_row['user_quiz_status']);

$user_quiz_id = $asg_row['user_quiz_id'];

$_SESSION['user_quiz_id']=$user_quiz_id;

$quiz_type = $asg_row['quiz_type'];

if($status==0)

{

$date = util::Now();

$user_quiz_id=db::exec_insert(orm::GetInsertQuery("user_quizzes", array("assignment_id"=>$asg_id,

"user_id"=>$user_id,

"status"=>"1",

"added_date"=>$date,

"success"=>"0"

)));

}

else if($status>=2)

{

DisplayMsg("error","Ati finalizat acest chestionar ",false);

break;

}

if($quiz_type=="1") // if survey

{

$timer_display= "";

$ended=ShowTimer($status,$asg_row);

if($ended==true) break;

}

$page = "?module=start_quiz&id=".$asg_id ;

$qst_viewer = new qst_viewer($page);

$qst_viewer->user_quiz_id=$user_quiz_id;

$priority = $qst_viewer->GetPriority();

if(isset($_POST['btnNext']))

{

UpdateValues();

if($_POST['finish_quiz']=="1") break;

$priority =$qst_viewer->GetNextPriority();

}

if(isset($_POST['btnPrev']))

{

$priority =$qst_viewer->GetPrevPriority();

}

if(isset($_POST['load_question']))

{

$priority = $_POST['load_priority'];

}

$qst_query = questions_db::GetQuestionsByPriority($priority, $asg_id, $user_id);

$row_qst = db::fetch(db::exec_sql($qst_query));

//echo $qst_query;

if($priority==1)

{

$qst_viewer->show_prev=false;

}

else if($row_qst['next_priority']==-1)

{

$qst_viewer->show_next=false;

$qst_viewer->show_finish=true;

}

//echo $qst_query;

$qst_viewer->BuildQuestionWithResultset($row_qst);

$qst_html = $qst_viewer->html;

// $row_num = db::num_rows($qst_results);

// if($row_num==0)

//{

// DisplayError("You don't have access to this quiz/survey");

//}

$pager_html = GetPager();

if(isset($_POST['data_post']))

{

echo $qst_html."[{sep}]".$pager_html;

}

$emulate_goto =false;

}

function UpdateValues()

{

global $user_quiz_id;

$db = new db();

$db->connect();

$db->begin();

try

{

$db->query(orm::GetDeleteQuery("user_answers", array("user_quiz_id"=>$user_quiz_id , "question_id"=>intval($_POST['qstID']))));

$date = date('Y-m-d H:i:s');

switch ($_POST['qst_type']) {

case 0 : // if checkbox

$chks = explode(";|",$_POST['post_data']);

for($i=0;$i<sizeof($chks);$i++)

{

$chk_value=trim($chks[$i]);

if($chk_value=="") continue;

$chk_value = intval($chk_value);

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$chk_value, "user_answer_id"=>$chk_value,

"added_date"=>$date

));

$db->query($query);

}

break;

case 1 : //if radio button

$chk_value=trim($_POST['post_data']);

if($chk_value!="")

{

$chk_value = intval($chk_value);

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$chk_value, "user_answer_id"=>$chk_value,

"added_date"=>$date

));

$db->query($query);

}

break ;

case 3 : // if free text area

$free_vals = explode(";|",$_POST['post_data']);

$answer_id=$free_vals[0];

$answer_text=$free_vals[1];

//if($chk_value!="")

//{

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$answer_id, "user_answer_text"=>$answer_text,

"added_date"=>$date

));

$db->query($query);

// }

break ;

case 4 : // if muti text

$txts = explode(";|",$_POST['post_data']);

for($i=0;$i<sizeof($txts);$i++)

{

$txt_key_value=trim($txts[$i]);

if($txt_key_value=="") continue;

$txt_exp=explode(":|",$txt_key_value);

$txt_key = intval($txt_exp[0]);

$txt_value = $txt_exp[1];

if(trim($txt_key)=="" || trim($txt_value)=="") continue ;

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$txt_key, "user_answer_text"=>$txt_value,

"added_date"=>$date

));

$db->query($query);

}

break;

}

$db->commit();

if($_POST['finish_quiz']=="1")

{

$row=asgDB::UpdateUserQuiz($user_quiz_id,2);

$msg = GetQuizResults($row);

DisplayMsg("warning",$msg,true);

}

$db->commit();

}

catch(Exception $e)

{

echo $e->getMessage();

$db->rollback();

}

$db->close_connection();

}

function GetQuizResults($row)

{

global $quiz_type;

$msg = "Finalizat . Va multumim . <br>";

if($row['show_results']=="1" && $quiz_type=="1")

{

$total = $row['total_point'];

if($row['results_mode']=="2") $results_mode = $row['total_perc']." %";

$msg.="Ati acumulat: $total . Punctaj trecere: ".$row['pass_score']." .";

$msg.="<br>";

if($row['quiz_success']=="1")

{

$msg.="Ati trecut acest examen!";

}

else

{

$msg.="Ne pare rau, nu ati trecut acest examen!";

}

}

return $msg;

}

function DisplayMsg($type,$msg,$isajax)

{

if(isset($_POST['ajax'])) $isajax=true;

if($isajax==true)

{

if($type=="error")

{

echo "error:".$msg;

}

else if($type=="warning")

{

echo "warni:".$msg;

}

else

{

echo $msg;

}

}

else

{

global $app_display,$msg_display,$msg_text,$timer_display,$pager_display;

$app_display="none";

$msg_display = "";

$msg_text=$msg;

$timer_display="none";

$pager_display="none";

}

// echo $msg;

}

function ShowTimer($status,$row)

{

$ended = false;

$start_date =$row['uq_added_date'];

if($status=="0") $start_date = util::Now();

$diff = abs(strtotime(util::Now()) – strtotime($start_date));

$total_minutes = intval($diff/60);

$minuets = intval($row['quiz_time']) – $total_minutes -1;

$seconds = 60-($diff%60);

if($total_minutes>=intval($row['quiz_time']))

{

global $user_quiz_id;

$row_results=asgDB::UpdateUserQuiz($user_quiz_id,3);

$msg="Timpul a luat sfarsit <br>";

$msg.=GetQuizResults($row_results);

DisplayMsg("message",$msg,false);

$ended=true;

}

else

{

global $timer_script;

$timer_script="<script language=javascript>Init_Timer($minuets,$seconds)</script>";

}

return $ended;

}

function GetPager()

{

global $priority,$asg_id,$page;

$res_qst=db::exec_sql(questions_db::GetQuestionsByAsgIdQuery($asg_id));

if(db::num_rows($res_qst)==0) return "";

$i=0;

$pager_html = "";

$finish = 0;

while($row=db::fetch($res_qst))

{

$i++;

$bgcolor="white";

if($priority==$row['priority'])

{

$bgcolor = "green";

}

$pager_html.= "<u><a style='cursor:pointer;background-color:$bgcolor' onmouseout='HideObject(\"tblTip\")' ".

" onmouseover='ShowQst(event.pageX, event.pageY ,".$row['priority'].")' onclick='LoadQst(\"$page\",$row[question_type_id],$row[priority],$row[id],$finish)'>".$i."</a></u>&nbsp;";

}

return $pager_html."&nbsp;&nbsp;";

}

function desc_func()

{

return "Chestionare";

}

?>

Bibliografie

Partea Tehnică:

Resurse tipărite:

[EN05] Elisabeth Naramoren, Jason Cerner – Beginning PHP5 Apache and MySQL Web Development, 2005

[IM03] Ionuț Morar, Fundamente ale bazelor de date relaționnale, 2003

[IM03] Ionuț Morar, Noțiuni de bază PHP, 2003

[TG09]Teodoru Gugoiu HTML, XHTML, CSS si XML prin exemple, 2009

Resurse internet:

[web1] http://nitpicker.pbworks.com/w/page/12451253/The%20Humane%20Interface ,

Accesat 06.04.2014

[web2] http://en.wikipedia.org/wiki/User_interface, Accesat 06.04.2014

[web3] http://myphpscriptz.com/php-scripts-tutorials/what-is-wamp-and-how-to-install-and-use-it/ , Accesat 06.04.2014

[web4] http://w3techs.com/, Accesat 06.04.2014

[web5] http://httpd.apache.org/ABOUT_APACHE.html , Accesat 06.04.2014

[web6] http://www.php.net/manual/ro/ , Accesat 08.04.2014

[web7] http://www.scribd.com/doc/80355209/Javascript, Accesat 13.04.2014

[web8] http://www.scribd.com/doc/68594106/61070373-html#outer_page_1, Accesat 13.04.2014

[web9] http://www.ghid-html.info/140-introducere-in-css.html, Accesat 13.04.2014

[web10] http://tutoriale-webdesign.blogspot.ro/p/1.html, Accesat 13.04.2014

[web11] http://ro.wikipedia.org/wiki/Adobe_Photoshop, Accesat 23.04.2014

[web12] http://www.dexblog.ro/despre/wordpress/, Accesat 29.04.2014

[web13] http://www.vadmin.ro/definitii, Accesat 06.05.2014

[web14] http://nadoluco.ro/wordpress/, Accesat 29.04.2014

[web15] http://php.net/usage.php, Accesat 29.05.2014

Partea Economică:

Resurse tipărite:

[CS06] Cezar Scarlat-Managementul Proiectelor, Editura Printech, 2006

[CA07] S.L. Catalin Alexe-Material suport-Proiect-Managementul Proiectelor

Resurse internet:

[web15] http://ro.scribd.com/doc/175551231/Managementul-proiectelor, Accesat 24.05.2014

[web16] http://www.scritub.com/diverse/CADRUL-LOGIC75896.php, Accesat 24.05.2014

[web17] http://consultingreview.ro/articole/managementul-proiectelor-planificarea-proiectului.html, Accesat 24.05.2014

[web18] http://www.ramp.ase.ro/_data/files/articole/1_06.pdf, Accesat 24.05.2014

[web19] http://www.scritub.com/stiinta/informatica/Ce-este-diagrama-Gantt1032201711.php , Accesat 26.05.2014

Anexe

Mai jos sunt prezentate fișierele principale ale aplicației:

Pagina Căutare

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Cautare </title>

</head>

<body>

<img border="0" src="_images/2.jpg" width="1350" height="70">

<br><br>

<?php

$button = $_GET ['submit'];

$search = $_GET ['search'];

if(!$button)

echo "Nu ati introdus nimic";

else

{

if(strlen($search)<=1)

echo "Cuvantul este prea scurt";

else{

echo "Cautare pentru <b>$search</b> <hr size='1'></br>";

mysql_connect("localhost","root","");

mysql_select_db("config");

$search_exploded = explode (" ", $search);

foreach($search_exploded as $search_each)

{

$x = NULL; $construct = NULL;

$x++;

if($x==1)

$construct .="keywords LIKE '%$search_each%'";

else

$construct .="AND keywords LIKE '%$search_each%'";

}

$construct ="SELECT * FROM search WHERE $construct";

$run = mysql_query($construct);

$foundnum = mysql_num_rows($run);

if ($foundnum==0)

echo "Ne pare rau, nu exista rezultate pentru <b>$search</b>.</br></br>

</br>2. Incercati cuvinte diferite dar cu acelasi sens.</br>3. Verificati corectiudinea cuvantului introdus";

else

{

echo "$foundnum resultate gasite !<p>";

while($runrows = mysql_fetch_assoc($run))

{

$title = $runrows ['title'];

$desc = $runrows ['description'];

$url = $runrows ['url'];

echo "

<a href='$url'><b>$title</b></a><br>

$desc<br>

<a href='$url'>$url</a><p>

";

}

}

}

}

?>

<article id="mainContent" >

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='welcome.php' rel="nofollow">Înapoi la ProDrive</a></font>

</body>

</html>

Pagina Autentificare

<?Php

include "include/session.php";

include "config.php"; // database connection details stored here

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

$userid=$_POST['userid'];

$password=$_POST['password'];

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Autentificare </title>

</head>

<body>

<?Php

//$password=md5($password); // Encrypt the password before comparing

//// Checking userid and password //////

$msg='';

$status='OK';

if(!isset($userid) or strlen($userid) <3){

$msg=$msg."Username-ul trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if ( strlen($password) < 3 ){

$msg=$msg."Parola trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if($status<>"OK"){

echo "<font face='Verdana' size='2' color=red>$msg</font><br><br><input type='button' value='Încearcați din nou' onClick='history.go(-1)'>";

exit;

}

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

$count=$dbo->prepare("select password,mem_id,userid from plus_signup where userid=:userid");

$count->bindParam(":userid",$userid,PDO::PARAM_STR);

if($count->execute()){

$no=$count->rowCount();

if($no <> 1 ) {

$msg=" Username-ul introdus nu este corect. Vă rugăm încercați din nou… ";

}else {

$row = $count->fetch(PDO::FETCH_OBJ);

if($row->password==md5($password)){

echo " Inside ";

// Start session n redirect to last page

$_SESSION['id']=session_id();

$_SESSION['userid']=$row->userid;

$_SESSION['mem_id']=$row->mem_id;

//echo " Inside session ". $_SESSION['userid'];

$msg=" Bună $_SESSION[userid] logarea s-a efectuat cu succes , vă rugăm așteptați … ";

echo $msg;

echo "<script language='JavaScript' type='text/JavaScript'>

<!–

window.location='welcome.php';

//–>

</script>

";

}

else

{

$msg = " Autentificare eșuată, vă rugăm încercați din nou … <br> <br><INPUT TYPE='button' VALUE='Înapoi' onClick='history.go(-1);'>";

} // end of if else for matching password

} // end of if elase for matching number of records <>1

}else{

$msg = " Autentificare eșuată, vă rugăm încercați din nou … <br><br><INPUT TYPE='button' VALUE='Back' onClick='history.go(-1);'>";

} //

echo $msg;

?>

<article id="mainContent" >

<center>

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='index1.html' rel="nofollow">Înapoi la ProDrive</a></font></center>

</body>

</html>

Pagina Înregistrare

<?Php

include "config.php"; // database connection details stored here

// Collect the data from post method of form submission //

$userid=$_POST['userid'];

$password=$_POST['password'];

$password2=$_POST['password2'];

$agree=$_POST['agree'];

$todo=$_POST['todo'];

$email=$_POST['email'];

$name=$_POST['name'];

$sex=$_POST['sex'];

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Inscriere </title>

</head>

<body background="_images/alb.jpg">

<?Php

if(isset($todo) and $todo=="post"){

$status = "OK";

$msg="";

// if userid is less than 3 char then status is not ok

if(!isset($userid) or strlen($userid) <3){

$msg=$msg."Username-ul trebuie să conțină minim 3 caractere.<BR>";

$status= "NOTOK";}

if(!ctype_alnum($userid)){

$msg=$msg."Username-ul trebuie să conțină numai litere.<BR>";

$status= "NOTOK";}

$count=$dbo->prepare("select userid from plus_signup where userid=:userid");

$count->bindParam(":userid",$userid);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Acest username nu este disponibil . Vă rugăm introduceți un alt username.<br>";

$status= "NOTOK";

}

$count=$dbo->prepare("select email from plus_signup where email=:email");

$count->bindParam(":email",$email);

$count->execute();

$no=$count->rowCount();

if($no >0 ){

$msg=$msg."Această adresă de email deja există. Dacă ați uitat parola contului vă rugăm accesați link-ul<a href=forgot-password.php> Ai uitat parola?</a> Sau introduceți o altă adresă de email.<BR>";

$status= "NOTOK";

}

if ( strlen($password) < 3 ){

$msg=$msg."Parola trebuie să conțină mai mult de 3 caractere.<BR>";

$status= "NOTOK";}

if ( $password <> $password2 ){

$msg=$msg."Cele două parole nu coincid.<BR>";

$status= "NOTOK";}

if ($agree<>"yes") {

$msg=$msg."Trebuie să fiți de acord cu termenii și condițiile pentru a vă conecta.<BR>";

$status= "NOTOK";}

if($status<>"OK"){

echo "<font face='Verdana' size='2' color=red>$msg</font><br><input type='button' value='Înapoi' onClick='history.go(-1)'>";

}else{ // if all validations are passed.

$password_original = $password;

$password=md5($password); // Encrypt the password before storing

$sql=$dbo->prepare("insert into plus_signup(userid,password,email,name,sex) values(:userid,:password,:email,:name,:sex)");

$sql->bindParam(':userid',$userid,PDO::PARAM_STR, 15);

$sql->bindParam(':password',$password,PDO::PARAM_STR, 32);

$sql->bindParam(':email',$email,PDO::PARAM_STR, 75);

$sql->bindParam(':name',$name,PDO::PARAM_STR);

$sql->bindParam(':sex',$sex,PDO::PARAM_STR);

if($sql->execute()){

//echo " Inside ok loop ";

$mem_id=$dbo->lastInsertId();

/////////////////Posting confirmation mail ///////////////

$em="[anonimizat]"; // Change to your email address

$headers4=$em;

$headers="";

$headers.="Reply-to: $headers4\n";

$headers .= "From: $headers4\n";

$headers .= "Errors-to: $headers4\n";

//$headers = "Content-Type: text/html; charset=iso-8859-1\n".$headers;

$content="Your login details from ****** \n\n";

$content .="User ID= $userid \n";

$content .="Password = $password_original \n";

//echo $content;

$sub="Your login details";

//mail($email,"$sub",$content,$headers);

echo "<font face='Verdana' size='2' color=green>Felicitări! Înregistrarea s-a efectuat cu succes.<br><br><a href=index1.html>Înapoi la ProDrive</a><br></font>";

//////////////// End of posting mail ////////

}// if sql executed

else{print_r($sql->errorInfo()); }

}

} // end of todo if condition

?>

Pagina Modifiare Profil

<?Php

include "include/session.php";

include "config.php";

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

/*

while (list ($key,$val) = each ($_POST)) {

$$key = $val;

}

*/

?>

<!doctype html public "-//w3c//dtd html 3.2//en">

<html>

<body background="_images/alb.jpg">

<head>

<meta http-equiv="Content-type" content="text/html; charset=UTF-8"/>

<title>Administrare</title>

</head>

<body>

<?Php

require "check.php";

$todo=$_POST['todo'];

$name=$_POST['name'];

$email=$_POST['email'];

$sex=$_POST['sex'];

// check the login details of the user and stop execution if not logged in

if(isset($todo) and $todo=="update-profile"){

// set the flags for validation and messages

$status = "OK";

$msg="";

// if name is less than 5 char then status is not ok

if (strlen($name) < 5) {

$msg=$msg."Numele trebuie să conțină mai mult de 5 caractere.<BR>";

$status= "NOTOK";}

// you can add email validation here if required.

// The code for email validation is available at www.plus2net.com

if($status<>"OK"){ // if validation failed

echo "<font face='Verdana' size='2' color=red>$msg</font><br><input type='button' value='Retry' onClick='history.go(-1)'>";

}else{ // if all validations are passed.

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

$sql=$dbo->prepare("update plus_signup set name=:name,email=:email,sex=:sex where userid='$_SESSION[userid]'");

$sql->bindParam(':name',$name,PDO::PARAM_STR, 25);

$sql->bindParam(':email',$email,PDO::PARAM_STR, 15);

$sql->bindParam(':sex',$sex,PDO::PARAM_STR, 7);

if($sql->execute()){

echo "<font face='Verdana' size='2' color=green>Profilul a fost modificat cu succes!<br></font>";

}// End of if profile is ok

else{

print_r($sql->errorInfo()); // if any error is there it will be posted

$msg=" <font face='Verdana' size='2' color=red>Au existat niște probleme la modificarea profilului, vă rugăm contactați administratorul acestui site.<br></font>";

}// end of if else if database updation failed

}// end of if else for satus<> ok

echo $msg;

}// end of todo to check form inputs

require "bottom.php";

?>

<article id="mainContent" >

<center>

<font face='verdana, arial, helvetica' size='4' >

<br><br><a href='welcome.php' rel="nofollow">Înapoi la ProDrive</a></font></center>

</body>

</html>

Pagina Chestionare

<?php if(!isset($RUN)) { exit(); } ?>

<?php

access::allow("2");

require "grid.php";

require "db/questions_db.php";

require "db/asg_db.php";

require "qst_viewer.php";

$app_display = "";

$msg_display = "none";

$timer_display ="";

$msg_text = "";

$qst_html ="";

$timer_script = "";

$timer_display = "none";

$pager_html="";

$pager_display="";

$emulate_goto=true;

while($emulate_goto==true) { // emulating goto operator

$user_id = $_SESSION['user_id'];

$asg_id = util::GetID("?module=active_assignments");

$_SESSION['asg_id']=$asg_id;

$active_asg = asgDB::GetActAsgByUserID($user_id, $asg_id);

$asg_num = db::num_rows($active_asg);

if($asg_num==0)

{

DisplayMsg("error","Nu aveti acces la acest chestionar",false);

break;

}

$asg_row = db::fetch($active_asg);

$status = intval($asg_row['user_quiz_status']);

$user_quiz_id = $asg_row['user_quiz_id'];

$_SESSION['user_quiz_id']=$user_quiz_id;

$quiz_type = $asg_row['quiz_type'];

if($status==0)

{

$date = util::Now();

$user_quiz_id=db::exec_insert(orm::GetInsertQuery("user_quizzes", array("assignment_id"=>$asg_id,

"user_id"=>$user_id,

"status"=>"1",

"added_date"=>$date,

"success"=>"0"

)));

}

else if($status>=2)

{

DisplayMsg("error","Ati finalizat acest chestionar ",false);

break;

}

if($quiz_type=="1") // if survey

{

$timer_display= "";

$ended=ShowTimer($status,$asg_row);

if($ended==true) break;

}

$page = "?module=start_quiz&id=".$asg_id ;

$qst_viewer = new qst_viewer($page);

$qst_viewer->user_quiz_id=$user_quiz_id;

$priority = $qst_viewer->GetPriority();

if(isset($_POST['btnNext']))

{

UpdateValues();

if($_POST['finish_quiz']=="1") break;

$priority =$qst_viewer->GetNextPriority();

}

if(isset($_POST['btnPrev']))

{

$priority =$qst_viewer->GetPrevPriority();

}

if(isset($_POST['load_question']))

{

$priority = $_POST['load_priority'];

}

$qst_query = questions_db::GetQuestionsByPriority($priority, $asg_id, $user_id);

$row_qst = db::fetch(db::exec_sql($qst_query));

//echo $qst_query;

if($priority==1)

{

$qst_viewer->show_prev=false;

}

else if($row_qst['next_priority']==-1)

{

$qst_viewer->show_next=false;

$qst_viewer->show_finish=true;

}

//echo $qst_query;

$qst_viewer->BuildQuestionWithResultset($row_qst);

$qst_html = $qst_viewer->html;

// $row_num = db::num_rows($qst_results);

// if($row_num==0)

//{

// DisplayError("You don't have access to this quiz/survey");

//}

$pager_html = GetPager();

if(isset($_POST['data_post']))

{

echo $qst_html."[{sep}]".$pager_html;

}

$emulate_goto =false;

}

function UpdateValues()

{

global $user_quiz_id;

$db = new db();

$db->connect();

$db->begin();

try

{

$db->query(orm::GetDeleteQuery("user_answers", array("user_quiz_id"=>$user_quiz_id , "question_id"=>intval($_POST['qstID']))));

$date = date('Y-m-d H:i:s');

switch ($_POST['qst_type']) {

case 0 : // if checkbox

$chks = explode(";|",$_POST['post_data']);

for($i=0;$i<sizeof($chks);$i++)

{

$chk_value=trim($chks[$i]);

if($chk_value=="") continue;

$chk_value = intval($chk_value);

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$chk_value, "user_answer_id"=>$chk_value,

"added_date"=>$date

));

$db->query($query);

}

break;

case 1 : //if radio button

$chk_value=trim($_POST['post_data']);

if($chk_value!="")

{

$chk_value = intval($chk_value);

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$chk_value, "user_answer_id"=>$chk_value,

"added_date"=>$date

));

$db->query($query);

}

break ;

case 3 : // if free text area

$free_vals = explode(";|",$_POST['post_data']);

$answer_id=$free_vals[0];

$answer_text=$free_vals[1];

//if($chk_value!="")

//{

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$answer_id, "user_answer_text"=>$answer_text,

"added_date"=>$date

));

$db->query($query);

// }

break ;

case 4 : // if muti text

$txts = explode(";|",$_POST['post_data']);

for($i=0;$i<sizeof($txts);$i++)

{

$txt_key_value=trim($txts[$i]);

if($txt_key_value=="") continue;

$txt_exp=explode(":|",$txt_key_value);

$txt_key = intval($txt_exp[0]);

$txt_value = $txt_exp[1];

if(trim($txt_key)=="" || trim($txt_value)=="") continue ;

$query = orm::GetInsertQuery("user_answers", array("user_quiz_id"=>$user_quiz_id, "question_id"=>intval($_POST["qstID"]), "answer_id"=>$txt_key, "user_answer_text"=>$txt_value,

"added_date"=>$date

));

$db->query($query);

}

break;

}

$db->commit();

if($_POST['finish_quiz']=="1")

{

$row=asgDB::UpdateUserQuiz($user_quiz_id,2);

$msg = GetQuizResults($row);

DisplayMsg("warning",$msg,true);

}

$db->commit();

}

catch(Exception $e)

{

echo $e->getMessage();

$db->rollback();

}

$db->close_connection();

}

function GetQuizResults($row)

{

global $quiz_type;

$msg = "Finalizat . Va multumim . <br>";

if($row['show_results']=="1" && $quiz_type=="1")

{

$total = $row['total_point'];

if($row['results_mode']=="2") $results_mode = $row['total_perc']." %";

$msg.="Ati acumulat: $total . Punctaj trecere: ".$row['pass_score']." .";

$msg.="<br>";

if($row['quiz_success']=="1")

{

$msg.="Ati trecut acest examen!";

}

else

{

$msg.="Ne pare rau, nu ati trecut acest examen!";

}

}

return $msg;

}

function DisplayMsg($type,$msg,$isajax)

{

if(isset($_POST['ajax'])) $isajax=true;

if($isajax==true)

{

if($type=="error")

{

echo "error:".$msg;

}

else if($type=="warning")

{

echo "warni:".$msg;

}

else

{

echo $msg;

}

}

else

{

global $app_display,$msg_display,$msg_text,$timer_display,$pager_display;

$app_display="none";

$msg_display = "";

$msg_text=$msg;

$timer_display="none";

$pager_display="none";

}

// echo $msg;

}

function ShowTimer($status,$row)

{

$ended = false;

$start_date =$row['uq_added_date'];

if($status=="0") $start_date = util::Now();

$diff = abs(strtotime(util::Now()) – strtotime($start_date));

$total_minutes = intval($diff/60);

$minuets = intval($row['quiz_time']) – $total_minutes -1;

$seconds = 60-($diff%60);

if($total_minutes>=intval($row['quiz_time']))

{

global $user_quiz_id;

$row_results=asgDB::UpdateUserQuiz($user_quiz_id,3);

$msg="Timpul a luat sfarsit <br>";

$msg.=GetQuizResults($row_results);

DisplayMsg("message",$msg,false);

$ended=true;

}

else

{

global $timer_script;

$timer_script="<script language=javascript>Init_Timer($minuets,$seconds)</script>";

}

return $ended;

}

function GetPager()

{

global $priority,$asg_id,$page;

$res_qst=db::exec_sql(questions_db::GetQuestionsByAsgIdQuery($asg_id));

if(db::num_rows($res_qst)==0) return "";

$i=0;

$pager_html = "";

$finish = 0;

while($row=db::fetch($res_qst))

{

$i++;

$bgcolor="white";

if($priority==$row['priority'])

{

$bgcolor = "green";

}

$pager_html.= "<u><a style='cursor:pointer;background-color:$bgcolor' onmouseout='HideObject(\"tblTip\")' ".

" onmouseover='ShowQst(event.pageX, event.pageY ,".$row['priority'].")' onclick='LoadQst(\"$page\",$row[question_type_id],$row[priority],$row[id],$finish)'>".$i."</a></u>&nbsp;";

}

return $pager_html."&nbsp;&nbsp;";

}

function desc_func()

{

return "Chestionare";

}

?>

Similar Posts