Proiectarea Unei Aplicatii Informatice Hibrid Intre Un Magazin Online Si Pagina de Primire a Clientilor Unui Service de Componente Electronice
Introducere
Aplicația de față este un hibrid între un magazin online și un service de componente real, aducand beneficii ambelor afaceri, satisface o nevoie clară de gestionare a unei afaceri de reparații componente și o expansiune în lumea online-ului mai mult decât necesară în vremurile în care trăim.
Baza de clienți fiind astfel crescută și în domeniul vânzărilor de componente, cât și în acela de reparare a acestora, oferind și un mod facil de a servi clienților garanție și post-garanție produselor cumparate.
Aplicația respectă cele mai noi standarde în domeniul dezvoltarii de produse software online. Limbajul de programare PHP este în continuă dezvoltare și modificare în mai bine.
Baza WWW-ului, HTML-ul este folosit extins în aplicație, cât și stilizarea modernă CSS este folosită cu succes pentru a crea o interfața plăcută utilizatorilor, ușor extensibilă și intuitivă.
Toate acestea rulează pe un server modern numit XAMPP, care pe lângă servirea de pagini PHP si HTML conține și un gestionar de baze de date numit PHPMyAdmin. Acesta facilitează lucrul cu bazele de date oferind stratul informatic care reține datele noastre, le organizează și ni le pune la dispoziție în cel mai rapid mod posibil.
Aplicația este construită folosind cele mai moderne tehnologii WEB datorită prezenței specificațiilor Web 2.0, cât și a specificațiilor CSS3, care încă nici nu au fost stabilite ca standarde, dar care sunt implementate la scară largă în întreaga lume în momentul de față, în toate browserele moderne.
Capitolul I. Limbaje de programare, marcare și stilizare
I.1 PHP
PHP este un limbaj de programare. Numele PHP provine din limba engleză și este un acronim recursiv: Php = Hypertext Preprocessor. Folosit inițial pentru a produce pagini web dinamice, este folosit pe scară largă în dezvoltarea paginilor și aplicațiilor web. Se folosește în principal înglobat în codul HTML, dar începând de la versiunea 4.3.0 se poate folosi și în modul „linie de comandă” (CLI), permițând crearea de aplicații independente. Este unul din cele mai importante limbaje de programare web open-source și server-side, existând versiuni disponibile pentru majoritatea web serverelor și pentru toate sistemele de operare. Conform statisticilor este instalat pe 20 de milioane de site-uri web și pe 1 milion de servere web.[22]
Inițial, limbajul a fost dezvoltat de inventatorul său, Rasmus Lerdorf. Odată cu creșterea numărului de utilizatori, dezvoltarea a fost preluată de o nouă entitate, numită The PHP Group (Grupul PHP).[22]
Limbajul PHP s-a "născut" în 1994 din nevoia lui Rasmus Lerdorf de a afla câte persoane îi vizitează CV-ul online. El a denumit setul de scripturi create PHP, acronimul pentru Personal Home Page. Pe parcursul următorilor trei ani limbajul a evoluat, dar adevăratul succes a început să îl cunoască de când Zeev Suraski și Andi Gutmans au rescris motorul PHP de la cap la coadă, motor care poartă din versiunea a 4 a PHP numele Zend, o combinație de litere din prenumele creatorilor săi: Zeev și Andi.[22]
Fiind open-source, PHP beneficiază de suport activ din partea comunității online, acesta fiind și motivul creșterii explozive a numărului site-urilor bazate pe PHP.
Interpretorul PHP este cel mai cunoscut limbaj de scripting folosit în acest moment pentru crearea site-urilor Web interactive. Denumirea este un "acronim recursiv" pentru Hypertext PreProcessor. Diferența esențială față de alte limbaje de scripting, gen JavaScript, este faptul că PHP este un interpretor server-side (operațiile sunt executate de către server și nu pe calculatorul utilizatorului). Pentru a putea testa pagini PHP avem nevoie de un server de web (Apache) și de pachetul PHP instalat.[21]
PHP permite folosirea unor elemente specifice limbajelor de programare. Ieșirea standard a script-ului PHP devine intrarea standard pentru programul de navigare care vizualizează pagina. Așadar, la ieșirea standard poate fi scris (de exemplu, prin intermediul comenzii echo) orice tip de cod HTML, acesta fiind interpretat de către browser.[21]
Pe lângă manipularea conținutului paginilor de web, PHP poate trimite headere HTTP pentru autentificare, seta cookie-uri sau redirecționa utilizatorii. Mai mult, cu ajutorul bibliotecilor externe de funcții poate pasa fișiere XML, crea și manipula imagini, animații Shockwave Flash, PDF-uri sau se poate conecta la un server de mail, iar acestea sunt doar câteva din funcțiile pe care le poate îndeplini.[2]
Posibilitățile PHP permit afișarea de imagini, fișiere PDF și chiar filme Flash (utilizând libswf și Ming) generate "din zbor”. De asemenea se poate afișa cu ușurință orice text, cum ar fi XHTML sau alt fișier XML. PHP poate genera automat aceste fișiere și le poate salva în sistemul de fișiere, în loc să le afișeze, formând astfel un sistem de cache al conținutului dinamic de partea server-ului.[22]
Una dintre cele mai puternice și semnificative facilități ale PHP este susținerea unui larg domeniu de baze de date. Scrierea unei pagini web cu susținerea bazelor de date este incredibil de simplă. Următoarele baze de date sunt susținute în prezent:
Adabas D
dBase
Empress
FilePro (numai citire)
Hyperwave
IBM DB2
Informix
Ingres
InterBase
FrontBase
mSQL
Direct MS-SQL
MySQL
ODBC
Oracle (OCI7 și OCI8)
Ovrimos
PostgreSQL
SQLite
Solid
Sybase
Velocis
Unix dbm[21]
Alte avantaje ale PHP-ului :
Familiaritatea: sintaxa limbajului este foarte ușoară combinând sintaxele unora din cele mai populare limbaje Perl sau C;
Simplitatea: sintaxa limbajului este destul de liberă. Nu este nevoie de includere de biblioteci sau de directive de compilare, codul PHP inclus într-un document executându-se între marcajele speciale;
Eficiența: PHP-ul se folosește de mecanisme de alocare a resurselor, foarte necesare unui mediu multi-utilizator, așa cum este web-ul;
Securitate: PHP-ul pune la dispoziția programatorului un set flexibil și eficient de măsuri de siguranță;
Flexibilitate: fiind apărut din necesitatea dezvoltării web-ului, PHP a fost modularizat pentru a ține pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit server web, PHP-ul a fost integrat pentru numeroasele servere web existente: Apache, IIS, Zeus, server, etc.;
Gratuitate: este probabil cea mai importantă caracteristică a PHP-ului. Dezvoltarea PHP-ului sub licența open-source a determinat adaptarea rapidă a PHP-ului la nevoile web-ului, eficientizarea și securizarea codului.[13]
PHP-ul a fost folosit pentru a aduce conținut dinamic aplicației noastre, interacțiunii cu baza de date, cât și pentru a gestiona sistemul de abonamente adăugat site-ului.
I.2 SQL
Istoria SQL începe în laboratoarele IBM din San Jose, unde limbajul a fost dezvoltat în ultimii ani ai deceniului al 8-lea. Inițialele provin de la Structured Query Language.[23]
Structured Query Language (SQL – limbajul structurat de interogare) este limbajul standard de facto folosit pentru manipularea și regăsirea datelor din aceste baze de date relaționale. Prin SQL, un programator sau un administrator de baze de date poate face următoarele lucruri:
să modifice structura unei baze de date;
să schimbe valorile de configurare pentru securitatea sistemului;
să adauge drepturi utilizatorilor asupra bazelor de date sau tabelelor;
să interogheze o bază de date asupra unor informații;
să actualizeze conținutul unei baze de date;[23]
SQL a fost dezvoltat pentru a servi bazele de date relaționale.
O bază de date reprezintă un ansamblu de date integrat, anume structurat și dotat cu o descriere a acestei structuri. Descrierea structurii poartă numele de dicționar de date sau metadate și creează o interdependență între datele propriu-zise și programe.
Baza de date poate fi privită ca o colecție de fișiere interconectate, care conțin nucleul de date necesare unui sistem informatic. Astfel, poate fi considerată drept un model al unor aspecte ale realității unei unități economice, modelată prin intermediul datelor. Diferitele obiecte din cadrul realității ce prezintă interes sunt denumite clase sau entități. Pentru aceste obiecte sunt achiziționate și memorate date referitoare la diferite caracteristici (atribute). Baza de date se constituie ca un ansamblu intercorelat de colecții de date, prin care se realizează reprezentarea unei realități.[8]
O bază de date relațională stochează datele în tabele, iar fiecare tabel stochează în coloane informații despre un anumit tip de element. Primul rând al tabelului atribuie nume pentru fiecare coloană. Fiecare coloană, descrie un anumit atribut. Pentru a se putea face referire, mai ușor, la un anumit rând al tabelului, se obișnuiește ca fiecare tabel să conțină o coloană care identifică în mod unic fiecare rând. Această coloană se numește "cheia primară" a tabelului.[8]
Aplicația software care găzduiește o bază de date se numește "sistem de gestiune a bazelor de date" (SGBD). Există multe sisteme de gestiune a bazelor de date. Printre cele mai populare asemenea sisteme se număra: DB2 , Interbase , MySQL , Oracle , Postgresql , SQL Server , Sybase.
MySQL este cel mai popular sistem de gestiune a bazelor de date destinat utilizării cu PHP, în mare măsură deoarece este gratuit. Totuși, prin intermediul PHP este posibil accesul la aproape orice SGBD modern.
Bazele de date relaționale înțeleg SQL (Structured Query Language), un limbaj relativ simplu, folosit pentru solicitarea datelor. În ciuda simplității sale, SQL este un limbaj foarte puternic, care poate obține accesul la date stocate în mai multe tabele, poate filtra datele dorite și poate sorta, rezuma și afișa rezultatele.[9]
În general, bazele de date relaționale își stochează datele într-un singur fișier sau catalog. Aceasta caracteristică de organizare facilitează administrarea datelor, deoarece executarea copiei de siguranță, respectiv restaurarea unui singur fișier sau catalog se realizează mai ușor.[19]
I.3 HTML
HTML este prescurtarea de la Hyper Text Mark-up Language și este codul care stă la baza paginilor web. Paginile HTML conțin elemente (etichete) și au extensia .html sau .htm.
HyperText Markup Language (HTML) este un limbaj de marcare utilizat pentru crearea paginilor web ce pot fi afișate într-un browser (sau navigator). Scopul HTML este mai degrabă prezentarea informațiilor – paragrafe, fonturi, tabele ș.a.m.d. – decât descrierea semanticii documentului.
Paginile HTML sunt formate din etichete sau tag-uri și au extensia .html sau .htm. În marea lor majoritate aceste etichete sunt pereche, una de deschidere <eticheta> și alta de închidere </eticheta>. Browserul interpretează aceste etichete afișând rezultatul pe ecran.[7]
HTML-ul nu este un limbaj case sensitiv (nu face deosebirea între litere mici și mari). Pagina principală a unui domeniu este fișierul index.html. Această pagină este setată a fi afișată automat la vizitarea unui domeniu. [7]
Componența unui document HTML este: 1. versiunea HTML a documentului; 2. zona head cu etichetele <head> </head>; 3. zona body cu etichetele <body> </body> sau <frameset> </frameset> :
Versiunile pot fi de mai multe feluri :
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
sau
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
sau
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">[20]
Toate paginile HTML încep și se termină cu etichetele <html> si </html>. În interiorul acestor etichete găsim perechile <head>, </head> si <body>, </body>.
„head” conține titlul paginii între etichetele <title> și </title>, descrieri de tip <meta>, stiluri pentru formatarea textului, scripturi și linkuri către fișiere externe (de exemplu scripturi, fișiere de tip CSS sau favicon).
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ro">
<head>
<title>Un document simplu</title>
</head>
<body>
<p>Textul documentului îl scrii aici!</p>
</body></html> [3]
Formatarea textului
În HTML trecerea la un rând nou se face doar prin introducerea etichetei <br>, iar pentru paragraf nou cu eticheta <p>.
<hr> introduce o linie orizontală și trecerea la un rând nou.
Fonturilor li se poate modifica: mărimea, culoarea, forma (normal, bold, italic), familia (Arial, Verdana, etc.), textul poate fi aliniat pe orizontală sau verticală, iar titlurile (header), de la 1 la 6, sunt diferite ca mărime (1 cel mai mare iar 6 cel mai mic).
Etichetele <div> și </div> sunt similare etichetelor <span> si </span>, cu diferența că formatează mai multe elemente și introduc un rând nou înainte și după sfârșitul zonei formatate.
Unul din atributele blocului div este align care poate lua valorile:
center – aliniere pe centru
left – aliniere la stânga
right – aliniere la dreapta
Eticheta <div> este una dintre cele mai importante din specificațiile HTML-ului, ea înseamnă „division”, ceea ce tradus înseamnă diviziune. Această etichetă a luat locul tabelelor cu care o pagină era structurată înainte de specificațiile Web 2.0. În specificațiile WEB 2.0 toată structura unui document este realizată cu ajutorul etichetei <div> și a stilizării CSS.
Liste
Listele sunt un mod simplu de organizare a informației și pot fi neordonate, ordonate și de definiții.
Liste neordonate
Aceste liste sunt delimitate de etichetele <ul> și </ul>, iar elementele de <li> și </li>.
<ul>
<li>mere</li>
</ul>[1]
Legături
Legătura (link-ul) este o etichetă foarte importantă în HTML, deoarece conferă utilizatorului posibilitatea navigării de la o pagină la alta. De obicei link-ul este subliniat, iar atunci când suntem deasupra lui, cursorul își schimbă forma.
Link-ul este definit cu etichetele <a> și </a> și are atributele:
href – adresa fișierului destinație
target – în ce fereastră se va deschide fișierul destinație
title – o mică descriere asociată legăturii afișată în momentul în care mouse-ul se află deasupra legăturii
<a href="adresa-fisier" target="_blank" title="titlu">
Adresa fișierului destinație poate fi exprimată astfel :
nume fișier, dacă se află în același folder cu pagina curentă.
<a href="fisier.html">
folder/nume fișier, dacă se află în alt folder
<a href="folder/fisier.html">
Link din imagine
Putem folosi o imagine pentru un link.
<a href="linkcatreimagine.php"><img src="images/poza.jpg" width="100" height="75" alt="poza"></a>
Folosind imagini, pagina primește un plus de atractivitate, dar putem plăti prețul unei încărcări greoaie, dacă dimensiunile imaginii sunt mari.
Câteva din formatele de imagini utilizate în paginile web sunt: JPEG (*.jpg sau *.jpeg), GIF (*.gif), BMP (*.bmp), PNG (*.png).
Formatul GIF (8 biți) conține maximum 256 culori, fiind recomandat pentru grafică (butoane, icon-uri, etc.). Imaginile gif pot fi animate.
Formatul JPG sau JPEG conține milioane de culori și este folosit pentru fotografii. Formatul JPG folosește un algoritm complex de comprimare. Dacă salvăm imaginea JPG cu compresie mică, vom obține o calitate foarte bună, dar dimensiunea fișierului va fi foarte mare. Cu compresie mare imaginea va avea o calitate proastă, dar fișierul va fi foarte mic. Un raport optim între calitatea imaginii și dimensiunea fișierului vom obține pentru o compresie de 60%.
Eticheta folosită pentru inserarea unei imagini în pagină este <img> și are următoarele atribute:
src = sursa, locul unde se află imaginea
width = lățimea imaginii
height = înălțimea imaginii
alt = numele care înlocuiește imaginea până aceasta se încarcă sau când nu a fost găsită
border = chenar (0 = lipsa bordura)
Dimensiunea imaginii afișate de browser este stabilită de argumentele width și height.
În cazul în care cele 2 argumente (width și height) sunt diferite de dimensiunile fișierului imagine, browserul va redimensiona imaginea afișată.
Eticheta img va conține mereu argumentele:
– height și width, astfel browserul va putea afișa corect pagina chiar înainte ca imaginea să fie încărcată complet
– alt, existența valorii acestui atribut este benefică din punct de vedere SEO (Search Engine Optimization).
<img src="poza.jpg" width="100" height="75" alt="poza" border="0"> [3]
Tabele
Tabelul este format din linii și coloane împărțind zona în celule. Fiecare celulă păstrează informația care va fi afișată. Pentru o afișare corectă a tabelului, fiecare rând va avea același număr de celule. Dacă dorim ca o celulă să fie goală vom introduce un spațiu gol (space) sau codul echivalent .
Pentru inserarea unui tabel este folosită perechea de etichete <table> și </table>, pentru un rând <tr> și </tr> iar pentru o celulă <td> și </td>.
Tabelele pot fi imbricate, adică în interior pot conține unul sau mai multe tabele.
Atributele etichetei table folosite sunt:
border = bordură (0 = lipsă bordură)
cellspacing = distanța între celule
cellpadding = distanța dintre marginea celulei și conținut
Atributele etichetei <td> folosite sunt:
align = aliniere pe orizontală a conținutului (left=stânga, right=dreapta, center=centru)
<table border="1">
<tr>
<th width="120">Titlul 1</th>
<th width="120">Titlul 2lt;/th>
</tr>
<tr>
<td>1</td>
<td>2</td>
</tr> <tr>
<td>3</td>
<td>4</td>
</tr> </table> [3]
Formulare
Folosind formularele administratorul site-ului poate colecta diverse informații de la vizitatori.
Cele mai importante atribute ale etichetei <form> sunt action și method.
action menționează adresa scriptului (aflat pe server) care va interpreta formularul. Aceste scripturi pot fi scrise în limbajele PHP sau Pearl.
method indică metoda folosită de browser pentru transmiterea formularului. Poate lua valorile get și post.
get – datele sunt trimise prin adăugarea la adresa indicată de action. Permite trimiterea unor mici cantități de date.
post – datele sunt trimise separat și sunt permise cantități mari de date.
<form action="script.php" method="post">
Nume: <input type="text" name="nume">
Prenume: <input type="text" name="prenume"><br>
<input type="submit" value="Trimite"><input type="reset" value="Sterge">
</form>
Eticheta <input> poate avea atributele:
type – indică tipul datelor care vor fi introduse (text = text, submit = trimite,
reset = șterge, password = parola, hidden = nu este vizibil,
checkbox = caseta de validare, button = buton,
radio = selectarea unui singur element dintr-un grup,
file = fișier pentru upload, image = butonul va fi înlocuit cu o imagine)
name – numele asociat câmpului respectiv. Este folosit la prelucrarea datelor de către scriptul menționat în action
size – numărul de caractere vizibile din câmp[10]
I.4 CSS
CSS înseamnă Cascading Style Sheets (foi de stil în cascada) și se folosește pentru a “stiliza” mai ușor paginile web, conținutul HTML sau XML, oricare ar fi el. CSS-ul a fost inventat prin 1996, acum e la versiunea 2.1, dar se lucrează la standardul 3.0 .
CSS-ul se folosește doar pentru a gestiona modul în care arată pe diverse medii (ecran, print, etc.) diferite elemente HTML sau XML. Codarea tabelară/layout-ul tabelar/așezarea în pagină bazată pe tabele nu exclude folosirea CSS-ului.[6]
Codarea tabelară era folosită pentru că era mai simplu să obții așezarea în pagină pe coloane și forma tabelară în general cu ajutorul tabelelor. CSS-ul a fost adoptat, în primul rând, pentru că simplifică mult munca. E evident mai simplu să schimbi proprietățile unui element din CSS decât să-l rescrii de fiecare dată când apare. La codarea tabelară s-a renunțat doar din rațiuni de complexitate a codului.[6]
CSS a apărut pentru a putea diferenția în pagina HTML conținutul (paragrafe, tabele) de aspect (tipul fontului din paragraf, culoare de fundal). Astfel că tot ce ține de stil (style) aparține CSS-ului.
CSS este utilizat atât de autorii, cât și de cititorii de pagini web pentru a defini culori, fonturi, layout, precum și alte aspecte legate de prezentarea documentelor. El este conceput în primul rând pentru a permite separarea documentului ca și conținut (scrise în HTML sau un Markup Language similar) de documentul de prezentare (scris în CSS).[6]
Această separare poate îmbunătăți accesibilitatea conținutului, să ofere o mai mare flexibilitate și poate diminua caietul de sarcini al celui care se ocupă de mentenanța unui site web prin asigurarea unui control mai simplu. De asemenea, CSS-ul poate reduce complexitatea și repetarea tag-urilor folosite pentru formatare din structura conținutului. CSS poate, de asemenea, permite ca aceeași pagină să fie prezentată în diferite stiluri de redare pentru diferite medii, cum ar fi pe ecranul unui calculator, în imprimare sau vocal, când este redat printr-un cititor de ecran.[6]
Odată cu apariția sa, mulți dezvoltatori web au considerat că CSS este un mod de formatare mult mai puternic și mai ușor de utilizat, și au considerat că <FONT> este un tag învechit. În 2006 (s-a facut Update), capabilitățile CSS-ului au fost îmbunătățite considerabil în ceea ce privește design-ul layout-ului unei pagini web. Cu toate acestea, multe site-uri web încă utilizează CSS numai pentru formatarea textului, în timp ce, pentru layout folosesc tabele. Pentru că Internetul este într-o creșterea rapidă, datorită utilizării tot mai frecvente a telefoanelor mobile și a PDA-urilor, este necesară crearea unor pagini web accesibile utilizatorilor care folosesc o mare varietate de dispozitive. Un design web fară tabele îmbunătățește considerabil accesibilitatea, în acest sens.[6]
Beneficiile sintaxei CSS sunt:
formatarea este introdusă într-un singur loc pentru tot documentul
editarea rapidă a etichetelor
datorită introducerii într-un singur loc a etichetelor se obține o micșorare a codului paginii, implicit încărcarea mai rapidă a acesteia
Sintaxa CSS este structurată pe trei nivele:
nivelul 1 fiind proprietățile etichetelor din documentul HTML, tip inline
nivelul 2 este informația introdusă în blocul HEAD, tip embedded
nivelul 3 este reprezentat de comenzile aflate în pagini separate, tip externe
Cea mai mare importanță (suprascrie orice alt parametru) o are sintaxa de nivelul 1, iar cea mai mică importanță o are cea de nivelul 3.
Folosirea unui fișier extern sau de nivel 3 care să conțină comenzi CSS este foarte practic, deoarece poate fi utilizat în mai multe situații (mai multe fișiere HTML pot folosi același fișier extern CSS) eliminând timpul necesar introducerii codului corespunzător în fiecare pagină și totodată editarea lor într-un singur loc pentru mai multe fișiere.
Extensia acestor fișiere este .css.
Chenare și margini
Fiecare element este încadrat într-o casetă care este compusă din următoarele elemente:
marginea (margin) este spațiul exterior chenarului până la celelalte elemente
chenarul (border) este o bordură care înconjoară elementul
completarea (padding) stabilește distanța dintre conținut și chenar
conținutul include informația utilă (text, tabele, imagini, formulare, etc.)[1]
Capitolul II. Tehnologii adiționale
II.1 Adobe Photoshop
Adobe Photoshop este un program de creare și prelucrare a imaginilor, fișierelor video, paginilor web, produs de Compania Adobe Systems, lider pe piață în domeniu, folosit de profesioniștii din lumea întreagă, datorită ușurinței cu care se poate lucra și multitudinii de instrumente de care dispune.
A apărut prima dată sub numele de Display în anul 1987, când un student de la Universitatea din Michigan, Thomas Knoll, a programat un soft pe Macintosh pentru a vizualiza pe monitor imaginile alb-negru cu nuanțe de gri. Un an mai târziu, Thomas împreună cu fratele său John, au îmbunătățit programul și l-au numit ImagePro. La scurt timp, programul s-a numit Photoshop și Compania Barneyscan l-a distribuit gratuit împreună cu o serie de aparate de scanare.[24]
Adobe Photoshop este programul care permite editarea textelor și a imaginilor, adăugarea de contrast, luminozitate, efecte pe întreaga imagine sau pe anumite zone, culoare (suportă spațiile RGB, Lab, CMYK, nuanțele de gri, duotone), retușuri, transparențe, umbre etc. Utilizatorul are la dispoziție o interfață ușor de folosit și o mulțime de caracteristici pentru imagini, video și editarea paginilor web: straturi, selecții, canale de culoare, măști, filtre, texturi, animații. Cu acest soft se pot citi, modifica și exporta majoritatea formatelor: BMP, PBM, TGA, TIFF, PSD, PSB, PDD, EPS, PNG, GIF, JPEG, JPG, PDF, RAW, EXIF etc. De asemenea, Adobe Photoshop conține peste 50 de plugin-uri (mini-programe cu diferite funcții pentru a ajuta programele de bază să fie utilizate mai ușor).
Adobe Photoshop, așa cum este cunoscut astăzi, este vârful de lance al gamei de produse software pentru editare de imagini digitale, fotografii, grafică pentru tipar, video și Web de pe piață. Photoshop este un program cu o interfață intuitivă, care permite o multitudine extraordinară de modificări necesare în mod curent profesioniștilor și nu numai: 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, efecte third-party, etc. Există situații specifice pentru un profesionist în domeniu în care alte pachete duc la rezultate mai rapide, însă pentru prelucrări generale de imagine, întrucât furnizează instrumente solide, la standard industrial, Photoshop este efectiv indispensabil.[24]
Alături de aplicația Photoshop (ajunsă la versiunea 14, (CC) ), 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.[24]
Principalele elemente prin care Photoshop 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[24]
Fig. 2.1 – Interfața Adobe Photoshop
Interfața a fost realizată prin folosirea uneltelor specifice programului Adobe Photoshop, după cum se observă în figura de mai sus. Aceste unelte sunt constituite în principal din:
instrumentul de trasat linii, pentru liniile care despart meniul de partea de sus a site-ului de lângă logo și formularul de căutare;
instrumentul de realizat chenare – toată pagina a fost creată sub forma unui chenar, care mai apoi a fost tăiat cu ajutorul uneltei de crop. La dimensiunea fișierului s-a folosit dimensiunea de 940 pixeli pe orizontală și 1200 pixeli pe verticală care a permis centrarea elementelor paginii în centrul oricărui program de navigare pe internet. S-a procedat apoi la tăierea (crop) imaginilor, textului, părților albe din fișierul construit. Astfel diviziunile obținute au fost salvate în folderul „service/images”.
Pentru personalizarea diviziunilor am inclus un fișier de tip CSS, specificând fiecărei diviziuni o clasă sau un id, fiecare diviziune având o imagine de background din imaginile create cu Adobe Photoshop. Astfel, în fișierul CSS am putut specifica atribute și stiluri fiecărei diviziuni în parte. Fișierul a fost salvat în directorul css, calea spre el fiind astfel „css/style.css”
II.2 Eclipse
Eclipse este un mediu de dezvoltare integrat (IDE) care facilitează scrierea programelor. Este un framework software open-source scris inițial in Java. Eclipse este considerată o platformă universală, fiind capabilă de a oferi IDE (Integrated Development Environment)-uri pentru mai multe limbaje, dintre care cel mai folosit de utilizatori este Java IDE. Eclipse a fost la început dezvoltat de IBM, după care l-a oferit comunității open-source.
Prima variantă de Eclipse a apărut in Noiembrie 2001, și, de atunci a continuat să se dezvolte, ultima variantă, Eclipse 3.3 fiind lansată în Iunie 2007. Platforma Eclipse aduce o noutate, și anume arhitectura bazată pe plugin-uri. În figura de mai jos este ilustrată interfața Eclipse.
Fig. 2.2 – Interfața Eclipse
Un plug-in este cea mai mică unitate funcțională a platformei Eclipse, care poate fi dezvoltată si transmisă separat. De obicei, un tool simplu este descris într-un singur plugin, pe când un tool mai complicat are funcționalitatea împărțită în diferite plugin-uri.[25]
În acest mediu s-a scris fiecare linie de cod prezentă în aplicația de față. După cum am explicat și mai sus, punctul forte al aplicației sunt plug-in-urile. Am beneficiat de un plug-in care permite accesarea structurii fișierelor și gestionarea acestora sub forma unei vizualizări de tip arbore (tree).
II.3. XAMPP și PhpMyAdmin
XAMPP este o variație a cunoscutului program LAMP, care vine de la Linux Apache MySQL Php și Perl. Multe dintre site-urile web de astăzi funcționează datorită uneia dintre variațiile LAMP-ului, sau a mai puțin cunoscutului WAMP pentru Windows.[19]
Fig. 2.3 – Pagina acasă XAMPP
XAMPP funcționează pe mai multe platforme (de aici rezultând X-ul), și instalează versiunile de Apache, MySQL, PHP și Perl, care sunt special asamblate pentru a rula pe calculatore locale, și nu pe servere web disponibile pe Internet. În figura de mai sus se poate observa interfața și pagina acasă XAMPP.
Accentul se pune pe instalarea în mediu local și de aceea XAMPP este nesigur din start, dar este folosit nu pentru mediu de producție, ci pentru cel de dezvoltare. Cu toate acestea XAMPP-ul poate fi configurat în așa fel încât să poata fi sigur și să funcționeze ca un server web sigur.[20]
Pachetul complet al XAMPP-ului este compus din :
Apache
MySQL
PHP + PEAR
MiniPerl
OpenSSL
phpMyAdmin
XAMPP Control Panel
Webalizer
Mercury Mail Transport System
FileZilla FTP Server
SQLite
ADODB
Zend Optimizer
XAMPP Security[19]
Aplicația PHPMyAdmin este instalată odată cu pachetul de software XAMPP și este scrisă in PHP. Aplicația este distribuită gratuit, și a fost concepută să gestioneze o bază de date MySQL prin World Wide Web.
PHPMyAdmin suportă o gamă largă de operații MySQL. Cele mai frecvente operații sunt suportate de interfața grafică ca gestiunea bazei de date, a tabelelor, a câmpurilor, relațiilor, indexilor, utilizatorilor, permisiilor, etc., cât și executarea directă ca în genul linie de comandă a oricărei instrucțiuni SQL.[20]
În figura de mai jos se pot observa tabelele din baza de date a aplicației:
Fig. 2.4 – Lista cu tabele din baza de date
PHPMyAdmin vine cu o bogată sursă de documentații, iar utilizatorii sunt bineveniți să actualizeze orice pagină a documentației.
Aplicația mai oferă și o excelentă localizare, fiind disponibilă în 58 de limbi.
Principalele caracteristici ale aplicației sunt :
creează și șterge baze de date
creează, copiază, șterge și modifică tabele
șterge, editează și adaugă câmpuri
execută orice frază SQL, chiar și interogări batch (loturi)
management chei pe câmpuri
încarcă fișiere de tip text în tabele
creează și citește dump-uri ale tabelelor
exportă datele în format multiplu (CSV, XML, PDF, OpenDocument, Word, Excel)
management utilizatori și privilegii
administrează servere multiple și multe altele[20]
Capitolul III. Prezentarea aplicației
Aplicația creată este un hibrid între un magazin online și o pagină de primire a clienților unui service de componente electronice modern, care are nevoie de o prezență online pentru a-și mari baza de clienți și totodată a-și îmbunătăți relația cu aceștia.
Aplicația este realizată prin aducerea împreună a mai multor tehnologii moderne, dar destul de accesibile pentru a face din această aplicație o investiție de viitor. Stilul de viață este în continuă schimbare, iar o aplicație care să aducă vizitatori noi și să îmbunătățească relația cu cei existenți este o necesitate absolută.
Cea mai importantă tehnologie folosită este limbajul de programare PHP, care face legătura dintre limbajul de marcare universal HTML, baza de date SQL care servește ca stiva de date culese de la utilizatori și stilurile de vizualizare ale aplicației denumite stiluri CSS.
Pentru o mai ușoară gestionare a codului sursă, acesta a fost împarțit în mai multe dosare:
admin – care contine fișierele parții de administrare a aplicației
css – conține stilurile de stilizare a fișierelor HTML
database – conține scriptul de conectare la baza de date, a fost pus în alt folder pentru a preveni orice mijloc de atac asupra bazei de date.
Images – conține imaginile care au ajutat la crearea interfeței de utilizare cât și fișierele upload-ate de către administratori.
Mai departe fiecare fișier a fost structurat în 3 părți, să luăm ca exemplu index.php
– partea de sus, denumită header: a fost creată ca să putem gestiona mai bine meniul pe care utilizatorii îl văd și pentru a nu scrie în fiecare pagină același lucru. Aceasta este inclusă în fișierul header.php și este inclusă în fișierul index.php prin utilizarea funcției php include:
<?php include('header.php');?>
– partea centrală a aplicației este locul unde în fiecare pagină, nu numai în index.php este afișat conținutul paginei respective, codul sursă din index.php arată astfel:
<div id="body">
<div class="body">
<img src="images/repairs.jpg" alt="">
<div>
<h1>24 service<span>Service-ul tau de incredere</span></h1>
<p>La service-ul nostru beneficiezi de o gama larga de reparatii la toate componentele, fa o programare si convinge-te singur.</p>
<a href="appointment_add.php">Programeaza-te</a>
</div>
</div>
<div class="service">
<div>
<h2><span>Servicii</span></h2>
<ul>
<?php do { ?>
<li>
<a href="service.php?id=<?php echo $row_services['id'];?>" class="figure"><img src="<?php echo image_resize($row_services['image'], 'images/services/', 70, 70);?>" alt="<?php echo $row_services['name'];?>"></a>
<div>
<h3><a href="service.php?id=<?php echo $row_services['id'];?>">
<?php echo $row_services['name']?></a></h3>
<p><?php echo substr($row_services['short_content'], 0, 100)?></p>
</div>
</li>
<?php } while($row_services = mysql_fetch_assoc($services));?>
</ul>
</div>
</div>
</div>
– partea de jos a pagini care conține footer-ul inteligent (fig.3.1) este la fel inclus în aplicație pentru că acesta nu se schimbă pe niciuna din paginile noastre. Scripturile folosite sunt stocate în fișierul php footer.php. În această parte a fost inclus un script care se conectează la baza noastră de date și extrage ultimele 4 produse și le afișează, instrucțiunea SQL care realizează acest lucru este următoarea:
$query_products = "SELECT * FROM products WHERE quantity > 0 ORDER BY created DESC LIMIT 4";
Fig. 3.1 – Footer-ul inteligent
III.1 Baza de date
Baza de date a fost realizată cu ajutorul PHPMyAdmin, sistem de gestiune a bazelor de date aflat în pachetul de software numit XAMPP. În primul rând am deschis un browser și în bara de adresa a acestuia am scris „localhost/phpmyadmin”, dupa care am fost redirecționat pe o pagină unde am putut crea o bază de date. Baza de date a fost denumită „service”, dupa care au fost adăugate tabelele.
Tabele au fost toate denumite în engleză pentru compatibilitate și au numele la plural.
Fiecare tabelă are o cheie primară sintetică denumită id. Cheia primară este întodeauna unică și are proprietatea de a se autoincrementa.
Deoarece baza de date este relațională, mai multe tabele prezintă relații unele cu celelalte, după cum se observă în figura 3.2. . Câmpurile relaționale sunt folosite pentru a lega o tabelă de alta. Câmpurile relaționale au denumirea tabelei mamă la singular cu sufixul „_id” în capăt. Relațiile care se formează în tabela noastră sunt „one to one” și „one to many”.
Fig. 3.2 – Schema relațiilor stabilite între tabelele bazei de date
Structura tabelelor și descrierea lor este următoarea :
Appointments – stochează informațiile despre componentele aduse în service, este o tabelă relațională, care se afla în relație cu tabela users prin câmpul user_id și conține câmpurile :
id
user_id
status
description
created
Categories – salvează toate categoriile prezente în aplicație, conține un câmp care o direcționează la un buton din meniul principal. Acesta poate fi Desktop (main = 0) sau Laptop (main = 1). Câmpurile din care este compusă sunt următoarele :
id
main
name
created
Contacts – este tabela care preia datele din formularul de contact și le salvează pentru a fi vizualizate de către administratori. Conține următoarele câmpuri.
id
name
subject
mesage
created
Images – această tabelă salvează toate informațiile despre imagini, este o tabela relațională de tip „many to one”, câmpul care o leagă de tabela de produse fiind „product_id”, în câmpurile ei mai este prezentă o coloană folosită ca switch între imaginea principală și imaginea secundară. Prezintă următoarele câmpuri:
id
product_id
main_img
name
created
Messages – este tabela care formează un sistem de comentarii între utilizatorii care au componente în service și personalul care este adăugat la reparația componentei respective. Câmpurile sale cuprind:
id
appointment_id
user_id
message
created
Orders – tabela salvează comenzile inițiate de clienți și statutul acestora; este în legătură cu tabela users prin câmpul relațional user_id. Câmpurile acesteia sunt:
id
user_id
status
created
Orders_products – este o tabela relațională cu legături în alte 2 tabele, una în orders, prin câmpul relațional order_id, și una în products prin câmpul relațional product_id. Tabela este folosită la stocarea datelor despre comanda unui client, produsul și numărul de produse. Conține câmpurile următoare:
id
order_id
product_id
quantity
Products – este o tabelă relațională care conține câmpul relațional category_id, acesta leagă tabela products de tabela categories. Lista totală a câmpurilor este:
id
category_id
name
description
quantity
price
created
Services – este o tabelă care conține lista de servicii disponibile pe acest site și prestate de către firma de service componente. Tabela nu se află în nicio relație cu alte tabele și conține următoarele câmpuri:
id
name
short_content
content
image
created
Specifications – este o tabelă care reține în câmpurile sale specificațiile fiecărui produs în parte, aceste specificații sunt afișate în pagina de detaliu a produselor. Tabela conține următoarele câmpuri:
id
product_id
name
specification
created
Users – este tabela care reține datele utilizatorilor, emailul cât și numele și adresa. Câmpurile sale cuprind :
id
group_id
username
password
name
phone
address
city
county
created
III.2 Coșul de cumpărături
Coșul de cumpărături este un instrument modern de cumpărături online, care ușurează experiența online a utilizatorului. Coșul de cumpărături este folosit la realizarea comenzilor online direct de pe site. Acesta este accesibil oricărui utilizator, dar finalizarea comenzii o poate face doar un utilizator autorizat. Pagina „cart.php” verifică dacă sesiunea de autentificare este setată prin următorul cod:
<?php if (!isset($_SESSION['Auth'])) { ?>
Realizarea coșului s-a executat în mai mulți pași:
Pe pagina fiecărui produs a fost adăugat un buton care introduce într-o sesiune numărul de identificare și numele produsului, după cum se observă în figura de mai jos:
Fig. 3.3 – Coșul de cumpărături
Codul de integrare al butonului este următorul:
if (isset($_GET['id'])) {
$add_cart = cart($_GET['id'], 1);
}
if (isset($add_cart) && is_bool($add_cart) && ($add_cart = true)) {
header('Location: cart.php');
}
Codul redirecționează utilizatorul pe o pagină numită „cart.php”, care conține un script, iar acesta apelează funcția de introducere în sesiunea de coș a produsului:
if((isset($_POST["cart"])) && ($_POST["cart"] == "form1")) {
$add_cart = cart($_POST['product_id'], $_POST['quantity']);
header('Location: cart.php');
}
Funcția „cart” preia valoarea numărului de identificare a produsului comandat, și introduce acest număr cât și cantitatea produsului într-o sesiune numită „Cart”. În pagina „cart.php” s-a creat o tabelă care ne arată produsele comandate cât și un „select box” de unde putem alege cantitatea, după cum se observă în figura de mai jos. Cantitatea este actualizată tot cu funcția „cart” dar fiind apelată de o altă acțiune php.
Fig. 8 – Fig.3.4 Tabel de comandă produse
Odată ce s-au finalizat toate modificările dorite de utilizator și acesta dă click pe butonul de ,,finalizare comandă” acesta este direcționat către pagina „cart_final.php” în care sunt executate mai multe comenzi. În primul rând, utilizatorului i se arată încă o dată datele personale, iar acestea trebuie să fie complete și valide ca utilizatorul să poată merge mai departe.
Sub acest formular este afișată comanda clientului într-un tabel html cu toate detaliile necesare. Odată ce utilizatorul dă click pe butonul de „finalizare comandă”, comanda lui este salvată în baza de date printr-o acțiune php care execută comanda SQL „insert”:
$insertSQL = sprintf("INSERT INTO orders (user_id, status, created) VALUES (%s, %s, %s)",
GetSQLValueString($_SESSION['Auth']['id'], "int"),
GetSQLValueString(0, "int"),
GetSQLValueString(date('Y-m-d H:i:s'), "date"));
III.3 Email-ul
Aplicația are o facilitate foarte importantă, care oferă o interacțiune mai bună între utilizatorii ei și site-ul web propriu-zis. Trimiterea de email-uri la utilizatori a devenit o practică comună în rândul aplicațiilor moderne.
În aplicația noastră trimiterea de email-uri s-a folosit în două locuri foarte importante, la terminarea unei comenzi și la realizarea unei programări în service, la aceasta din urmă mail-ul conține numele de utilizator și parola contului creat.
Parola este bineînțeles criptată în baza noastră de date, dar utilizatorului îi este trimisă la vedere ca să poată sa efectueze autentificarea în aplicație pentru a-și putea urmări programarea în service.
La finalizarea comenzii utilizatorului îi este trimis un mail, care ține loc de factura proformă și care conține toate informațiile necesare plații acelei facturi.
PHP-ul ne ajută la acest lucru prin instrucțiunea „mail”, care primește patru parametrii:
$to – către cine trimitem mesajul;
$subject – subiectul mesajului;
$message – mesajul efectiv;
$headers – formatarea instrucțiunilor de trimitere a mesajului, dacă este HTML sau text simplu, de la cine este primit și sistemul de trimitere, în cazul nostru „X-mailer PHP”.
Scriptul care realizează toate acestea este următorul:
$to = $_POST['username'];
$subject = $_POST['name'].' – Cont 24 service';
$message = 'Draga ' . $_POST['name'] . " \n " .
'In timp ce dumneavostra va faceati programarea ne-am permis sa va facem si un cont.' . " \n " .
'Cu acesta puteti urmari statutul reparatiei si binenteles daca doriti, puteti face si cumparaturi din oferta noastra bogata de produse.' . " \n " .
'Nume de utilizator: ' . $_POST['username'] . " \n " .
'Parola :' . $generated_password . " \n ";
$headers = "From: [anonimizat]\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/html; charset=utf-8\r\n" .
"Content-Transfer-Encoding: 8bit\r\n\r\n";
mail($to, $subject, $message, $headers);
III.4 Validări
Validarea email-ului s-a realizat cu scopul de a avea date cât mai exacte introduse în baza noastră de date, aceasta funcție PHP s-a realizat utilizând o expresie regulată aplicată cu ajutorul instrucțiunii php preg_match . Codul sursă al acestei instrucțiuni arată astfel:
function validate_email($username) {
global $form_validates;
if(preg_match('/^([a-z0-9]+([_\.\-]{1}[a-z0-9]+)*){1}([@]){1}([a-z0-9]+([_\-]{1}[a-z0-9]+)*)+(([\.]{1}[a-z]{2,6}){0,3}){1}$/i', $username)) {
return true;
} else {
$form_validates = false;
return 'Adresa de e-mail nu este valida.';
}
}
Validarea câmpurilor goale s-a realizat din cauză că s-a dorit ca în baza de date să fie cât mai multe date și cât mai precise. Această funcție PHP este apelată de oriunde avem formular printr-un script care trimite funcției un parametru extras din câmpul formularului HTML, căruia i se adresează. Funcția verifică dacă în câmp s-au introdus valori și returnează adevărat, dacă există valoare sau fals și un mesaj de eroare, dacă nu există valoare. Acest mesaj este mai apoi afișat în formularul HTML sub câmpul care a fost testat.
function validate_empty($value) {
global $form_validates;
if($value != '') {
return true;
} else {
$form_validates = false;
return 'Acest camp este obligatoriu.';
}
}
Validarea câmpurilor numerice s-a folosit atunci când era nevoie de introducerea în baza de date a unor numere și aceste câmpuri nu puteau fi altceva decât numere. S-a folosit pentru testare instrucțiunea PHP is_numeric.
Validarea parolei este o funcție foarte comună în lumea online, este funcția care verifică lungimea unei parole, aceasta nu permite utilizatorului introducerea unei parole mai scurte de un anumit număr de caractere predefinite în acest script. Funcția arată astfel:
if(strlen($value) >= 4) {
return true;
} else {
$form_validates = false;
return 'Parola trebuie sa contina minimum 4 caractere.';
}
Validarea parolei de confirmare este o altă funcție de validare foarte folosită în lumea online, care ajută utilizatorul și îl previne pe acesta, de la introducerea unei parole greșite la înregistrare, prin utilizarea a două câmpuri de parola și verificarea valorilor introduse în ambele. Aceasta funcție testează într-o instrucțiune de tip if dacă valorile sunt exact identice:
if($value === $confirm) {
return true;
}
Validarea duplicatelor se referă la o verificare făcută în baza de date a aplicației pentru a detecta dacă numele de utilizator mai este folosit încă o dată sau nu, dacă acesta este folosit utilizatorului nu îi este permisă înregistrarea cu același nume al altui utilizator, ordinea de intrare în baza de date este primul venit primul servit. Scriptul utilizează o instrucțiune SQL care extrage din baza de date toate numele de utilizator exact egale cu cel introdus de utilizator în formularul de înregistrare.
Interogarea în baza de date se realizează astfel:
$query_checkValidation = "SELECT * FROM users WHERE username='" . $username . "'";
$checkValidation = mysql_query($query_checkValidation, $service) or die(mysql_error());
$row_checkValidation = mysql_fetch_assoc($checkValidation);
$totalRows_checkValidation = mysql_num_rows($checkValidation);
Funcția retunează adevarat dacă nici un nume de utilizator nu este exact la fel cu cel introdus de utilizator.
Un formular cu erorile de validare la vedere arată astfel:
Fig. 3.5 Formular cu erori de validare la vedere
III.5 Funcții
Funcția de criptare este o funcție realizată pentru a crește securitatea site-ului și mai mult. În general, exista o regulă foarte importantă, aceea de a nu salva parolele utilizatorilor în text, la vedere în baza de date. Dacă baza de date este atacată cu succes, un atacator ar dispune de toate datele de acces ale utilizatorilor acelei aplicații, așadar am criptat toate parolele introduse de utilizator cu ajutorul unei funcții, care utilizează un șir aleator de caractere concatenat cu parola introdusă de utilizator, totul criptat de algoritmul SHA1, algoritm dezvoltat de National Security Agency din S.U.A. Codul funcției este următorul:
$salt = 'nsl;dkjsdfsdsya4tr5345345bfvgk:dsb688,,597GJ';
function password_hash($password) {
global $salt;
return sha1($salt . $password);
}
Funcția de autentificare este o colecție de scripturi, care verifica numele de utilizator și parola, introduse într-un formular de autentificare și mai apoi creează o sesiune PHP, care urmărește utilizatorul peste tot în aplicația de față.
function login_users($username, $password) {
global $database_service;
global $service;
global $errors;
$query_login = "SELECT * FROM users WHERE username='" . $username ."' AND group_id = 2";
$login = mysql_query($query_login, $service) or die(mysql_error());
$row_login = mysql_fetch_assoc($login);
$totalRows_login = mysql_num_rows($login);
if ($totalRows_login == 1) {
if (password_hash($password) === $row_login['password']) {
$_SESSION['Auth'] = array ('id' => $row_login['id'],
'username' => $row_login['username'],
'name' => $row_login['name']);
return true;
} else {
$errors='Parola este incorecta!';
}
} else {
$errors='Utilizator inexistent!';
}
}
Scriptul verifică dacă există un utilizator în baza de date cu username-ul introdus în formular, iar dacă există, se trece la verificarea parolei, care este criptată cu algoritmul de criptare al funcției hash înainte de a fi verificată cu înregistrarea găsită în baza de date.
Dacă parola este aceeași se trece la crearea sesiunii de autentificare în variabila globală PHP $_SESSION['Auth'].
Funcția de autentificare este la fel și pentru administratori, doar condiția SQL este diferită prin group_id = 1.
Funcția de cart este asemănătoare funcției de autentificare cu câteva modificări. Această funcție execută o interogare în baza de date în tabela products pasând variabila id la instrucțiunea SQL select. Dacă produsul a fost găsit după identificatorul său, este creată o sesiune de autentificare care salvează id-ul produsului și cantitatea comandată de către utilizator.
Funcția arată astfel:
function cart($product, $quantity) {
global $database_service;
global $service;
global $errors;
$query_cart = "SELECT * FROM products WHERE id='" . $product . "'";
$cart = mysql_query($query_cart, $service) or die(mysql_error());
$row_cart = mysql_fetch_assoc($cart);
$totalRows_cart = mysql_num_rows($cart);
if ($totalRows_cart == 1) {
$_SESSION['Cart'][$row_cart['id']] = $quantity;
return true;
}
}
III.6 Back-end
Partea de administrare a aplicației este accesibilă introducând în browser url-ul „service/admin”, vom fi întâmpinați de un formular de autentificare(fig 4.6.) , care va prelua datele noastre printr-o acțiune PHP și le va trimite la o funcție php care va scrie sesiunea de autentificare și va redirecționa utilizatorul la pagina „main.php”
Fig. 3.6 Formularul de logare pe back-end
Codul sursă al acțiunii php este următorul:
if ((isset($_POST["login"])) && ($_POST["login"] == "login" )) {
$secure = login($_POST['username'], $_POST['password']);
if (is_bool($secure) && ($secure == true)) {
header('Location: main.php');
}
}
Mesajele de eroare sunt afișate într-un element HTML: <span class="login_errors"><?php echo $errors; ?> </span>
III.6.1 Sistemul de utilizatori
Sistemul de utilizatori consistă din 3 pagini care ajută la gestionarea clienților aplicației în sub paginile utilizatorilor, gestionarea administratorilor și schimbarea parolei administratorului autentificat.
Gestionarea clienților se realizează în pagina users.php prin afișarea unei interogări în baza de date într-o tabela dinamică (fig 3.7.) utilizând mai multe instrucțiuni SQL și o buclă ciclică do while.
Fig. 3.7 Tabela utilizatorilor afișată pe back-end
În această pagină s-a realizat o interogare în tabela users, selectându-se toți utilizatorii aflați în grupul 2. Scriptul de selectare fiind următorul:
$query_users = "SELECT * FROM users WHERE group_id = 2";
$users = mysql_query($query_users, $service) or die(mysql_error());
$row_users = mysql_fetch_assoc($users);
$totalRows_users = mysql_num_rows($users);
Bucla ciclică do while extrage datele acestei interogari, afișând prin funcția echo datele în tabela noastră HTML, astfel aceasta devenind dinamică:
<?php do { ?>
<tr class="row-a">
<td><?php echo $row_users['name']; ?></td>
<td><?php echo $row_users['username']; ?></td>
<td><?php echo $row_users['city']; ?></td>
<td><?php echo $row_users['county']; ?></td>
<td align="left"><a href="user_edit.php?id=<?php echo $row_users['id']; ?>" class="admin_action"><img src="../images/icons/edit.png" /></a></td>
<td align="left"><a href="users.php?id=<?php echo $row_users['id']; ?>&action=delete" onclick="return confirm('Sunteti sigur ca doriti sa stergeti utilizatorul <?php echo $row_clients['name']; ?> ?');" class="admin_action"><img src="../images/icons/cancel.png" /></a></td>
</tr>
<?php } while ($row_users = mysql_fetch_assoc($users)); ?>
În această pagină există 2 link-uri care duc la o altă pagină de editare a utilizatorului și o acțiune PHP care execută ștergerea unui utilizator din baza de date utilizând instrucțiunea PHP delete. Ambele link-uri pasează identificatorul utilizatorului prin URL spre scripturile PHP corespunzătoare. Acțiunea de ștergere este următoarea:
if ((isset($_GET['id'])) && ($_GET['id'] != "") && isset($_GET['action']) && ($_GET['action'] =="delete")) {
$deleteSQL = sprintf("DELETE FROM users WHERE id=%s",
GetSQLValueString($_GET['id'], "int"));
$Result1 = mysql_query($deleteSQL, $service) or die(mysql_error());
header('Location: users.php'); }
Pagina de editare (fig.3.8.) afișează într-un formular detaliile extrase din baza de date de instrucțiunea select cu parametrul pasat prin URL. Interogarea SQL arătând astfel:
$query_users = "SELECT * FROM users WHERE id='" . $_GET['id'] . "'";
$users = mysql_query($query_users, $service) or die(mysql_error());
$row_users = mysql_fetch_assoc($users);
$totalRows_users = mysql_num_rows($users);
Formularul HTML care preia datele din baza de date este populat cu ajutorul instrucțiunii PHP echo. Un input HTML cu validările de rigoare arătând astfel:
<label for="name" >Nume complet
<input name="name" id="name" value="<?php echo $row_users['name']; ?>" type="text" size="30" />
</label>
<?php if(isset($validate_name) && !is_bool($validate_name)) { ?>
<?php echo $validate_name; ?>
<br /><br />
<?php } ?>
Fig. 3.8 Formularul de editare al unui utilizator
Instrucțiunea de actualizare a datelor utilizează o acțiune PHP, care prin utilizarea variabilei globale $_POST, preia datele din formularul HTML și le trimite spre procesare la funcțiile de validare și mai apoi la actualizarea înregistrării în baza de date pe baza identificatorului utilizatorului. Scriptul utilizat arată astfel:
if((isset($_POST["user_edit"])) && ($_POST["user_edit"] == "form1")) {
$form_validates = true;
$validate_email = validate_email($_POST['username']);
$validate_name = validate_empty($_POST['name']);
$validate_phone = validate_empty($_POST['phone']);
$validate_address = validate_empty($_POST['address']);
$validate_city = validate_empty($_POST['city']);
$validate_county = validate_empty($_POST['county']);
if($form_validates == true) {
$insertSQL = sprintf("UPDATE users SET username=%s, name=%s, phone=%s, address=%s, city=%s, county=%s WHERE id='" . $_GET['id'] . "'",
GetSQLValueString($_POST['username'], "text"),
GetSQLValueString($_POST['name'], "text"),
GetSQLValueString($_POST['phone'], "text"),
GetSQLValueString($_POST['address'], "text"),
GetSQLValueString($_POST['city'], "text"),
GetSQLValueString($_POST['county'], "text"),
GetSQLValueString(date('Y-m-d H:i:s'), "date"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error());
header('Location: users.php');
}
}
Administratorul este mai apoi redirecționat pe pagina de gestiune a utilizatorilor de unde își poate continua munca.
Sistemul de gestiune al utilizatorilor este continuat de paginile administratorilor, acestea find similare cu cele ale utilizatorilor doar că pe această pagină putem și adăuga administratori(fig 3.9.)
Fig. 3.9 Tabela administratorilor afișată pe back-end
Pagina de adăugare conține un formular care extrage datele din câmpurile sale cu ajutorul variabilei globale $_POST și le inserează în baza de date în tabela users. Acțiunea PHP construită mai verifică validitatea datelor apelând funcțiile de validare.
Scriptul de adăugare fiind următorul:
if((isset($_POST["user_add"])) && ($_POST["user_add"] == "form1")) {
$form_validates = true;
$validate_email = validate_email($_POST['username']);
$validate_name = validate_empty($_POST['name']);
$validate_password = validate_password($_POST['password']);
$validate_confirm = validate_confirm($_POST['password'], $_POST['passwrd']);
if($form_validates == true) {
$insertSQL = sprintf("INSERT INTO users (group_id, username, password, name, created) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString(1, "int"),
GetSQLValueString($_POST['username'], "text"),
GetSQLValueString(password_hash($_POST['password']), "text"),
GetSQLValueString($_POST['name'], "text"),
GetSQLValueString(date('Y-m-d H:i:s'), "date"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error()
header('Location: admins.php');
}
}
Ultima parte a acestui sistem de gestiune este schimbarea parolei unui utilizator autentificat:
Fig. 3.10 Formularul de schimbare parola
Pagina change_pass.php execută o verificare în baza de date după parola veche și mai apoi verifică parola noua și confirmarea parolei noi:
$query_users = "SELECT * FROM users WHERE id='" . $_SESSION['Auth']['id'] . "'";
$users = mysql_query($query_users, $service) or die(mysql_error());
$row_users = mysql_fetch_assoc($users);
$totalRows_users = mysql_num_rows($users);
$form_validates = true;
$validate_password = validate_password($_POST['new_password']);
$validate_confirm = validate_confirm($_POST['new_password'], $_POST['confirm_password']);
if($totalRows_users == 1) {
if (password_hash($_POST['old_password']) === $row_users['password']) {
if ($_POST['new_password'] === $_POST['confirm_password']) {
if($form_validates == true) {
$insertSQL = sprintf("UPDATE users SET password=%s WHERE id=%s",
GetSQLValueString(password_hash($_POST['new_password']), "text"),
GetSQLValueString($_SESSION['Auth']['id'], "int"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error());
header('Location: main.php');
}
} else {
$errors = 'Parolele nu se potrivesc!';
}
} else {
$errors = 'Parola veche este invalida!';
}
Scriptul preia identificatorul administratorului direct din sesiunea de autentificare, acest lucru face ca schimbarea parolei să fie făcută în mod unic, nu se poate schimba la alți utilizatori. Dacă există un utilizator se trece la verificarea parolei vechi, dacă și aceasta se potrivește, se verifică dacă parolele introduse de administrator sunt identice și se trece la actualizarea datelor din tabela users. Parola este criptată cu funcția hash înainte de a fi introdusă în baza de date.
III.6.2 Sistemul de mesaje
Sistemul de mesaje este o parte integrantă a aplicației prin faptul că oferă o interfață ușor de folosit administratorilor pentru a răspunde întrebărilor directe puse de către clienții aplicației.
Pagina contacts.php găzduiește această parte a aplicației și este constituită dintr-o interogare în baza de date, realizată cu ajutorul instrucțiunii SQL select și a unei bucle ciclice do while care afișează într-un tabel HTML dinamic toate mesajele din tabela contacts din baza noastră de date.
Selecția datelor se realizează astfel:
$query_contacts = "SELECT * FROM contacts";
$contacts = mysql_query($query_contacts, $service) or die(mysql_error());
Fig. 3.11 Tabelul cu mesajele primite de către utilizatori
În acest formular la fiecare mesaj sunt oferite 2 acțiuni: vizualizare și ștergere. (Fig.3.11) Pagina de vizualizare selectează datele din tabela contacts după identificatorul pasat prin URL cu ajutorul următorului script:
$query_contacts = "SELECT * FROM contacts WHERE id='" . $_GET['id'] . "'";
$contacts = mysql_query($query_contacts, $service) or die(mysql_error());
Această pagină mai conține un link construit dinamic pentru a putea răspunde foarte repede la mesajul venit din partea clientului:
<a href="mailto:<?php echo $row_contacts['email'];?>" style="float:right;">Raspunde</a>
Acest link deschide automat cititorul de email prestabilit și creează un mesaj nou către utilizatorul din partea căruia este mesajul. (Fig 3.12.)
Fig. 3.12. Mesaj în pagina de vizualizare
III.6.3 Sistemul de servicii
Acest sistem este compus din mai multe pagini care respectă modul CRUD (Create, Read, Update, Delete), adică în acest sistem avem toate acțiunile cele mai comune utilizate asupra bazelor de date.
Pagina de citire este compusă dintr-o interogare în baza de date asupra tabelei services și o buclă ciclică do while care preia datele și le afișează într-un tabel care astfel devine dinamic, după cum se poate observa în figura de mai jos:
Fig. 3.13 Tabelul cu serviciile oferite clienților
În această pagina mai este afișata și o imagine care este upload-ată prin formularul de adăugare. Scriptul care realizează afișarea dinamică a imaginii este următorul:
<td><img src="<?php echo image_resize($row_services['image'], '../images/services/', '50', '50');?>" /></td>
Acest script apelează o funcție care redimensionează imaginea și ne returnează locația acesteia pentru a putea afișa imaginea respectivă redimensionată.
Fig. 3.14 Formularul de adăugare al unui serviciu nou
Pagina de adăugare, pe lângă introducerea datelor în tabela services, mai execută un upload pe server, adică mută imaginea din formularul HTML într-un dosar predefinit de pe serverul nostru local.(Fig. 3.14.)
Codul PHP care salvează imagine și o introduce în baza de date este următorul:
if($form_validates == true) {
$image = $_FILES['image']['name'];
if(is_uploaded_file($_FILES['image']['tmp_name'])) {
move_uploaded_file($_FILES['image']['tmp_name'], '../images/services/' . $image);
$insertSQL = sprintf("INSERT INTO services (name, short_content, content, image, created) VALUES (%s, %s, %s, %s, %s)",
GetSQLValueString($_POST['name'], "text"),
GetSQLValueString($_POST['short_content'], "text"),
GetSQLValueString($_POST['content'], "text"),
GetSQLValueString($image, "text"),
GetSQLValueString(date('Y-m-d H:i:s'), "date"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error());
header('Location: services.php');
}
}
Cu ajutorul instrucțiunii header administratorul este redirecționat înapoi către pagina services.php unde mai are la dispoziție pagina de editare și o acțiune PHP care șterge pe lângă înregistrarea din baza de date prin utilizarea instrucțiunii delete și o ștergere fizică a unui fișier utilizând instrucțiunea unlink, trimițând ca parametru calea către fișier și numele acestuia:
@unlink('../images/services/' . $row_service['image']);
III.6.4 Sistemul de categorii
Din această pagină se pot gestiona toate categoriile magazinului online. Vizualizarea se realizează într-un tabel HTML care afișează date din baza de date în rândurile sale cu ajutorul unei bucle ciclice „do while”, care iterează peste datele extrase de instrucțiunea php „select” din tabela „categories”. Pagina mai oferă încă 2 acțiuni: cea de ștergere și cea de adăugare. Acțiunea de editare are loc în altă pagină denumită „category_edit.php”.
Fig. 3.15 Pagina de gestiune a categoriilor
Adăugarea este realizată prin extragere dintr-un formular HTML a numelui categoriei și inserarea informațiilor în tabela categories prin instrucțiunea SQL „insert into” în pagina category_add.php. Fiecărei categorii îi este alocat un indicator dupa care se face o selecție în baza de date pentru a construi meniul principal din front-end.
Editarea categoriilor se realizează prin apelarea instrucțiunii SQL „update” în loc de „insert_into”, iar fomularul construit pentru această acțiune are câmpurile populate cu date din baza de date. Formularul și acțiunea de actualizare se realizează pe baza id-ului categoriei pasat prin URL de link-ul de editare din pagina „categories.php”.
Fig. 3.16 Formular de editare categorie
III.6.5 Sistemul de produse
Sistemul de gestiune al produselor este foarte complex, deoarece aceasta trebuie să gestioneze nu doar produsele, ci și specificațiile acestora, cât și imaginile și categoriile de care aparațin produsele.
Sistemul de gestiune a produselor a fost gândit ca să fie cât mai simplu de utilizat, cât și destul de bine structurat și logic, încât oricine să poată adăuga un produs cât mai eficient, după cum se obsevă în figura de mai jos:
Fig. 3.17 Formular de adăugare produs
Odată produsul adăugat administratorul va fi redirecționat utilizând instrucțiunea header înapoi pe pagina products.php
Fig. 3.18. Tabel de afișare produse
Pentru a adăuga imagini și specificații, a edita produsul sau a-l șterge, trebuie doar urmărite link-urile puse la dispoziție în tabelul de mai sus. Link-urile sunt generate dinamic de PHP și fiecare duce la o altă pagină unde se pot realiza acțiuni asupra produsului respectiv:
<td align="center"><a href="product_image.php?id=<?php echo $row_products['id']; ?>" class="admin_action"><img src="../images/icons/plus.png" /></a></td>
Ștergerea unui produs duce la ștergerea tuturor datelor despre acesta, cât și a imaginilor și specificațiilor acestuia cu ajutorul scriptului următor, care după o interogare în baza de date în tabela images după identificatorul produsului, execută într-o buclă o ștergere automată a fișierelor de pe server din dosarul products . Alte ștergeri se execută și în tabela specifications și products utilizând tot identificatorul produsului:
if ((isset($_GET['id'])) && ($_GET['id'] != "") && isset($_GET['action']) && ($_GET['action'] =="delete")) {
$query_images = "SELECT * FROM images WHERE product_id = '" . $row_products['id'] . "'";
$images = mysql_query($query_images, $service) or die(mysql_error());
$row_images = mysql_fetch_assoc($images);
$totalRows_images = mysql_num_rows($images);
do {
@unlink('../images/products/' . $row_images['name']);
} while($row_images = mysql_fetch_assoc($images));
$deleteSQL = sprintf("DELETE FROM products WHERE id=%s",
GetSQLValueString($_GET['id'], "int"));
$Result1 = mysql_query($deleteSQL, $service) or die(mysql_error());
$deleteSQL = sprintf("DELETE FROM images WHERE product_id=%s",
GetSQLValueString($_GET['id'], "int"));
$Result2 = mysql_query($deleteSQL, $service) or die(mysql_error());
$deleteSQL = sprintf("DELETE FROM specifications WHERE product_id=%s",
GetSQLValueString($_GET['id'], "int"));
$Result3 = mysql_query($deleteSQL, $service) or die(mysql_error());
header('Location: products.php');
}
Adăugarea de imagini este realizată în pagina „product_image.php”, unde cu ajutorul unui tabel și unui formular de adăugare se pot gestiona imaginile unui produs în cel mai simplu și mai eficient mod posibil.
Imaginea este adăugată dintr-un formular special care preia fișierul și îl trimite prin metoda $_POST la un script PHP care îl copiază în directorul products din dosarul images de pe server.
În pagina gestionării imaginilor mai sunt prezente 2 acțiuni, una de ștergere a imaginii și alta de a schimba o anumită imagine în imagine principală afișat în lista produselor sau în pagina de detaliu a imaginilor.
Fig. 3.19 Sistem de gestiune a imaginilor unui produs
Transformarea imaginii în imagine principală se realizează prin schimbarea câmpului „main_img” din 0 în 1. În primul rând, toate imaginile sunt setate pe 0, apoi imaginea trimisă de administrator prin identificatorul ei este setată pe 1 acțiuni efectuate cu ajutorul instrucțiuni SQL „update” de următorul script:
if((isset($_GET['image_id'])) && ($_GET['image_id'] != "") && isset($_GET['action']) && ($_GET['action'] == "main")) {
$updateSQL = sprintf("UPDATE images SET main_img=%s WHERE product_id=%s AND main_img=%s",
GetSQLValueString(0, "int"),
GetSQLValueString($_GET['id'], "int"),
GetSQLValueString(1, "int"));
$Result1 = mysql_query($updateSQL, $service) or die(mysql_error());
$updateSQL = sprintf("UPDATE images SET main_img=%s WHERE id=%s",
GetSQLValueString(1, "int"),
GetSQLValueString($_GET['image_id'], "int"));
$Result1 = mysql_query($updateSQL, $service) or die(mysql_error());
header('Location: product_image.php?id='.$_GET['id']);
}
Specificațiile produselor sunt gestionate din pagina „product_specifications.php”, această pagină este ușor de folosit datorită faptului ca 3 dintre acțiunile CRUD se regăsesc direct pe această pagină: afișarea, ștergerea și adăugarea din formularul pus la dispoziție după tabela construită dinamic cu ajutorul buclei do while, după cum se observă în figura de mai jos:
Fig. 3.20 Sistem de gestiune al specificațiilor unui produs
Afișarea este realizată într-un tabel HTML care oferă două link-uri, unul de editare și unul de ștergere. Editarea se realizează în altă pagină „product_specification_edit.php” prin pasarea id-ului specificației la o interogare sql „select” care afișează rezultatele într-un formular de editare.
Ștergerea este efectuată în aceeași pagină și se execută prin utilizarea instrucțiunii SQL „delete”:
if ((isset($_GET['id'])) && ($_GET['id'] != "") && isset($_GET['action']) && ($_GET['action'] =="delete")) {
$deleteSQL = sprintf("DELETE FROM specifications WHERE id=%s",
GetSQLValueString($_GET['id'], "int"));
$Result1 = mysql_query($deleteSQL, $service) or die(mysql_error());
header('Location: product_specifications.php?id='.$_GET['product_id']);
}
III.6.6 Sistemul de comenzi
Reprezintă un sistem de pe care se pot lua informațiile necesare trimiterii comenzii către solicitant în cel mai simplu și expeditiv mod posibil.
Fig. 3.21. Pagina sistemului de gestionare a comenzilor
Pagina execută o interogare în tabela „orders” de unde își ia informațiile principale despre o comandă trimisă pe site. Datele sunt apoi afișate cu ajutorul construcției php „echo” într-un tabel HTML. În acest tabel este extras și afișat și numele utilizatorului care a făcut comanda cât și statutul care este afișat vizual prin 3 iconițe de stare, comandă neplatită și comanda platită și terminată și comanda ștearsă. (Fig.4.21.)
Scriptul care generează dinamic acest tabel HTML calculează și totalul comenzii printr-o serie de calcule foarte rapide:
$order_amount = 0;
do {
$query_amount = "SELECT * FROM products WHERE id='" . $row_order_products['product_id'] . "'";
$amount = mysql_query($query_amount, $service) or die(mysql_error());
$row_amount = mysql_fetch_assoc($amount);
$totalRows_amount = mysql_num_rows($amount);
$order_amount = $order_amount+($row_order_products['quantity']*$row_amount['price']);
} while ($row_order_products = mysql_fetch_assoc($order_products));
Cele mai importante acțiuni disponibile sunt schimbarea statutului din 0 în 1 sau 2 a comenzii care reprezintă 0 – comandă neplatită, 1- comandă platită și terminată, 2 – comandă ștearsă și cea de vizualizare a detaliillor care afișeză și datele personale ale clientului ca adresa și email-ul în pagina detaliilor reconstruindu-se și coșul de cumpărături creat inițial de către client și care arată astfel:
Fig. 3.22 Pagina de comandă a unui utilizator afișată administratorului
III.6.7 Sistemul de programări
Sistemul de programări este constituit dintr-o pagină HTML appointments.php care afișează toate programările efectuate în front-end, executând o interogare în tabela appointments. Aceste date sunt mai apoi afișate într-un tabel HTML generat dinamic de o buclă ciclică do while.
Fig. 3.23 Pagina programărilor la service
Din această pagină se pot vizualiza programările și se pot marca ca începute, efectuate și/sau șterse.(Fig.3.23.) Aceste acțiuni se regăsesc în pagina noastră și sunt efectuate de scriptul următor care actualizează un câmp denumit status din tabela appointments de pe 0 – nou, pe 1 – inceput, pe 2 terminat, pe 3 – șters.
$updateSQL = sprintf("UPDATE appointments SET status=%s WHERE id='" . $_GET['id'] . "'",
GetSQLValueString(1, "int"),
GetSQLValueString($_GET['id'], "int"));
$Result1 = mysql_query($updateSQL, $service) or die(mysql_error());
header('Location: appointments.php');
Pagina de detaliu mai conține și un formular de trimitere mesaje la utilizatori, aceștia vor primi mesajele odată ce vor fi autentificați în front-end. Formularul este constituit doar de un input de tip textarea și de un buton de confirmare de trimitere. Formularul trimite datele variabilei $_POST, iar scriptul PHP următor execută inserarea în tabela mesages a datelor trimise din formular:
if((isset($_POST["add_message"])) && ($_POST["add_message"] == "form1")) {
$form_validates = true;
$validate_message = validate_empty($_POST['message']);
if($form_validates == true) {
$insertSQL = sprintf("INSERT INTO messages (appointment_id, user_id, message, created) VALUES (%s, %s, %s, %s)",
GetSQLValueString($row_appointment['id'], "int"),
GetSQLValueString($_SESSION['Auth']['id'], "int"),
GetSQLValueString($_POST['message'], "text"),
GetSQLValueString(date('Y-m-d H:i:s'), "date"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error());
header('Location: appointment_edit.php?id='.$_GET['id']);
}
}
Codul PHP face o redirecționare pe aceeași pagină actualizând și un script care afișează mesajele trimise de către administrator, cât și de către utilizator.(Fig.3.24)
Fig. 3.24 Pagina de vizualizare a programării unui utilizator
Codul sursă este următorul:
<h2>Mesaje</h2>
<?php if($totalRows_messages != 0) { ?>
<?php $i = 1; ?>
<?php do { ?>
<?php $query_user_message = "SELECT * FROM users WHERE id='" . $row_messages['user_id'] . "'";
$user_message = mysql_query($query_user_message, $service) or die(mysql_error());
$row_user_message = mysql_fetch_assoc($user_message);
$totalRows_user_message = mysql_num_rows($user_message);?>
<h3>#<?php echo $i;?> <?php echo $row_user_message['name']?> a scris</h3>
<p><?php echo $row_messages['message']?></p>
<p style="border-top: 1px solid #000;"> </p>
<?php $i++;?>
<?php } while ($row_messages = mysql_fetch_assoc($messages));?>
<?php } else { ?>
<p style="margin:0 0 25px 0;">Inca nu aveti nici un mesaj!</p>
<?php } ?>
III.7 Front-end
Prima pagină a aplicației este index.php, în această pagină este afișat meniul principal, o parte centrală cu un link spre pagina de programări, o altă parte care oferă o descriere a serviciilor, (fig.3.25a) și footer-ul inteligent, care arată ultimele 4 produse adăugate din back-end (fig.3.25b)
Fig. 3.25a Pagina principală și descrierea serviciilor pe front-end
Fig. 3.25b Footer-ul inteligent
Codul sursă care afișează această parte execută o interogare în tabela services pe baza instrucțiunii select și afișează datele astfel extrase într-o buclă ciclică do while.
III.7.1 Produse
Sistemul de produse funcționează în felul următor, categoriile sunt afișate în meniurile Desktop și Laptop, fiecare link este extras din baza de date și afișat de următorul cod:
$query_category_1 = "SELECT * FROM categories WHERE main = 0 ORDER BY name ASC LIMIT 20";
$category_1 = mysql_query($query_category_1, $service) or die(mysql_error());
$row_category_1 = mysql_fetch_assoc($category_1);
$totalRows_category_1 = mysql_num_rows($category_1);
Fig. 3.26 Meniul principal pe front-end
<?php do { ?>
<li><a href="category.php?id=<?php echo $row_category_1['id']?>"><?php echo $row_category_1['name']?></a></li>
<?php } while($row_category_1 = mysql_fetch_assoc($category_1));?>
Link-ul astfel creat ne duce la o listă de produse din categoria plăci de bază (fig.3.27) care conține imaginea produsului, numele produsului sub forma de link, descrierea principală, prețul și 2 link-uri, unul de adăugare direct în coșul de cumpărături și unul care ne va duce la o pagină de detaliu a produsului selectat.
Fig. 3.27 Pagina de vizualizare a categoriei de produse selectate
Afișarea tuturor acestor detalii se realizează cu ajutorul următorului cod:
$query_products = "SELECT * FROM products WHERE category_id = '" . $_GET['id'] . "'";
<?php do { ?>
<div class="product">
<?php $query_image = "SELECT * FROM images WHERE product_id = '" . $row_products['id'] . "' AND main_img = 1";?>
<a href="product.php?id=<?php echo $row_products['id']; ?>"><img src="<?php echo image_resize($row_image['name'], 'images/products/', 100, 100);?>" class="left" /></a>
<h4><a href="product.php?id=<?php echo $row_products['id']; ?>"><?php echo $row_products['name']?></a></h4>
<p><?php echo substr($row_products['description'], 0, 100);?></p>
<a href="product.php?id=<?php echo $row_products['id']; ?>" class="more_info">Vezi produs</a>
<a href="cart.php?id=<?php echo $row_products['id']; ?>" class="more_info">Adauga in cos</a>
<p style="font-weight:bold;">Pret: <?php echo $row_products['price'];?></p>
<div style="clear:both;"></div>
</div>
<?php } while ($row_products = mysql_fetch_assoc($products)); ?>
Pagina de detaliu a fiecărui produs afișează imaginea principală, cât și imaginile secundare ale produselor, descrierea completă, prețul, link de adăugare în coș, cât și specificațiile complete. (fig 3.28)
Codul sursă care face toate acestea este unul simplu, dar foarte rapid afișând pagina extrem de repede, acest lucru este extrem de important atât pentru rating-ul google cât și pentru satisfacția utilizatorului. Link-ul de adăugare în coș arătând astfel:
<a href="cart.php?id=<?php echo $row_product['id']; ?>" class="cart_button">Adauga in cos</a>
Fig. 3.28 Pagina de vizualizare a unui produs cu linkul de adăugare în coșul de cumpărături
III.7.2 Contact
Pagina de contact crează o legatură directă între clienți și administratorii aplicației, oferindu-le acestora un formular HTML în care clienții pot să scrie tot ce doresc.(Fig.3.29) Codul HTML al formularului arată astfel:
<label for="name"> <span>Nume</span><input type="text" name="name" id="name" value="<?php echo $_POST['name']; ?>"></label>
<?php if(isset($validate_name) && !is_bool($validate_name)) { ?>
<br />
<?php echo $validate_name; ?>
<?php } ?>
Fig. 3.29 Formularul de contact al utilizatorului
Cu ajutorul unui script PHP se execută inserarea în baza de date în tabela contacts utilizând instrucțiunea SQL insert.
"INSERT INTO contacts (name, email, subject, message, created) VALUES (%s, %s, %s, %s, %s)"
III.7.3 Programări
Pagina de programări ne oferă un formular de adăugare a unei programări în service-ul nostru. Câmpurile formularului sunt următoarele:
Fig. 3.30 Formularul de programare al utilizatorului
Cea mai importantă facilitate a acestei pagini, pe lângă cea evidentă, posibilitatea de a realiza o programare în service, este aceea că scriptul realizează automat crearea unui cont, generarea unei parolei și trimiterea detaliilor de conectare prin email clientului care tocmai și-a lăsat email-ul în formularul nostru. Scriptul este unul complex și arată în felul următor:
$generated_password = substr('2y5tr23hxr5278c' . $_POST['username'] . date('m-d-Y-a-g-h-i-s'), 8, 10);
"INSERT INTO users (group_id, username, password, name, phone, address, city, county, created) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)"
$user_id = mysql_insert_id();
"INSERT INTO appointments (user_id, description, created) VALUES (%s, %s, %s)"
$to = $_POST['username'];
$subject = $_POST['name'].' – Cont 24 service';
$message ='Draga ' . $_POST['name'] . " \n " .
'In timp ce dumneavostra va faceati programarea ne-am permis sa va facem si un cont.' . " \n " .
'Cu acesta puteti urmari statutul reparatiei si binenteles daca doriti, puteti face si cumparaturi din oferta noastra bogata de produse.' . " \n " .
'Nume de utilizator: ' . $_POST['username'] . " \n " .
'Parola :' . $generated_password . " \n ";
$headers = "From: [anonimizat]\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/html; charset=utf-8\r\n" .
"Content-Transfer-Encoding: 8bit\r\n\r\n";
mail($to, $subject, $message, $headers);
Generarea parolei se realizează concatenând un șir unic de caractere cu numele de utilizator și cu data exactă până la secundă, șirul astfel obținut este scurtat la 8 caractere și criptat pentru introducerea în baza de date.
III.7.4 Contul meu
Sistemul contului unui utilizator este compus din 3 părți, un formular de actualizare a datelor, un formular de schimbare a parolei și link-ul de deconectare.
Editarea unui utilizator este realizată în pagina account.php unde pe baza sesiunii de autentificare sunt extrase datele utilizatorului și sunt afișate într-un formular HTML cu ajutorul instrucțiunii echo. (Fig.3.31)
Fig. 3.31 Formularul prin care utilizatorul își poate edita datele
Schimbarea parolei se desfășoară întocmai ca și la administratori, utilizând sesiunea de autentificare creată pentru a fi în totală siguranță.
Butonul de deconectare este un link care execută 3 instrucțiuni, pornește sesiunea PHP, resetează variabila globală $_SESSION și redirecționează utilizatorul pe pagina index.php. Totul se realizează prin acest cod:
session_start();
unset($_SESSION['Auth']);
header('Location: index.php');
III.7.5 Comenzi
O comandă de produs se realizează prin apăsarea butonului de comandă din paginile produsului sau categoriei. Acest link ne va duce la o pagină unde ne sunt prezentate atât produsele din coșul de cumpărături, cât și cantitatea lor, prețul per cantitate și prețul total. (Fig.3.32)
Odată finalizată comanda, un email este trimis la utilizator, iar comanda și produsele salvate în baza de date.
Fig. 3.32 Comanda utilizatorului detaliată
Emailul conține următorul cod:
$to = $_POST['username'];
$subject = $_POST['name'].' – Comanda 24 service' ;
$message ='Draga ' . $_POST['name'] . " \n " .
'Iti multumim pentru alegerea facuta' . " \n " .
'Cu acesta puteti urmari statutul comenzi in sectiunea utilizatorilor accesand link-ul de istoric comenzi.' . " \n ";
$message .= 'Plata se va face catre firma:<br />';
$message .= '<table><th>
<td>SC 24 service SRL</td>
<td></td>
</th><tr><td>Adresa: </td><td>Str. Republicii, Nr. 1, Bl. A5, Ap. 15</td></tr>
<tr><td>Telefon: </td><td>0789654321</td></tr>
<tr><td>IBAN: </td><td>RO78BTRLRONCRT4353634001</td></tr>
<tr><td>Banca: </td><td>Banca Transilvania</td></tr>
<tr><td>CUI: </td><td>RO4564567845</td></tr>
<tr><td>Nr Registrul comertului: </td><td>J9/3432/2004</td></tr>
</table><br />';
$message .= 'Va rugam sa mentionati la realizarea platii numarul de comanda: '.$row_orders['id'].'<br />';
$headers = "From: [anonimizat]\r\n" .
'X-Mailer: PHP/' . phpversion() . "\r\n" .
"MIME-Version: 1.0\r\n" .
"Content-Type: text/html; charset=utf-8\r\n" .
"Content-Transfer-Encoding: 8bit\r\n\r\n";
mail($to, $subject, $message, $headers);
Acest email ține locul de factură proformă, este formatat în HTML și poate fi plătit menținând un cod unic extras direct din baza de date, care este defapt identificatorul comenzii.
Sesiunea de cart, mai precis produsele și cantitatea lor este salvată cu ajutorul unei bucle ciclice mai speciale, bucla foreach. Codul sursă care execută inserarea în baza de date este următorul:
foreach($_SESSION['Cart'] as $product_id => $quantity) {
$query_products = "SELECT * FROM products WHERE id = '" . $product_id . "'";
$insertSQL = sprintf("INSERT INTO orders_products (order_id, product_id, quantity) VALUES (%s, %s, %s)", GetSQLValueString($row_orders['id'], "int"), GetSQLValueString($row_products['id'], "int"),
GetSQLValueString($quantity, "int"));
$Result1 = mysql_query($insertSQL, $service) or die(mysql_error());
}
Comenzile pot fi urmărite, în pagina de istoric comenzi, unde se regăsește un tabel construit dinamic, asemănător cu tabelul administratorului, dar lipsind link-urile de modificare statut comandă. Interogarea SQL extrage datele din tabela orders și le afișează într-o tabelă HTML construită dinamic,după cum se observă în figura de mai jos:
Fig. 3.33 Istoricul de comenzi al utilizatorului
Sistemul de comenzi mai are și o pagină de detaliu unde este reconstruit coșul de cumpărături al utilizatorului în momentul în care acesta a finalizat comanda.
III.7.6 Service
Pagina de vizualizare a programărilor la service oferă un tabel (Fig.3.34) în care se pot vizualiza date despre programarea curentă, statusul programării, un link spre o pagină de detaliu care conține și sistemul de mesaje descris și la partea de back-end prin care clientul și cel care repară componenta lăsată în service pot să comunice foarte ușor.
Fig. 3.34 Pagina utilizatorului de vizualizare a programărilor efectuate
$query_appointment = "SELECT * FROM appointments WHERE id='" . $_GET['id'] . "'";
$query_user = "SELECT * FROM users WHERE id='" . $row_appointment['user_id'] . "'";
$query_messages = "SELECT * FROM messages WHERE appointment_id='" . $row_appointment['id'] . "'";
<?php do { ?>
<?php $query_user_message = "SELECT * FROM users WHERE id='" . $row_messages['user_id'] . "'";?>
<h3>#<?php echo $i;?> <?php echo $row_user_message['name']?> a scris</h3>
<p><?php echo $row_messages['message']?></p>
<p style="border-top: 1px solid #000;"> </p>
<?php $i++;?>
<?php } while ($row_messages = mysql_fetch_assoc($messages));?>
Pagina de detaliu execută o interogare în baza de date în tabela appointements pe baza identificatorului programării. Dupa această interogare se extrag și date despre administratorul care răspunde la întrebările clientului, cât și mesajele postate de către client și administrator. Aceste interogări sunt efectuate cu ajutorul instrucțiunii SQL select, iar datele sunt afișate într-o buclă ciclică do while cu ajutorul instrucțiunii echo.
Concluzii
Aplicația de față a fost creată cu ajutorul unor tehnologii web și limbaje de programare avansate, care se folosesc pe scară largă în crearea de pagini și aplicații web. Aceste tehnologii pe lângă larga lor răspândire beneficiază și de un alt atu imbatabil, sunt gratuite.
Acest lucru totuși nu le face mai greu de utilizat sau mai nesigure, din cauza ca sunt dezvoltate ca open-source sunt foarte sigure, la codul lor sursă intervenind o mulțime de oameni, acest fapt elimină orice posibilitate de rea voință din partea unora.
PHP-ul este unul din cel mai răspândit limbaj de programare, aflându-se pe locul 5 în clasamentul TIOBE și este în urcare față de anul trecut.
MySQL este o bază de date foarte utilizată la nivel mondial fiind una dintre cele mai rapide și mai sigure baze de date din lume.
Aceste fapte demonstrează că se pot construi aplicații software foarte ieftin din punct de vedere al investiției în aplicații și limbaje de programare, ceea ce scade costul de producție și exploatare a aplicației.
Magazinul online astfel va putea aduce profit din primele luni, iar creșterea de awareness datorată promovării online a service-ului de componente va fi extrem de benefică și va conduce rapid la creșterea profiturilor.
Într-adevăr, magazinul mai poate suferi câteva îmbunătățiri în timp, dar acestea nefiind vitale funcționarii acestuia:
Schimbarea pluginului de mail pe unul mai puternic
Crearea de paginări la produse
Oferirea de mijloace de transport al produselor
Oferirea posibilității plăților online prin abonarea la un provider de soluții bancare.
Introducerea unui sistem de plată securizat online ar fi ridicat costul lucrării cu 600 RON sau 2000 RON în funcție de pachetul ales. Cu oricare din pachetele alese se pot efectua plăți cu toate tipurile de carduri existente pe piață: Visa, Visa Electron, MasterCard, Maestro și se pot efectua plăți utilizând serviciul PayPal.
Diferențele între cele două pachete sunt: la pachetul mai scump există posibilitate plății în valută: euro, dolari și lire sterline; plățile se pot efectua prin homebaking , inclusiv de la banca Transilvania , BCR sau ING, comisioanele sunt mai mici , apare o taxa lunară de ~ 120 ron .
Am ales această temă deoarece intenționez să folosesc acest site pentru a-mi crea o firma de depanare produse IT și consider că acest site îmi va fi de un real folos în promovarea, bunul mers al firmei mele și al relației cu clienții.
După ce voi crea firma , voi opta pentru sistemul de plată online care ar aduce un plus vânzărilor și rating-ului firmei.
Bibliografie
[1] Jason Cranford Teague, DHTML and CSS for the World Wide Web, Editura Peachpit Press, 2001
[2] Cristian Darie, Emilian Balanescu, Beginning PHP and MySQL E-Commerce:From Novice to Professional, Editura Springer, 2008
[3] Elisabeth Freeman,Eric Freeman, Head first HTML with CSS & XHTML, Editura O'Reilly Media, Inc., 2002
[4] Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre, Programming PHP, Editura O'Reilly Media, Inc., 2006
[5] Kevin McArthur, Pro PHP:patterns, frameworks, testing and more, Editura Apress, 2008
[6] Eric A. Meyer, CSS:the definitive guide, Editura O'Reilly Media, Inc., 2006
[7] Chuck Musciano, Bill Kennedy, HTML and XHTML, the definitive guide, Editura O'Reilly Media, Inc., 2002
[8] Patrick O'Neil, Elizabeth O'Neil, Database–principles, programming, and performance, Editura Morgan Kaufmann, 2001
[9] John V. Petersen, Absolute beginner's guide to databases, Editura Que Publishing, 2002
[10] Thomas A. Powell, HTML:the complete reference, Editura Osborne/McGraw-Hill, 2001
[11] Dagfinn Reiersøl, Marcus Baker, Chris Shiflett, PHP in Action:objects, design, agility, Editura Manning, 2007
[12] Peter Rob, Carlos Corone, Database Systems:Design, Implemetation, and Management, Editura Cengage Learning, 2007
[13] George Schlossnagle, Advanced PHP programming, Editura Sams Pub., 2004
[14] Andy Oppel,Robert Sheldon, Trammell, Ethan Marcotte, Dunstan Orchard, Todd Dominey, SQL: a beginner's guide, Editura Springer, 2008
[15] David Sklar, Learning PHP, Editura O'Reilly Media, Inc., 2004
[16] David Sklar, Adam Trachtenberg, PHP cookbook, Editura O'Reilly Media, Inc., 2006
[17] Andrew Stopford, PHP programming for Windows, Editura Sams Publishing, 2002
[18] Toby J. Teorey, Sam Lightstone, Tom Nadeau, Database modeling & design: logical design, Editura Academic Press, 2006
[19] www.apachefriends.org
[20] http://ro.wikipedia.org/wiki/Apache_%28server%29
[21] http://www.php.net./
[22] http://ro.wikipedia.org/wiki/PHP
[23] http://en.wikipedia.org/wiki/SQL
[24] http://en.wikipedia.org/wiki/Adobe_Photoshop
[25] http://www.eclipse.org/
Bibliografie
[1] Jason Cranford Teague, DHTML and CSS for the World Wide Web, Editura Peachpit Press, 2001
[2] Cristian Darie, Emilian Balanescu, Beginning PHP and MySQL E-Commerce:From Novice to Professional, Editura Springer, 2008
[3] Elisabeth Freeman,Eric Freeman, Head first HTML with CSS & XHTML, Editura O'Reilly Media, Inc., 2002
[4] Rasmus Lerdorf, Kevin Tatroe, Peter MacIntyre, Programming PHP, Editura O'Reilly Media, Inc., 2006
[5] Kevin McArthur, Pro PHP:patterns, frameworks, testing and more, Editura Apress, 2008
[6] Eric A. Meyer, CSS:the definitive guide, Editura O'Reilly Media, Inc., 2006
[7] Chuck Musciano, Bill Kennedy, HTML and XHTML, the definitive guide, Editura O'Reilly Media, Inc., 2002
[8] Patrick O'Neil, Elizabeth O'Neil, Database–principles, programming, and performance, Editura Morgan Kaufmann, 2001
[9] John V. Petersen, Absolute beginner's guide to databases, Editura Que Publishing, 2002
[10] Thomas A. Powell, HTML:the complete reference, Editura Osborne/McGraw-Hill, 2001
[11] Dagfinn Reiersøl, Marcus Baker, Chris Shiflett, PHP in Action:objects, design, agility, Editura Manning, 2007
[12] Peter Rob, Carlos Corone, Database Systems:Design, Implemetation, and Management, Editura Cengage Learning, 2007
[13] George Schlossnagle, Advanced PHP programming, Editura Sams Pub., 2004
[14] Andy Oppel,Robert Sheldon, Trammell, Ethan Marcotte, Dunstan Orchard, Todd Dominey, SQL: a beginner's guide, Editura Springer, 2008
[15] David Sklar, Learning PHP, Editura O'Reilly Media, Inc., 2004
[16] David Sklar, Adam Trachtenberg, PHP cookbook, Editura O'Reilly Media, Inc., 2006
[17] Andrew Stopford, PHP programming for Windows, Editura Sams Publishing, 2002
[18] Toby J. Teorey, Sam Lightstone, Tom Nadeau, Database modeling & design: logical design, Editura Academic Press, 2006
[19] www.apachefriends.org
[20] http://ro.wikipedia.org/wiki/Apache_%28server%29
[21] http://www.php.net./
[22] http://ro.wikipedia.org/wiki/PHP
[23] http://en.wikipedia.org/wiki/SQL
[24] http://en.wikipedia.org/wiki/Adobe_Photoshop
[25] http://www.eclipse.org/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Proiectarea Unei Aplicatii Informatice Hibrid Intre Un Magazin Online Si Pagina de Primire a Clientilor Unui Service de Componente Electronice (ID: 150238)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
