Extensii Platforma WordPress
1. Introducere
Dezvoltarea acestui template WordPress își propune explicarea si înțelegerea modului de lucru in domeniul de design web.
Platforma WordPress este una din cele mai utilizate platforme de bloging dar si de dezvoltare a website-urilor complexe fiind utilizata de peste 10 milioane de website-uri.
Lucrarea își propune să ofere soluții în ceea ce privește:
Dezvoltarea template-urilor WordPress
Explicarea modului de dezvoltare
Normalizarea bazei de date
Sarcinile necesare realizării acesteia au fost împărțite în sarcini legate de designul template-ului, crearea propriu zisa a codului și sarcini de găsirea și implementarea unei soluții pentru normalizarea bazei de date.
Printre avantaje mai amintim:
mobilitate – utilizatorii au acces la date de la orice calculator conectat la internet
vizibilitate – datele pot fi publicate pentru a informarea utilizatorii
siguranță – datele sunt salvate într-o bază de date și datorită mecanismelor de backup nu pot fi pierdute
Această lucrare este structurată în trei capitole:
Capitolul I – Introducere
Capitolul conține o scurtă descriere a aplicației, prezentând principalele argumentele care au dus la abordarea acestui template și începerea dezvoltării acestui proiect.
Capitolul II – Fundamente Teoretice
Acest capitol urmărește prezentarea soluțiilor alese pentru dezvoltarea aplicației.
Sunt incluse informații legate de:
procesul de dezvoltare al unui proiect – fazele dezvoltării, concepte și tool-uri care să permită dezvoltarea (SVN, Linux Server)
dezvoltare bazelor de date – noțiuni de limbaj SQL, tehnici de proiectare și utilizare a bazelor de date relaționale, MYSQL, MYSQL Workbench
dezvoltare web – concepte folosite în dezvoltarea web, HTML, HTML5, CSS, CSS3, Javascrip, AJAX, PHP
Capitolul III – Aplicație
Capitolul conține prezentarea tuturor aspectelor legate de realizarea practică a proiectului propus.
Sunt incluse informații legate de:
concepte și detalii de implementare referitoare la proiectarea și funcționalitatea oferită de baza de date
arhitectura și deciziile luate pentru respectarea într-o manieră cât mai eficientă a cerințelor
tehnici folosite pentru implementarea funcționalității server side (PHP)
concepte folosite pentru crearea unei interfețe plăcute, intuitive și aerisite
2. Fundamente Teoretice
Acest capitol își propune să prezinte tehnologiile utilizate și principiile care au fost urmate pentru dezvoltarea aplicației și are ca scop furnizarea unui suport tehnic minim necesar înțelegerii lor.
2.1 Principii de dezvoltare web
Pentru construirea unui produs trebuie urmat un proces care să conducă la un rezultat satisfăcător pentru utilizator. La fel se întâmplă și în construirea unui produs software, unde putem vorbi despre un „proces de dezvoltare”.
Există mai multe modele pentru definirea modului și a fazelor de dezvoltare a unui produs software printre care amintim:
modelul cascadă – definește un proces de dezvoltare secvențial
modelul prototip – rezolvă problemele de rigiditate ale modelului cascadă, este creat
și lansat un prototip, către client, pentru o înțelegere mai bună a cerințelor
modelul incremental – cerințele sunt împărțite în incremente care sunt dezvoltate
separat
model iterativ – proiectul este împărțit în iterații care sunt livrate separat
metode agile – îmbină modelul iterativ cu cel incremental
Definirea unui model de dezvoltare aduce proiectului stabilitate, control și dă posibilitatea unei mai bune organizări a activităților necesare dezvoltării.[Pre04]
Elementele care definesc acest proiect sunt: acceptabilitatea, fiabilitate, eficiența și flexibilitate. Este foarte important să îndeplinească într-o manieră intuitivă cerințele utilizatorului, să ofere încredere utilizatorului, să nu folosească inutil resursele sistemului și nu în ultimul rând, să fie adaptabil la schimbări.[Mar10]
2.1.1 Modele de dezvoltare web
Așa cum am menționat, există mai multe modele de dezvoltare. Fiecare model are atât avantaje cât și dezavantaje. Alegerea sau adaptarea unui model se face în concordanță cu necesitățile proiectului. Definim un model pentru a avea o serie de pași care vor fi urmați în dezvoltarea aplicației și pentru a avea o privire de ansamblu asupra modului de dezvoltare.
În prezent, cele mai folosite modele au la bază metodele de dezvoltare agile. Acestea presupun dezvoltarea în cicluri (iterativ) și împărțirea în porțiuni/seturi de funcționalități (incremental). Avantajul primordial al metodelor agile este că încurajează flexibilitatea și răspunsul rapid la schimbare. Principiile care stau la baza acestui tip de metode au fost definite în „The Agile Manifesto” [Ken01] publicat în Februarie 2001 și sunt:
prioritatea numărul unu este satisfacerea clientului prin livrarea rapidă și continuă
implementarea schimbărilor necesare chiar și în fazele finale ale dezvoltării
livrare frecventă de actualizări
colaborarea zilnică între dezvoltatori și client
motivarea developărilor prin încrederea acordată și satisfacerea nevoilor acestora
promovează dezvoltarea durabilă
atenție continuă la concept și design
încurajează simplitatea
cele mai bune arhitecturi, cerințe și modele vin de la o echipa self-organized
la intervale regulate echipa reflectă asupra lucrurilor care nu au mers bine și încearcă să găsească soluții pentru eficientizare și îmbunătățire
Fig. 1 – Model dezvoltare integrativă si incrementală
Din Fig. 1 observam faptul că orice nouă cerință poate fi introdusă și prioritizată imediat pentru a fi implementată. Cerințele sunt mai apoi analizate și sunt create diverse funcționalități care trebuie implementate. După clarificarea și definirea funcționalităților echipa începe creare de concepte și design pentru implementare.
Procesul de implementare se termină atunci când software-ul devine funcțional și este pregătit pentru testare. Sunt evaluate rezultatele obținute după care modulele finalizate sunt livrate clientului.
Având în vedere că aplicația care se dorește a fi dezvoltată trebuie să implementeze ultimele norme legislative, adaptabilitatea este unul dintre criteriile cele mai importante în alegerea unui model de dezvoltare. Necesitățile administratorilor (principalii utilizatori) sunt multiple și independente ceea ce permite dezvoltarea și livrarea separată a funcționalităților. Toate aceste lucruri conduc către alegerea unui model de dezvoltare bazat pe metode agile.
2.2 Aplicații Web
Internetul sau World Wide Web are o influenta din ce în ce mai mare în viața oamenilor. Este folosit pentru socializare, pentru divertisment, pentru informare, pentru cumpărături și pentru multe alte lucruri. Oamenii își petrec din ce în ce mai mult timp pe internet, iar pentru a satisface nevoile lor simple website-uri s-au transformat în aplicații web complexe dezvoltate de mii de programatori.
O aplicație web este orice aplicație care folosește un browser web pentru a fi rulată pe partea de client. Acest fapt constituie și avantajul principal al unei astfel de aplicații, dezvoltatorul nefiind nevoit să creeze o platformă pentru rularea aplicației pe partea de client.
În prezent aplicațiile web se bazează tot mai mult pe arhitecturi dezvoltate pe partea de client în timp ce serverul este folosit pentru transferul și stocarea de informație.
Aplicațiile web pot fi folosite de un număr infinit de utilizatori fără ca aceștia să fie nevoiți să le configureze sau instaleze la ei pe calculator.
2.2.1 Sisteme de versionare/gestionare a codului
Având în vedere ca proiectele actuale au un grad ridicat de complexitate, este evident faptul că nu pot fi dezvoltate de un singur om. în dezvoltarea unui software sunt implicați mai mulți oameni. Aceștia au nevoie de acces la fișierele proiectului și lucrează simultan cu ele. Pentru a rezolva aceste probleme de sincronizare au fost create sistemele de versionare.
Cele mai folosite astfel de tool-uri sunt: Git, Apache Subversion(SVN), Concurent Versions System(CVS) și Mercurial.
Git sistem de versionare distribuit dezvoltat de Linus Torvalds. Are la baza un concept diferit fata de SVN și CVS axat pe îmbunătățirea vitezei. Accesul la istoricul fișierelor poate fi făcut offline, iar operațiile de branching sunt bine implementate. Nu este făcut pentru echipe de dezvoltare formate din putini oameni, se folosește în general în produse open- source.
SVN a fost creat ca o alternativa pentru CVS cu scopul de a rezolva probleme acestuia. Este un sistem mai nou și s-a investit destul de mult timp în design și arhitectură. A fost îmbunătățit sistemul de branching și au fost create plugin-uri pentru mai multe IDE ceea ce îl face ușor de folosit. încă mai prezintă unele probleme la redenumirea fișierelor și viteză.
CVS este un sistem de versionare apărut din anii 80 și este folosit atât pentru uz comercial cât și pentru dezvoltarea proiectelor open source. Printre avantajele acestuia amintim faptul că este folosit de foarte mult timp și a ajuns la o anumită maturitate tehnologică care oferă stabilitate. Dezavantajul principal îl constituie faptul ca mutatul și redenumirea fișierelor duce la pierderea versionării.
Mercurial a fost lansat în aceeași perioada cu Git-ul și a fost dezvoltat în mare parte în Python. Deși este un sistem de versionare distribuit are unele caracteristici comune cu SVN ceea ce îl face mai ușor de folosit decât Git-ul. Problemele apar atunci când avem fișiere modificate simultan de doi sau mai mulți useri, neavând un suportul solid pentru merging. [McC11]
2.2.2 Baze de date
Bazele de date au apărut odată cu nevoia aplicațiilor de a lucra cu un volum ridicat de date. Bazele de date sunt colecții de date organizate în așa fel încât efortul pentru căutare să fie minim.
Acestea pot fi de mai multe tipuri:
baze de date ierarhizate – utilizează structura arborescenta pentru salvarea informației
baze de date orientate pe obiecte – informația este stocata sub forma de obiecte
baze de date xml – datele sunt păstrate în format xml
baze de date relaționale – structurează informația în tabele
Bazele de date relaționale sunt cele mai populare și folosite în prezent. Acest model a fost dezvoltat de Edgar Codd în anul 1969. Oferă posibilitatea unei metode declarative pentru selectarea datelor. Bazele de date relaționale reprezintă o colecție de tabele legate între ele prin relații. Rândurile dintr-o tabela se numesc tupluri, iar coloanele atribute. O relație reprezintă un set de tupluri care au aceleași atribute. Există trei tipuri de operații: select, join și project. Prin operația de select sunt preluate date, prin operația de join sunt combinate operații, iar prin operații de proiect sunt identificate atribute. Pe lângă aceste trei operații mai sunt implementate și operațiile standard: insert, delete și update.[Teo11]
Cel mai mare avantaj al acestui tip de baze de date este că implementează un limbaj de tip SQL care este ușor de înțeles și folosit. Prin faptul că datele sunt salvate în tabele și că există relații între tabele, utilizatorul are o privire de ansamblu asupra modului în care sunt stocate datele ceea ce îl ajută în crearea unor interogări eficiente. Bazele de date relaționale implementează un sistem bine definit pentru securitate ele oferă funcționalități precum atribuirea de privilegii unui anumit set de utilizatorii. Conceptele de relaționare oferă un nivel ridicat de performanta și stabilitate.[Teo11]
Pentru a manipula bazele de date relaționare se folosesc „relational database management system” (RDBMS). Aceste sisteme pun la dispoziția dezvoltatorului toate mecanismele necesare pentru organizarea și întreținerea bazei de date.[Oak11]
Printre aceste servicii amintim:
sincronizează accesul simultan a mai multor dezvoltatori la baza de date
implementează un limbaj de interogare
oferă mecanisme de securitate pentru accesul la date
oferă servicii pentru salvarea sau refacerea bazei de date
MySQL este cel mai popular RDBMS open-source. Acest grad de popularitate se datorează atât performanței cât și stabilității. Prin intermediul InnoDB storage engine MySQL oferă setul de caracteristici ACID (atomicity, consistency, isolation, durability) utilizatorilor. Atomicity se referă la faptul că datele nu sunt modificate pana când tranzacția nu este completă, dacă o parte din tranzacție eșuează, întreaga tranzacție eșuează, datele rămânând neschimbate. Orice date scrise în baza de date sunt trecute prin regulile existente pentru validate, această caracteristică se numește consistency. Conceptul de isolation se referă la faptul ca nici o tranzacție nu trebuie să influențeze alta tranzacție. Acest lucru este realizat prin mecanismele de sincronizare la nivel de rând. Durability se refera la faptul ca atunci când o tranzacție s-a încheiat datele vor rămâne stocate.
Storage engine-ul InnoDB permite utilizarea cheilor străine. O cheie străina (foreign key) reprezintă un atribut într-o tabela care referă o cheie primară dintr-o altă tabelă. Prin scrierea corectă a operațiilor de join, folosind chei primare și chei străine, se poate obține o îmbunătățire semnificativă a performanței de căutare. Acest lucru se datorează atât algoritmilor de optimizare implementați de InnoDB pentru acest tip de căutare cât și faptului că în tabela referită căutarea se va face după o cheie primară.
Printre caracteristicile oferite de MySQL amintim:
operații de join foarte rapide optimizate prin nested-loop join
serverul MySQL funcționează pe majoritatea sistemelor de operare (Linux, Windows, etc.)
este conceput pentru arhitecturi multi-threaded
serverul rulează ca un program separat putând fi accesat de mai mulți utilizatori chiar și prin rețea
pune la dispoziție un număr mare de tipuri de date precum: float, double, blob, date, time, year, set
operațiile și funcțiile funcționează în clauze select și where
pot fi create rutine (funcții) și triggere
oferă mecanisme de criptare
oferă suport pentru baze de date mari – peste 200000 tabele și 5000000000 rânduri
Dezvoltatorul are la dispoziție și mecanisme prin intermediul cărora poate adăuga funcționalitate direct pe baza de date. Un astfel de mecanism sunt triggerele care permit adăugarea de funcționalitate la executarea de tranzacții pe tabele. Acestea pot fi folosite atât pentru verificarea valorilor care sunt inserate cât și pentru efectuarea de diverse operații. Un trigger poate fi activat atunci când avem o tranzacție de Insert, Delete sau Update pe o tabelă în MySQL triggerele pot fi executate atât înainte cât și după ce tranzacția a luat sfârșit. Utilizatorul are acces atât la datele existente cât si la modificări prin operatorii NEW si OLD. [Mys12]
În sprijinul utilizatorilor, MySQL vine cu tool-ul Workbench care oferă o interfața grafică pentru lucrul cu serverul MySQL. Acest tool are trei secțiuni importante:
Secțiunea de SQL Developement permite conectarea la o baza de data oferind utilizatorului posibilitatea de a configura tipul de conexiune. îi dă acestuia posibilitatea de a executa comenzi SQL sau de a avea acces, prin intermediul interfeței grafice, la datele sau erorile returnate. Prin intermediul acestei secțiuni utilizatorul poate modifica structura tabelelor, poate vedea, introduce sau selecta date din tabele.
Secțiunea Data Modeling dă posibilitatea utilizatorului să creeze modele grafice ale bazei de date. Utilizatorul poate adăuga în schemă tabele și relații prin acțiuni drag and drop. Poate adăuga coloane în tabele și seta tipuri de date pentru acestea, poate adăuga și seta privilegii pentru utilizatori sau chiar diferite constrângeri. Pe lângă toate aceste lucruri, modul oferă posibilitatea generării scripturilor SQL pentru crearea unei baze de date care implementează modelul proiectat.
Secțiunea server administration permite controlul asupra configurațiilor setate pentru serverul MySQL.
Toate cele menționate mai sus au dus la alegerea MySQL pentru stocarea datelor. MySQL Workbench a fost de un real folos atât în dezvoltarea și proiectarea bazei de date cât și în administrarea acesteia.
2.2.3 Normalizarea bazelor de date
Eficiența unei baze de date depinde foarte mult de felul în care aceasta este proiectată. Având în vedere ca discutăm despre o baza de date relațională, în proiectarea acesteia trebuie urmate principii care să exploateze la maxim optimizările oferite de storage engine și RDBMS.
Primul pas în proiectare unei baze de date constă în analizarea cu atenție a cerințelor și datelor care trebuie păstrate. Pentru a realiza acest lucru dezvoltatorul trebuie să înțeleagă contextul în care sunt utilizate datele. Astfel el va avea o privire de ansamblu asupra necesităților de stocare.
Al doilea pas este designul logic al bazei de date. Acest pas constă în crearea unei scheme, ER (entity-relationship) sau UML, care să conțină modele pentru tabele și relațiile dintre acestea.
Pentru a realiza schema logica dezvoltatorul analizează datele rezultate din prima etapa, le grupează în tabele și le asignează tipuri de date. După finalizarea acestui proces sunt adăugate relațiile pe tabele.
Pentru a elimina elementele redundante, se verifică dacă tabelele satisfac sau nu cele trei forme normale. Acest proces se numește normalizare.
După ce designul este complet se poate trece la generarea tabelelor și crearea propriu-zisă a bazei de date.
Cele mai importante criterii de măsurare a performantei unei baze de date relaționale sunt viteza și spațiul pe care un set de date îl ocupă pe disk. Ambele caracteristici sunt în strânsă legătură cu felul în care este proiectata baza de date, iar o proiectare corecta poate duce la îmbunătățiri semnificative.
Performanta unei baze de date nu consta doar in resursele hardware puse la dispoziție de cel care oferă hosting-ul serverului MySQL. Aceasta depinde si de optimizările făcut la adresa structurii bazei de date. Procesul de optimizare a bazei de date se numește normalizare si presupune mai multe etape care trebuie parcurse de dezvoltator pentru a reduce cantitate datelor redutante din sistem.
In cele ce urmează se va prezenta procesul de normalizare împreună cu etapele si rezultatele fiecărei etape.
Normalizare a bazei de date este procesul de organizare atributele și tabelele bazei de date relaționale pentru a minimiza redundanța datelor.
Normalizarea presupune descompunerea unui tabel în tabele mai puțin redundante (și mai mici), dar fără a pierde informații; definirea chei străine din tabelul vechi referire la cheile primare ale celor noi.
Obiectivul este de a izola date, astfel încât adăugiri, eliminări, și modificări ale unui atribut poate face într-un singur tabel și apoi propagate prin restul bazei de date folosind tastele externe definite.
Edgar F. Codd, inventatorul modelului relațional (RM), a introdus conceptul de normalizare si ceea ce știm acum ca prima forma normala (1NF) în 1970. Codd a continuat pentru a defini al doilea forma normală (2NF ) și a treia formă normală (3NF) în 1971. Codd și Raymond F. Boyce definit Boyce-Codd Normal Formularul (BCNF) în 1974.
Informal un tabel bază de date relațională este adesea descrisă ca "normalizat" dacă este în a treia Normal Formularul. Cele 3NF sunt libere de anomalii inserare, actualizare și ștergere.
Un exemplu tipic de normalizare este că ID-ul unic unei entități sunt stocate peste tot în sistem, dar numele său este deținut într-o singură masă. Numele poate fi actualizat cu mai multă ușurință într-un rând de o masă. O actualizare tipic într-o astfel de exemplu ar fi compania RIM schimba numele în BlackBerry, iar această actualizare se va face într-un singur loc și imediat corect "BlackBerry" nume va fi afișat în întregul sistem.
Fără normalizare, devine dificil să se ocupe și să actualizeze baza de date, fără a se confrunta pierderi de date. Inserția, actualizarea și ștergerea anomaliilor sunt foarte frecvente în cazul bazei de date care nu este normalizată. Pentru a înțelege aceste anomalii să luăm un exemplu de tabelul urmator:
Pașii urmați in normalizare:
Anomalii de actualizare: pentru a actualiza adresa un student care are loc de două ori sau mai mult decât de două ori într-un tabel, va trebui să actualizeze coloană S_Adresă în toate rândurile, date altceva să devină incompatibile.
Anomalii de inserare: Să presupunem că pentru un nou admitere, avem un id Student (S_Nr), numele și adresa unui elev, dar în cazul în care elev nu a optat pentru subiecte încă atunci trebuie să introduceți NULL acolo, ceea ce duce la inserție anomalie.
Anomalii de ștergere: Dacă (S_Nr) 401 are un singur subiect și temporar el scade, atunci când ștergeți acel rând, întreaga înregistrare student va fi șters împreună cu ea.
Etapele normalizării:
Prima forma normala (1NF)
A doua forma normala (2NF)
A treia forma normala (3NF)
Prima forma a normalizării (1NF)
In prima formă a normalizării nu trebuie sa existe două rânduri de date si trebuie sa conțină un grup repetat de informații. Fiecare coloană trebuie sa aibă o valoare unică, astfel încât sa nu apară pe același rând. Fiecare tabel trebuie organizat in rânduri, iar fiecare rând trebuie sa conțină o cheie primară unică.
Cheia primară este de obicei o singură coloană, dar uneori mai mult de o coloană, pentru a fii combinate in vederea de a crea o singură cheie primară. De exemplu, iau în considerare un tabe in care nu este în primul rând forma normală.
Tabel elevi:
Forma normalizată spune ca orice rând nu trebuie să aibă o coloană în care mai mult de o valoare este salvată, separată de virgule, trebuie să separe aceste date în mai multe rânduri.
Tabelul de elevi rezultat in urma aplicării primei etape a normalizării (1NF)
Folosind prima forma normala, crește redundanța datelor, deoarece nu vor fi multe coloane cu aceleași date în mai multe rânduri, dar fiecare rând ca un întreg va fi unic.
A doua forma a normalizării (2NF)
În a doua formă normalizări nu trebuie să existe nici o dependență parțială de orice coloană pe cheia primară. Acest lucru înseamnă că pentru un tabel care a concatenat cheie primară, fiecare coloană în tabel, care nu este parte a cheii primare trebuie să depindă întreaga cheia concatenată pentru existența sa. Dacă orice coloană depinde numai de o parte a cheii concatenate, nu se produce a doua forma a normalizării.
În exemplul primei forme de normalizare există două rânduri de Robert, pentru a include mai multe materii pentru care a optat. În timp ce acest lucru este căutat, si urmează prima forma a normalizării, este o utilizare ineficientă a spațiului. De asemenea, în tabelul de mai sus a primei forme de normalizare, cheia desemnata este Elev si Vârsta, dar depinde numai de coloana Elev, ceea ce este incorect pentru a doua formă de normalizare. Pentru a realiza a doua formă de normalizare, ar fi util de a împărți în subiectele într-un tabel independent, folosind nume de studenți ca si chei externe.
Tabelul de elevi rezultat in urma aplicării celei de a doua etape a normalizării (2NF)
In tabelul de elevi cheia desemnata va fii Elev pentru ca celelalte coloane (Ex: Vârsta) depinde de coloana Elev.
Noul tabel de elevi rezultat in urma aplicării celei de a doua etape a normalizării (2NF)
In tabelul de mai sus cheia va fii pe coloanele Elev si Materie, iar ambele tabele de mai sus sunt rezultatele aplicării a celei de a doua forme a normalizării..
A treia forma a normalizării (3NF)
In a treia forma de normalizare se urmărește eliminarea redundantei datelor din tabel.
Tabel detalii elevi:
În acest tabel Nr_Elev este cheia primară, dar coloanele: Adresa, Oraș și Județ depinde de coloana Cod Poștal . Dependența dintre coloana Cod Poștal și celelalte coloane se numește dependență tranzitiva. Prin urmare, pentru a aplica cea de a treia forma de normalizare (3NF), avem nevoie pentru a muta coloanele: Adresa, Oraș și Județ într-un nou tabel, cu „Cod Poștal” ca si cheie primară.
Tabelul elevi cu cheia primara „Cod Poștal”
Tabelul cu adresa elevilor:
Avantajul acestei forme de normalizare este: scăderea conținutului duplicat si integritatea datelor obținute.
2.3 Serverele Web
Accesul la aplicațiile web se face prin rețea, de cele mai multe ori aceasta fiind internetul, dar poate să fie și o rețea de tip intranet sau orice alte tip de rețea locală. Orice aplicație web are o parte de server care este găzduită pe un server web și rulează pe acesta și o parte de client care este executata de browser-ul web. Pentru a deschide o pagina web utilizatorul, prin intermediul browser-ului, cere partea de client a aplicației dorite. Protocolul cel mai des folosit pentru accesul la informație web este Hypertext Transfer Protocol sau HTTP.
Un server web este format din hardware-ul pe care rulează, un sistem de operare, un server HTTP care să ofere acces la aplicație și diverse alte software-uri necesare implementării funcționalităților aplicație.
Partea de hardware este aleasa în funcție de numărul de utilizatori pentru care este destinată aplicația și totodată de resursele necesare pentru rulare. Hardware-ul trebuie îmbunătățită odată cu creșterea numărului de utilizatori deci deciziile vor fi luate pe parcurs, în funcție de succesul aplicației.
Sistemele de operare pentru servere sunt concepute în așa fel încât să ofere acces mai multor utilizatori, să ruleze aplicații business și să ruleze aplicații care să aibă acces la rețea. Ca atare, accentul unor astfel de sisteme cade pe securitate și stabilitate, nu pe interfața cu utilizatorul.[Wik10]
Caracteristicile care definesc astfel de sisteme sunt:
flexibilitate și tehnici avansate pentru interacțiunea cu rețelele
tehnici și software pentru backup a datelor
mecanisme avansate pentru securitate și user rights
posibilitatea de a fi reconfigurate și updatate fără restart
posibilități de automatizare (ex: posibilitatea rulării de programe la anumite intervale de timp)
În prezent exista mai multe astfel de software printre care amintim: Windows Server, Mac OS X Server și diverse distribuții de linux open-source.
Unul dintre cele mai folosite sisteme de operare pentru servere este Ubuntu Server. Acesta distribuție este ușor de instalat și întreținut. Ea oferă soluții pentru integrarea diverselor servicii open source existente. Este un sistem stabil care mărește securitate prin posibilitatea de acordare de drepturi pentru grupuri de utilizatori. Oferă suport pentru integrarea soluțiilor pentru servere HTTP, pentru accesul securizat prin rețea și pentru accesul la sistemul de fișiere din alte sisteme de operare. Toate aceste lucruri precum și faptul ca este o distribuție gratuita au dus la alegerea Ubuntu.
Accesul online la server este un lucru foarte important deoarece permite monitorizeze și controlul fără a fi nevoie de acces fizic. Aplicația OpenSSH oferă servicii de conexiune și criptare a comunicării dintre server și user. Exista mai multe metode care pot fi folosite pentru criptarea fluxului de informație. Unul dintre cei mai sigur algoritmi pentru criptare este algoritmul RSA. Acesta presupune generarea a doua chei: o cheie publicare care este ținuta pe server și o cheie privata pentru user. Puterea sa de criptare se bazează pe procesul de factorizare al întregilor. Momentan nu există un algoritm pentru extragerea întregilor din numerele mari. [Gag03]
Interacțiunea dintre browser și server se face prin protocolul HTTP. Aplicațiile care oferă suport pentru acest tip de comunicare se numesc Servere HTTP. Prin scripting languages programatorul are posibilitatea de a controla informațiile furnizate de serverele HTTP.
Apache este cel mai cunoscut și folosit server HTTP, iar majoritatea distribuțiilor de linux, precum și Ubuntu, îl includ sau oferă suport pentru instalarea acestuia. Structura Apache este modulară ceea ce permite atât adăugarea cu ușurința a unor noi funcționalități cât și scoaterea celor neutilizate. Oferă suport SSL și se caracterizează prin stabilitate și viteză. Dacă este configurat corect poate suporta un nivel ridicat de trafic. [Sta05]
2.3.1 Aplicația web server-side
Atunci când vorbim de tehnici de programare server-side ne referim la cod scris pentru a fi executat de serverul web. Scripturile server-side sunt executate atunci când un utilizator face un request către server. Utilizatorii nu au acces la codul sursa de pe server, ei primind rezultatul obținut în urma executării unui astfel de script. Exista mai multe limbaje de programare în care poate fi scris codul server-side. Printre acestea amintim: PHP, ASP.NET, JSP, Ruby, etc.
Cel mai popular limbaj de programare server-side este PHP. Acesta este folosit de peste doua zeci de milioane de website-uri. Inventatorul PHP este Mr. Rasmus Lerdorf care în anul 1995 a lansat prima versiune.
Printre caracteristicile care fac acest limbaj atât de popular sunt: familiaritatea, simplitatea, eficiența, securitatea și flexibilitatea.
Sintaxa este una familiară și permisiva. Acest lucru se datorează faptului ca limbajul împrumuta caracteristici de sintaxa de la limbaje precum C. Este unul dintre cele mai eficiente limbaje server-side. Implementează mecanisme de alocare a resurselor, iar variabilele pot fi transmise și accesate prin referințe. [Wik12]
Unul dintre cele mai importante aspecte de care trebuie ținut cont atunci când programăm pagini web este securitatea. Atunci când vine vorba de securitate este foarte important ca programatorul să nu aibă încredere în informația pe care o primește de la utilizator.
Pentru a păstra informații despre un anumit utilizator atunci când se trece de la o pagina la alta programatorul are la dispoziție variabilele de sesiune. Atunci când un utilizator vizitează un site și accesează o pagina care inițializează o sesiune, acestuia îi va fi atribuit automat un identificator unic numit SID. Pe server va fi creat automat un fișier în care sunt salvate datele sesiunii, iar browser-ul va primi SID-ul atribuit. După inițializare, la fiecare acces, browser-ul va trimite SID-ul serverului pentru verificare. Problemele de securitate apar atunci când un atacator fura SID-ul unui utilizator și încearcă să se folosească de acesta pentru a obține informații. O soluție pentru această problemă este ca SID-ul să fie regenerat de fiecare data când utilizatorul accesează o alta pagina.
Cookie-urile sunt date care sunt ținute de către browser pe calculatorul utilizatorului. Având în vedere ca acestea se regăsesc pe calculatorul client, programatorul nu trebuie să aibă încredere în informația stocată deoarece poate fi oricând modificata de un atacator. Cookie-urile sunt folosite pentru a da posibilitatea utilizatorilor de a rămâne autentificați chiar și după ce închid browser-ul sau pentru a păstra diferite opțiuni setate de către utilizatori. Limbajul PHP oferă opțiuni atât pentru crearea și distrugerea cookie-urilor cât și pentru resetarea sau setarea unui timp de expirare.
Având în vedere ca majoritatea arhitecturilor moderne sunt bazate pe principii object oriented și limbajul PHP oferă suport pentru programarea orientata pe obiecte.
Printre proprietățile object oriented oferite de PHP amintim:
modificatori de acces private, public și protected
operator new pentru crearea de noi obiecte
constructor și destructor prin __construct și __destruct
proprietăți de moștenire simpla, prin operatorul extends
operatorul „::” oferă acces la proprietățile statice și constante, oferă posibilitatea de a
suprascrise metode sau referențiate obiecte precum seif, parent și static
operatorii static și abstract
folosirea interfețelor prin operatorii interface și implements
suprascrierea poate fi implementată prin intermediul metodelor __call și __calIStatic care sunt executate atunci când este apelata o metodă inexistenta
operatorul final care face ca o metodă sau clasă să nu mai poată fi extinse
Pe lângă aceste proprietăți a căror implementare este foarte apropriată de alte limbaje de programare orienta pe obiecte precum Java și C++, limbajul PHP oferă și lucruri specifice. Compararea între doua obiecte se face automat, comparându-se valorile atributelor. Prin operatorul „===” programatorul poate verifica dacă variabilele refera același obiect.
Prin serializare obiectele sunt transformate în șiruri de caractere. în cazul în care un obiect este pus într-o variabila de sesiune, acesta va fi serializat automat, iar atunci când este re-inițializată o sesiune obiectele vor fi deserializat automat. înainte de serializare este apelata metoda sleep (atunci când ea exista). La fel se întâmplă și cu metoda wakeup care este apelată la deserializare.
Chiar dacă PHP nu suportă mecanisme de moștenire multiplă, acest limbaj pune la dispoziție așa numitele „traits”. Prin intermediul operatorilor trait și use programatorul poate să creeze seturi de metode și să le adauge unei clase.
Pentru definirea claselor și pentru a evita liste lungi de incluziuni la începutul uni script PHP, a fost creat un concept de autoloading. Prin intermediul funcției spl_autoload_register pot fi apelate funcții care să includă clasele necesare.
Unul dintre cele mai folosite tipuri de date în PHP sunt array-urile. Implementarea acestora este una generica de forma cheie => valoare. Cheile pot fi un întreg sau un sir de caractere, iar valorile pot fi orice alt tip PHP. Array-urile permit implementarea de vectori, matrice, cozi, stive, liste și alte tipuri de șiruri de elemente. PHP oferă și suport necesar pentru a lucra cu acest tip de date prin funcții pentru adăugarea de elemente, ștergerea, sortarea, afișarea, etc.
Prin intermediul metodelor GET și POST, partea de client a aplicației, poate trimite date colectate de la utilizator către server pentru a putea fi procesate. Aceste date pot fi accesate prin intermediul variabilelor globale $_POST și $_GET. Diferența dintre cele doua tipuri de metode este că atunci când este folosit GET utilizatorul poate vedea în URL datele care sunt trimise către server.
JSON sau JavaScript Object Notation este un tip pentru reprezentarea datelor. Acest tip este foarte folosit deoarece este ușor de înțeles de oameni, iar costurile pentru a genera sau scoate elemente dintr-un astfel de tip sunt mici. El a apărut ca și un tip specific JavaScript dar poate fi implementat în orice alt limbaj.
Formatul este unul simplu, un JSON fiind declarat între acolade, iar elementele sale sunt formate din tipuri chei:valoare ({"nume":"Alex", "varsta":21}). Acest tip este foarte util atunci când vrem să trimitem date între limbaje diferite de programare (ex: de la partea de client la server). La fel ca și PHP arays, un JSON are ca și cheie un sir de caractere sau un întreg, iar ca valoare orice alt tip de date, putând fi chiar și un alt JSON. Pentru a veni în ajutorul dezvoltatorului PHP pune la dispoziție funcții pentru crearea și decodarea unor astfel de tipuri de date. Metodele folosite sunt: json_encode și json_decode.[Mac11]
Având în vedere faptul ca orice aplicație moderna lucrează cu un volum mare de date, iar dimensiunile memoriei RAM sunt limitate, aceste date trebuie stocate pe dispozitive de tip bloc sau alte dispozitive care oferă capacități mari de stocare la un preț redus. Așa cum a fost discutat în secțiunile anterioare, pentru a stoca aceste informații avem nevoie de baze de date și implicit de comunicare între aplicație și baza de date. Limbajul PHP oferă trei librarii pentru interacțiunea cu baza de date. Avem librăria originara MySQL prin intermediul căreia putem avea acces procedural la baza de date, aceasta nu oferă suport pentru programarea orientata pe obiecta. Ea este considerata învechita și va fi scoasa din uz în viitor. Librăria PDO_MySQL oferă doar suport orientat pe obiecte pentru conectarea la baza de date. Printre avantaje avem faptul ca este ușor de migrat la o alta baza de date, iar printre dezavantaje avem faptul că nu oferă suport pentru ultimele funcționalități oferite de MySQL. Cea de-a treia librărie este MySQLI. Aceasta oferă atât suport orientat pe obiecte cât și suport procedural pentru interacțiunea cu baza de date. Totodată prin intermediul acestei librarii utilizatorul are acces la ultimele funcționalități MySQL.[PHP12]
2.3.2 Noțiuni de limbaj PHP utilizate pentru elaborarea aplicație
Limbajul Hypertext Procesor (abreviat PHP) este un limbaj de programare folosit la scara larga pentru a dezvoltare de pagini web dinamice dar si de aplicații web. Se folosește in principal înglobat în codul HTML, dar începând cu versiunea 4.3.0 se poate folosi si in mod „linie de comandă” CLI (command line interface/interpreter), permițând crearea de aplicații independente.
PHP-ul este simplu de utilizat fiind un limbaj de programare structurat la fel ca C-ul, Perl-ul sau chiar Java-ul, El este o combinație intre cele trei. Una din cele mai importante facilitate ale limbajului de programate PHP este conlucrarea cu majoritatea bazelor de date relaționale, MySQL pana la Oracle.
Aceste limbaj poate rula pe majoritatea sistemelor de operare, de la UNIX, Windows sau Mac OS X si poate interacționa cu majoritatea serverelor web. Codul PHP este interpretat de serverul web generând un cod HTML care este interpretat de browser-ul utilizatorului. Extensiile specific PHP-ului (.php, .php3, .ph3, .phtml etc.) sunt interpretate de către serverul web iar rezultatul este trimis in forma de text sau cod HTML către browser-ul clientului.
2.4 Aplicația web client-side
Prin tehnici de dezvoltare client-side înțelegem bucăți de cod sau scripturi care sunt rulate de pe calculatorul utilizatorului. În cazul aplicațiilor web vorbim despre scripturi care sunt rulate de către browser. Limbajul folosit în web developement pentru implementarea unor astfel de scripturi este JavaScript.
JavaScript este un limbaj creat de Netscape Communications Corporation și Sun Microsystems, Inc. în 4 Decembrie 1995 aceștia au lansat prima versiune a limbajului și totodată primul browser capabil să ruleze acest cod: Netscape Navigator 2.0. JavaScript a fost creat pentru a permite dezvoltatorului să adauge funcționalitate pe pagini.
Caracteristicile acestui limbaj sunt:
este un limbaj bazat pe obiecte. în JavaScript orice element excluzând cele trei tipuri predefinite este un obiect. Orice obiect poate conține alte obiecte sau variabile care definesc tipuri predefinite. Având în vedere ca funcțiile, DOM objects și toate celelalte elemente sunt obiecte, este evident faptul ca putem adăuga o funcție pe un DOM object.
bazat pe evenimente, funcțiile sunt executate atunci când au loc diverse evenimente cauzate de interacțiunea cu utilizatorul sau programate să se declanșeze după anumite perioade de timp
este un scripting language deoarece nu este nevoie să fie compilat, fiind interpretat direct de către browser
interacționează cu structura prin DOM objects
codul JavaScript poate fi inclus direct în fișierele structură html
În JavaScript programatorul nu este nevoit să declare variabilele. Asta nu înseamnă că acestea nu au un tip. Ele pot avea unul dintre cele trei tipuri predefinite: variabile booleene, numere sau șiruri de caractere sau pot fi declarate ca obiecte. Atunci când trimitem variabile ca parametru, acestea vor fi trimise prin valoare dacă conțin un tip primar și prin referința în cazul în care conțin un obiect. O variabila își poate schimba tipul în funcție de ce element îi este asignat. Aceste caracteristici fac din JavaScript un limbaj flexibil. [Har08]
JavaScript nu este un limbaj care să ofere suport pentru principalele tehnici object oriented, dar prin flexibilitatea lui, acesta oferă dezvoltatorului posibilitatea de a emula proprietăți object oriented și de a crea aplicații complexe bazate pe aceste principii.
Pentru a crea o clasa în JavaScript utilizatorul definește o funcție care este un obiect. Atunci când o funcție este apelata folosind operatorul new este creat automat un obiect nou și este apelat constructorul funcției care inițializează operatorul this și rulează codul existent în constructor. în JavaScript orice obiect poate moșteni proprietăți de la alt obiect. Atunci când este evaluata o expresie pentru a obține o proprietate a obiectului, JavaScript va căuta proprietatea în obiect, iar dacă nu o găsește va începe căutarea în obiectele prototype pana când găsește proprietatea cerută sau nu mai exista nici un obiect prototype. Obiectele prototype sunt setate automat prin constructor. Astfel atunci când dorim să adăugam metode claselor, pe obiectele function create vom adăuga funcții în obiectele prototype.
Ex:
function primaClasa() //am creat o clasa denumita prima clasa
{
}
//adăugăm funcției primaClasa metoda function prin intermediul obiectului prototype
primaClasa.prototype.method1 = function(){
this.var = “prima metoda”;
}
JavaScript nu oferă suport nativ nici pentru crearea de membri privați. Acest lucru poate fi emulat datorita faptului că variabilele sunt vizibile la nivel de funcție. Luând în considerare cele menționate mai sus, dacă declaram o variabila în interiorul constructorului aceasta va fi vizibila doar pentru funcțiile din clasa. [Pol10]
Mai exact:
function primaClasa ()
{
var variabilaPrivata = 7; /*scopul acestei variabile este doar în interiorul funcției ea neputând fi
accesata din exterior.*/
/*același lucru se întâmplă și atunci când declaram o funcție ca fiind o variabilă a constructorului, aceasta va fi privata și poate fi apelata doar din interiorul clasei*/
var functiePrivata = function(){
return variabilaPrivata * 2;
}
this.getVar = function() {
return functiePrivata();
}
}
Prin flexibilitate, JavaScript lasă posibilitatea programatorului să aleagă tipul de arhitectura si stilul de programare pe care îl dorește.
Crearea comunicării cu serverul fără a fi nevoie de reîncărcarea paginii se poate face prin AJAX sau Asynchronous JavaScript and XML. Această tehnică de programare dă posibilitatea programatorului să încarce sau să trimită doar datele de care utilizatorul are nevoie. Rezultatul evident este optimizarea transferului dintre partea de client și partea de server, de aici rezultând o viteza mai buna și un transfer redus.
JavaScript oferă suport pentru crearea, monitorizarea și lucrul cu request-urile AJAX. Prin aceste mecanisme programatorul poate trimite anumite date către partea de server, poate apela diverse scripturi sau programe din partea de server și bineînțeles are acces la răspunsul oferit de acestea.
Prin intermediul acestor caracteristici putem oferi utilizatorului o aplicație web care nu doar consumă mai puțin din resursele serverului și din conexiunea acestuia la internet ci și îi oferă o experiență apropriată de rularea unei aplicații pe calculatorul propriu. Acestea sunt caracteristicile definitorii pe care le dorim implementate de aplicația care stă la baza acestei lucrări.\
2.4.1 Structura si design web
HyperText Markup Language (HTML) este principalul limbaj folosit pentru afișarea paginilor web.
Elementele HTML sunt încadrare de paranteze unghiulare (<html>). Printre acestea amintim:
tag-uri pentru împărțirea documentului: <head>, <body>
tag-uri pentru titluri <h1>, <h2>, etc.
ancore <a>
<ul>, <ol> pentru liste neordonate sau ordonate
Elementele HTML vin în perechi și trebuie închise (</h1>, </a>, </ul> și </ol>). Exista și tag-uri, cunoscute ca etichete goale, care nu trebuie închise precum <img>.
In interiorul elementelor poate fi adăugat conținut care poate fi un text, un alt tag, comentarii sau alte tipuri de date.
Scopul unui browser web este de a citi documente HTML și a le compune în pagini web. Browser-ul nu afișează etichetele HTML, dar utilizează etichetele pentru a interpreta conținutul paginii. Acestea sunt interpretate sub formă de obiecte (DOM – document object model) cu diverse proprietăți și evenimente setate. Toate aceste elemente sunt stocate într-o structura arborescentă.
Prima varianta de standarde de codare HTML a apărut în anul 1994 și a purtat numele de HTML Level 2. Cu timpul, limbajul a fost dezvoltat si au apărut noi versiuni precum HTML 3.0,HTML 3.2, HTML 4.0, HTML 4.01 și cel mai recent HTML 5. Cea din urmă este denumită și Web Applications 1.0 și introduce un nou set de elemente care fac mult mai ușoara structurarea paginilor și oferă funcționalitate. Prin intermediul tag-urilor de forma <header>, <footer> este evitată crearea unor tag-uri <div> cu atribute <id> și <class>. Mai mult HTML5 oferă atributul source, pentru a include elementele audio sau video lăsându-i browser-ului posibilitatea de alegere a programului de redare.[Wik11]
Pentru a evidenția diferențele aduse de HTML5 este prezentată o secvență de cod scrisa in ambele variante:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<html> <head>
<head> <title>An HTML Document </title>
<title>An HTML Document </title> </head>
</head> <body>
<body> <div id=”header” class=”header">
<header> <hl> Numele paginii </hl>
<hl>Numele paginii</hl> </div>
</header> <div id="footer" class="footer mainpage”>
<footer> <p>Detalii despre website</p> </div>
<a>Detalii despre website</a>
</footer> </body>
</body> </html>
</html>
CSS(Cascading Style Sheets) – foi de stil în cascadă reprezintă un mecanism simplu prin care se poate îmbunătății prezentarea unei pagini HTML prin utilizarea unei game uriașe de valori.
World Wide Web Consortium(W3C) se ocupa cu gestionarea și standardizarea CSS: Pana în prezent au fost lansate trei versiuni:
CSS1 conține doar editări de baza cum ar fi fonturi, culori și spațiere ușor de folosit și înțeles
CSS2 a corectat multe erori și a adus câteva îmbunătățirii și expresii noi
prin CSS3 să făcut un salt major în posibilitatea de adăugare de design pe elemente prin selectori și proprietăți noi.
Sintaxa CSS pentru a atribui proprietăți unui element HTML este alcătuita din: selector, proprietate și valoare. Prin selectori designer-ul are posibilitatea de selectare a unor elemente sau grupuri de elemente din DOM pentru a le atribui proprietăți HXSS.[Duc11]
Printre proprietățile de stil puse la dispoziție de CSS amintim:
background: prin care se pot defini o serie de mai multe proprietăți cum ar fi culoare, poziție, imagine și repeat. Este o proprietate foarte folosită pentru a modifica aspectul unui site.
position: este poate una din cele mai importante proprietăți ale unui element HTML. Se pot selecta ca proprietăți "position:fixed"(setează poziția unui element în cadrul window-ului, poziția elementului nu este influențată de alte elemente), "position:absolute"(poziționează un element în elementul părinte), etc.
prin padding, border și margintin sunt setate proprietăților de spațierea ale unui element DOM.
Fig. 2 – Explicații Margin, Border, Padding, Content Area
Prin interpretarea codului CSS, browser-ul, adaugă proprietățile definite pe elemente de structură astfel dezvoltatorul putând crea pagini stilizate.[Sch06]
2.5 Tehnologii web moderne
In acest capitol sunt prezentate noțiuni de design web utilizând tehnologii precum HTML 5, CSS3 și JavaScript, necesare înțelegerii si dezvoltării acestui proiect.
2.5.1 Noțiuni de HTML5
HTML5 este un limbaj pentru structurarea și prezentarea conținutului pentru World Wide Web, o tehnologie nucleu pentru Internet propusă inițial pentru software-ul Opera. Este a cincea revizuire a standardului HTML (creat în 1990 și standardizat ca HTML4 din 1997) și din octombrie 2011 este în curs de dezvoltare. Obiectivele sale principale au fost acelea de a îmbunătăți limbajul cu un suport pentru cele mai recente apariții multimedia, în același timp menținându-l ușor de citit de către oameni și bine înțeles de către calculatoare și device-uri (navigatoare web, parsere, etc.). HTML5 își propune să însumeze nu numai HTML4, dar și XHTML1 și DOM2HTML (îndeosebi JavaScript).
HTML5 este un limbaj de marcare (markup language) care poate fi scris în oricare dintre sintaxele HTML sau/și XHTML. Acesta include modele detaliate de prelucrare pentru a încuraja mai multe implementări inter-operabile. HTML5 extinde, îmbunătățește și raționalizează disponibilitățile pentru documentele web, introduce marcarea și aplicațiile de tip API (application programming interfaces) pentru aplicații web complexe. Din aceste motive, HTML5 este un posibil candidat pentru aplicațiile de pe platformele mobile. Multe caracteristici ale HTML5 au fost create din considerarea ca acesta va rula pe dispozitive cum ar fi smart-phonurile sau tabletele.
HTML5, de asemenea, definește în câteva detalii prelucrările necesare pentru documentele invalide, astfel încât sintaxa erorilor va fi tratată uniform de toate navigatoarele cunoscute.
2.5.2 Noțiuni de CSS3
CSS sau Cascading Style Sheets (CSS) este un limbaj, standard, utilizat pentru descrierea modului în care un document HTML este afișat în fereastra navigatorului web. Cea mai frecventa utilizare a acestuia este la generarea interfeței grafice a paginilor web. Acesta a fost creat pentru a putea face separarea conținutului documentului de modul în care acesta este prezentat: incluzând aici font, culoare, imagini.
Separarea astfel creată permite o mai ușoara dezvoltare a paginii respective și un conținut de date transferat, mai mic. Acest lucru este posibil deoarece fișierul .css realizat este unul de sine stătător și astfel acesta poate deservi mai multe pagini în generarea respectivei interfețe de prezentare.
Structura unui fișier de tip .css constă în înlănțuirea mai multor descrieri de elemente, fiecare descriere conținând una sau mai multe proprietăți ale elementului descris. O astfel de descriere este exemplificata în cele ce urmează:
selector [, selector2, …] [:pseudo-class] {
property: value;
[property2: value2; …]
}
Fișierul rezultat în urma înlănțuirii mai multor astfel de descrieri este utilizat în cadrul unui fișier .html folosind următoarea linie de cod:
<link rel="stylesheet" href="http://example.com/css/style.css" type="text/css" />
Acesta de fapt constă în realizarea unei legături către locația fișierului respectiv, navigatorul web știind astfel locația de unde fișierul va trebui încărcat. La realizarea unui astfel de link este necesar de asemenea sa fie specificat tipul fișierului încărcat pentru a fi cunoscut modul în care acesta este interpretat de către navigator. În cazul unui fișier .css tipul specificat va fi text/css.
În cazul realizării unei pagini web se pot utiliza mai multe fișiere de tip .css funcție de structura aplicației și de elementele grafice folosite în fiecare pagina. Se realizează astfel o modularizare a fișierului .css.
2.5.3 Noțiuni de Java Script
Spre deosebire de HTML și CSS care sunt limbaje, standarde, utilizate pentru a descrie modul în care datele sunt reprezentate de către navigatorului web, JavaScript este un limbaj de programare utilizat pentru realizarea interacțiunii cu utilizatorul.
Cea mai des întâlnită utilizare a JavaScript este în animarea 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.
Navigatoarele web 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.
O tehnică de construire a paginilor web tot mai întâlnită în ultimul timp este AJAX, abreviere de la „Asynchronous JavaScript and XML”. Această tehnică constă în executarea de cereri HTTP în fundal, fără a reîncărca întreaga pagină web, și actualizarea numai anumitor porțiuni ale paginii prin manipularea DOM a paginii. Tehnica AJAX permite construirea unor interfețe web cu timp de răspuns mic, întrucât operația (costisitoare ca timp) de încărcare a unei pagini HTML complete este în mare parte eliminată. Această tehnică este adesea utilizată în aplicațiile web pentru dispozitive mobile datorită necesitații realizării unui trafic redus.
2.6 Platforma WordPress
WordPress-ul este o platformă de tip open-source, cu aplicații multiple in domeniul web. CSM-ul WordPress, (Content Management System) este dezvoltat in limbajul PHP folosind baze de date MySQL. Dispune un sistem de șabloane scrise în limbajele HTML și CSS. Se poate plia foarte ușor pe aproape orice tip de conținut, de la un simplu site de prezentare până la un magazin complex.
Numeroasele plugin-uri fac ca posibilă transformarea in aproape orice tip de site cu funcționalități multiple. Template-urile disponibile atât gratuit cât și contra cost cele premium fac ca interfața sa fie schimbată cu ușurință.
Platforma WordPress are de asemenea capacitatea de a atribui mai multe categorii de articole și sprijin pentru etichetarea de posturi și articole. Filtrele automate sunt de asemenea incluse, oferind formatarea standardizată de text în articol. WordPress-ul sprijină, de asemenea standardele Trackback și Pingback pentru afișarea link-uri către alte site-uri care s-au legate de un post sau un articol.
Platforma WordPress permite de asemenea editarea în HTML a paginilor și posturilor, folosind editorul vizual, sau folosind unul dintr-un număr mare de plugin-uri care permit o varietate de caracteristici de editare personalizate.
Instalarea acestui tip de platforma se face relatativ ușor folosind panoul de comanda al hosting-ului (Cpanel) sau prin FTP (descărcând in prealabil pachetul de instalare de la WordPress.org)
Platforma WordPress este concepută in așa fel încă poate a rulat de pe o singura instalare mai multe site-uri (WordPress Multisites) folosind tablele diferite din baza de date, dar și un număr utilizatori cu diferite drepturi pe platformă (WordPress Multi-User, WordPress MU, sau WPMU).
2.6.1 Module (Plugins)
Plugin-uri sunt programe (module) definite ca un set de una sau mai multe funcții, scrise de asemenea in PHP menite sa adauge funcționalități și caracteristici multiple platformei fără a mai fii nevoie de a aduce modificări platformei de bază. Se pot instala ușor din meniul „Plugins”. Multitudinea de plugin-uri gratuită este disponibila la scară largă, majoritatea fiind create de comunitatea web WordPress, iar cele premium fiind disponibile contra cost.
2.6.2 Template-uri (Themes)
Template-ul reprezintă interfața prin care utilizatorul intra in contact direct cu site-ul. Utilizatorii platformei WordPress au la dispoziție o multitudinea de template-uri atât gratuite cat și contra cost menite sa schimbe interfața și funcțiile oferite utilizatorului. Ele sunt concepute cu ajutorul limbajelor PHP cat și HTML și CSS. Se împart in două categorii, template-uri gratuite și template-uri premium. Se pot instala și comuta intre două sau mai multe template-uri din meniul „Appearence » Themes”.
2.6.3 Interfața Administrator
Interfața administratorului se compune din meniul de administrare care cuprinde:
Panoul de control (Dashboard) – Oferă o serie de instrumente prin care se pot adăuga pagini și posturi. De asemenea mai include și statistici referitoare la site, comentarii care așteptă aprobarea, link-uri către diferite posturi și pagini din site, fluxuri RSS de la WordPress, precum și ultimele update-uri ale platformei, template-urilor instalate sau plugin-urilor.
Articole (Posts) – Permite accesul lista de posturi publicate sau adăugarea de posturi noi. Mai oferă posibilitatea ordonării articolelor in funcție de titlu, data, ordine alfabetica etc., dar și ștergerea, editarea sau trecerea in modul „Draft” a posturilor dorite.
Media – Reprezintă meniul in care se găsesc, dar și adăuga imagini, fișiere audio/video cat și alt tip de fișiere. Acest meniu mai oferă și posibilitatea de administrare a conținutului de pe site (vizualizare/modificare/ștergere).
Pagini (Pages) – Oferă posibilitatea de adăugare a conținutului prin intermediul paginilor (de exemplu: “Contact”, “Portofoliu”, “Blog”, etc. )
Comentarii (Comments) – Permite administratorului sa răspundă sau de a modera comentariile utilizatorilor la conținutul site-ului. De asemenea permite controlul in scopul cenzurări anumitor cuvinte.
Aspect (Appearance) – Acest meniu permite personalizarea interfeței site-ului. Schimbarea template-ului, adăugarea de meniuri, băiri laterale, wideget-uri, antet, fundal etc.
Plugin-uri (Plugins) – Permite instalarea, activarea și modificarea plugin-urilor
Utilizatori (Users) – Face posibil management-ul utilizatorilor înregistrați, dar și schimbarea nivelului de acces pentru fiecare utilizator in parte.
Unelte (Tools) – Oferă posibilitatea de a importa și exporta conținutul site-ului.
Setări (Settings) – Permite accesul la setările generale alea site-ului.
3. Aplicație
Pe parcursul acestui capitol vor fi prezentate conceptele si modul de dezvoltare ale acestei aplicații. Aplicația constă in realizarea unui template fiind utilizat împreună cu platforma WordPress in vederea dezvoltării unui website
3.1 Descriere proiectare si realizare template-ului PROJECT
Pentru realizarea template-ului pentru platforma WordPress trebuie sa avem in vedere structura bazei de date a platformei. Este importanta înțelegerea structurii acesteia întrucât platforma oferă posibilitatea dezvoltatorilor de template-uri sa interacționeze cu baza de date prin crearea de noi tabele care sa extindă funcționalitățile ei integrând noi funcționalități necesare funcționarii template-ului.
Structura bazei de date WordPress 4.2.2 este cea din Fig. 3
Dintre tabelele prezentate în imaginea de mai sus nu toate contribuie la funcționarea template-ului. Tabelele cu care template-ul interacționează sunt wp_options si wp_term_taxonomy. Prin intermediul acestora dezvoltatorul poate stoca informații necesare template-ului pentru funcționarea sa corectă după instalare.
În tabela wp_options se vor stoca informațiile legate de configurare inițială a template-ului cat și ulterioară, configurare survenită ca urmare a interacțiunii utilizatorului cu platforma. Pentru realizarea template-ului dezvoltatorul trebuie să aibă în vedere o structură predefinită de directoare și fișiere care mai apoi să fie interpretate corect de către platformă.
WordPress oferă în acest sens o documentație vasta unde sunt explicate fișier cheie împreună cu rolul lor la randare. Dintre aceste fișiere cele mai importante sunt următoarele footer.php, header.php, sidebar.php, index.php, style.css. Alcătuirea finală a template-ului și randarea lui în browser se face prin punerea în comun a acestor fișiere astfel încât acestea vor realiza pagini cu funcționalității distincte.
Structura de baza a platformei WordPress este alcătuit din trei blocuri de bază: un antet, conținutul, și un subsol după cum se observa in Fig. 4. Fiecare dintre aceste blocuri este generat de un fișier php în directorul WordPress de pe server.
Fig. 4
Structura de baza a unui template WordPress este formată din:
Antetul conține toate informațiile de care are nevoie pentru a fi în partea de sus – adică în interiorul <head> tag – a paginii web XHTML , cum ar fi < DOCTYPE > , <meta> tag-uri, și link-uri către foi de stil . Aceasta include, de asemenea, deschiderea <body> și antetul vizibilă a template-ului (care include de obicei titlul site-ului, și poate include, de asemenea meniuri de navigare, logo , descrierea site-ului, etc.).
Blocul conținut cuprinde posturile și paginile site-ului, adică conținutul site-ului.
Subsolul conține informațiile care sunt afișate în partea de jos a paginii, cum ar fi link-uri către alte pagini sau categoriile site-ul într-o informare a meniul de navigare, drepturile de autor și de contact , precum și alte detalii setate ulterior.
Pentru a genera o astfel de structură în cadrul unui template WordPress, începe cu un fișierul index.php in directorul de instalare. Acest fișier are două funcții principale :
Face apel către alte fișierele a template-ului
Aduna informații din baza de date (mesaje, pagini, categorii, etichete etc.)
Pentru această structură, avem nevoie doar pentru a include alte două fișiere ale template-ului: antetul și subsolul .
Acestea trebuie să fie header.php și footer.php. Template-ul tags pe care le includ arata ca aceasta :
<?php get_header(); ?>
<?php get_footer(); ?>
În scopul de a afișa post-urile și paginile (și pentru a personaliza modul în care sunt afișate), fișierul index.php trebuie să ruleze între antet și subsol.
3.1.1 Antetul (Header)
Antetul este reprezentat de partea superioară a template-ului, incluzând bara de meniu detalii despre blog. In Fig.5 este reprezentarea vizuală a antetului. Conținutul fișierului header.php fiind următorul:
<?php
/**
* Header template.
*
* @package PROJECT
*/
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
<head profile="http://gmpg.org/xfn/11">
<meta http-equiv="Content-Type" content="<?php bloginfo( 'html_type' ); ?>; charset=<?php bloginfo( 'charset' ); ?>" />
<title><?php wp_title( '|', true, 'right' ); ?></title>
<link rel="pingback" href="<?php bloginfo( 'pingback_url' ); ?>" />
<?php wp_head(); ?>
</head>
<body <?php body_class(); ?>>
<div id="header">
<?php do_action( 'before' ); ?>
<div class="sleeve">
<h1><a href="<?php echo home_url( '/' ); ?>"><?php bloginfo( 'name' ); ?></a></h1>
<?php if ( get_bloginfo( 'description' ) && !ot_get_option('site-description')) : ?>
<small><?php bloginfo( 'description' ); ?></small>
<?php endif; ?>
<a class="secondary" href="<?php echo home_url( '/' ); ?>"></a>
<?php if ( current_user_can( 'publish_posts' ) ) : ?>
<a href="" id="mobile-post-button" style="display: none;"><?php _e( 'Post', 'PROJECT' ) ?></a>
<?php endif; ?>
</div>
</div>
<?php if ( has_nav_menu( 'primary' ) ) : ?>
<div id="header-navmenu">
<div id="navigation" role="navigation" class="site-navigation main-navigation">
<h1 class="assistive-text"><?php _e( 'Menu', 'PROJECT' ); ?></h1>
<div class="assistive-text skip-link"><a href="#main" title="<?php esc_attr_e( 'Skip to content', 'PROJECT' ); ?>"><?php _e( 'Skip to content', 'PROJECT' ); ?></a></div>
<?php wp_nav_menu( array(
'theme_location' => 'primary',
'fallback_cb' => '__return_false',
) ); ?>
</div>
</div>
<?php endif; ?>
Fig.5 – Reprezentarea vizuală a antetului
3.1.2 Subsolul (Footer)
Subsolul este reprezentat vizual in Fig.6, fiind localizat in partea inferioara a template-ului, conținutul fișierului footer.php fiind următorul:
<?php
/**
* Footer template.
*
* @package PROJECT
*/
?>
<div id="footer">
<p>
<?php printf( __( 'Theme %1$s by %2$s', 'PROJECT' ), 'PROJECT', 'Alin Pogan'); ?>
</p>
</div>
<div id="notify"></div>
<div id="help">
<dl class="directions">
<dt>c</dt><dd><?php _e( 'compose new post', 'PROJECT' ); ?></dd>
<dt>j</dt><dd><?php _e( 'next post/next comment', 'PROJECT' ); ?></dd>
<dt>k</dt> <dd><?php _e( 'previous post/previous comment', 'PROJECT' ); ?></dd>
<dt>r</dt> <dd><?php _e( 'reply', 'PROJECT' ); ?></dd>
<dt>e</dt> <dd><?php _e( 'edit', 'PROJECT' ); ?></dd>
<dt>o</dt> <dd><?php _e( 'show/hide comments', 'PROJECT' ); ?></dd>
<dt>t</dt> <dd><?php _e( 'go to top', 'PROJECT' ); ?></dd>
<dt>l</dt> <dd><?php _e( 'go to login', 'PROJECT' ); ?></dd>
<dt>h</dt> <dd><?php _e( 'show/hide help', 'PROJECT' ); ?></dd>
<dt><?php _e( 'shift + esc', 'PROJECT' ); ?></dt> <dd><?php _e( 'cancel', 'PROJECT' ); ?></dd>
</dl>
</div>
<?php wp_footer(); ?>
</body>
</html>
Fig.6 – Reprezentarea vizuală a subsolului
3.3 Ierarhia Template-ului în detaliu
Următoarele secțiuni descriu ordinea în care fișierele șablon sunt numite de către platforma WordPress. Secțiunile descrise mai jos sunt reprezentate de fișierele php care alcătuiesc blocul conținut (Fig. 4) situat intre antet si subsol.
3.3.1 Pagina Home
În mod implicit, WordPress stabilește pagina „Home” site-ului pentru a afișa ultimele post-uri alea site-ului. Această pagină se numește indicele blog. Se poate seta, de asemenea, o alata pagină statică separată pentru a afișa ultimele post-uri sau alt conținut in funcție de necesitați si preferințe.
Fișierul șablon home.php este utilizată pentru a crea indicele blog, dacă acesta este folosit ca prima pagină sau pe pagina statică separată. Dacă home.php nu există, WordPress-ul va folosi fișierul index.php.
În cazul template-ului dezvoltat există doar fișierul index.php, care conține următoarele linii de cod:
<?php
/**
* Main template file.
*
* This is the most generic template file in a WordPress theme
* and one of the two required files for a theme (the other being style.css).
* It is used to display a page when nothing more specific matches a query.
* E.g., it puts together the home page when no home.php file exists.
* Learn more: http://codex.wordpress.org/Template_Hierarchy
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<?php if ( PROJECT_user_can_post() && !is_archive() ) : ?>
<?php locate_template( array( 'post-form.php' ), true ); ?>
<?php endif; ?>
<div id="main">
<h2>
<?php if ( is_home() or is_front_page() ) : ?>
<?php _e( 'Latest posts', 'PROJECT' ); ?> <?php if ( PROJECT_get_page_number() > 1 ) printf( __( 'Page %s', 'PROJECT' ), PROJECT_get_page_number() ); ?>
<?php else : ?>
<?php printf( _x( 'Updates from %s', 'Month name', 'PROJECT' ), get_the_time( 'F, Y' ) ); ?>
<?php endif; ?>
</h2>
<ul id="postlist">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
if ( has_post_thumbnail() && !PROJECT_is_iphone()) {
// the current post has a thumbnail
post_thumbnail_with_size();
} else {
// the current post lacks a thumbnail
}
?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
<?php else : ?>
<li class="no-posts">
<h3><?php _e( 'No posts yet!', 'PROJECT' ); ?></h3>
</li>
<?php endif; ?>
</ul>
<div class="navigation">
<p class="nav-older"><?php next_posts_link( __( '← Older posts', 'PROJECT' ) ); ?></p>
<p class="nav-newer"><?php previous_posts_link( __( 'Newer posts →', 'PROJECT' ) ); ?></p>
</div>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.2 Pagina implicita (Page)
Fișierul șablon page.php este utilizat pentru a crea o pagină statică (pagină tip-post), conținând următoarele linii de cod:
<?php
/**
* Static page template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<div id="main">
<h2><?php the_title(); ?></h2>
<ul id="postlist">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
if ( has_post_thumbnail() && !PROJECT_is_iphone() ) {
// the current post has a thumbnail
post_thumbnail_with_size(774, 250);
} else {
// the current post lacks a thumbnail
}
?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
<?php endif; ?>
</ul>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.3 Pagina lată (Fullwidth Page)
Este lipsită de prezenta băirilor laterale (sidebars) fiind afișată pe toata lățimea browser-ului. Conținutul fișierului page-fullwidth.php fiind următorul:
<?php
/**
* Static page template.
* Template Name: Fullwidth Page
* Description: Page with no sidebars
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<div class="sleeve_main fullwidth">
<div id="main">
<h2><?php the_title(); ?></h2>
<ul id="postlist">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
if ( has_post_thumbnail() && !PROJECT_is_iphone()) {
// the current post has a thumbnail
if(is_front_page())
post_thumbnail_with_size(996,255,"c"); //larger image for frontpage
else
post_thumbnail_with_size(996,200,"c");
}
?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
<?php endif; ?>
</ul>
</div> <!– main –>
</div> <!– sleeve –>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.4 Post-ul (Single Post)
Fișierul șablon single.php este folosit pentru a crea post-ul conținând următoarele linii de cod:
<?php
/**
* Static page template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<div id="main">
<h2><?php the_title(); ?></h2>
<ul id="postlist">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts() ) : the_post(); ?>
<?php
if ( has_post_thumbnail() && !PROJECT_is_iphone() ) {
// the current post has a thumbnail
post_thumbnail_with_size(774, 250);
} else {
// the current post lacks a thumbnail
}
?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
<?php endif; ?>
</ul>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.5 Etichete (Tag)
Fișierul tag.php este folosit la etichetarea post-urilor in vederea accesării si ordonării rapide de către utilizatori, conținând următoarele linii de cod:
<?php
/**
* Tag Archive Template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<?php $tag_obj = $wp_query->get_queried_object(); ?>
<div class="sleeve_main">
<div id="main">
<h2><?php printf( __( 'Tagged: %s', 'PROJECT' ), single_tag_title( '', false) ); ?>
<span class="controls">
<a href="#" id="togglecomments"> <?php _e( 'Toggle Comment Threads', 'PROJECT' ); ?></a> | <a href="#directions" id="directions-keyboard"><?php _e( 'Keyboard Shortcuts', 'PROJECT' ); ?></a>
</span>
</h2>
<?php if ( have_posts() ) : ?>
<ul id="postlist">
<?php while ( have_posts() ) : the_post(); ?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
</ul>
<?php else : ?>
<div class="no-posts">
<h3><?php _e( 'No posts found!', 'PROJECT' ); ?></h3>
</div>
<?php endif ?>
<div class="navigation">
<p class="nav-older"><?php next_posts_link( __( '← Older posts', 'PROJECT' ) ); ?></p>
<p class="nav-newer"><?php previous_posts_link( __( 'Newer posts →', 'PROJECT' ) ); ?></p>
</div>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.6 Pagina 404 (Not Found)
Această pagină este afișată in momentul in care conținutul accesat nu este disponibil. Pagina 404 este reprezentat de fișierul 404.php si are următoarea structură:
<?php
/**
* 404 Post not found template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<div id="main">
<h2><?php _e( 'Not Found', 'PROJECT' ); ?></h2>
<p><?php _e( 'Apologies, but the page you requested could not be found. Perhaps searching will help.', 'PROJECT' ); ?></p>
<?php get_search_form(); ?>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.7 Atașamentele (Attachment)
Aceasta pagină este folosită la atașarea de imagini, fișiere video si altui tip de fișiere in pagini si posturi implicit la afișare. Structura fișierului attachment.php este următoarea:
<?php
/**
* Displays a single attachment.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div id="postpage">
<div class="sleeve_main">
<div id="main">
<?php if ( have_posts() ) : ?>
<?php while ( have_posts( ) ) : the_post(); ?>
<div <?php post_class( 'post' ); ?> id="post-<?php the_ID( ); ?>">
<h2><a href="<?php echo get_permalink( $post->post_parent ); ?>" rev="attachment"><?php echo get_the_title( $post->post_parent ); ?></a> » <?php the_title(); ?></h2>
<div class="entry">
<?php if ( wp_attachment_is_image() ) :
$attachments = array_values( get_children( array( 'post_parent' => $post->post_parent, 'post_status' => 'inherit', 'post_type' => 'attachment', 'post_mime_type' => 'image', 'order' => 'ASC', 'orderby' => 'menu_order ID' ) ) );
foreach ( $attachments as $k => $attachment ) {
if ( $attachment->ID == $post->ID )
break;
}
$k++;
// If there is more than 1 image attachment in a gallery
if ( count( $attachments ) > 1 ) {
if ( isset( $attachments[ $k ] ) )
$next_attachment_url = get_attachment_link( $attachments[ $k ]->ID );
else
$next_attachment_url = get_attachment_link( $attachments[ 0 ]->ID );
} else {
$next_attachment_url = wp_get_attachment_url();
}
$metadata = wp_get_attachment_metadata();
printf( __( 'Full size is %s pixels', 'PROJECT' ),
sprintf( '<a href="%1$s" title="%2$s">%3$s × %4$s</a>',
wp_get_attachment_url(),
esc_attr( __( 'Link to full-size image', 'PROJECT' ) ),
$metadata['width'],
$metadata['height']
)
);
edit_post_link( __( 'Edit this entry.', 'PROJECT' ), ' <span class="meta-sep">|</span> ', '' );
?>
<div class="attachment-image">
<p><a href="<?php echo $next_attachment_url; ?>" title="<?php echo esc_attr( get_the_title() ); ?>" rel="attachment"><?php echo wp_get_attachment_image( $post->ID, array( $content_width – 8, 700 ) ); ?></a></p>
<div class="caption"><?php if ( !empty($post->post_excerpt) ) the_excerpt(); ?></div>
<div class="image-description"><?php if ( !empty($post->post_content) ) the_content(); ?></div>
</div>
<div class="navigation attachment">
<div class="alignleft"><?php previous_image_link(); ?></div>
<div class="alignright"><?php next_image_link(); ?></div>
</div>
<?php else : ?>
<p><?php _e( 'View file:', 'PROJECT' ); ?> <a href="<?php echo wp_get_attachment_url(); ?>" title="<?php echo esc_attr( get_the_title() ); ?>" rel="attachment"><?php echo basename( get_permalink() ); ?></a></p>
<?php the_content( __( '(More …)' , 'PROJECT' ) ); ?>
<?php wp_link_pages(); ?>
<?php edit_post_link( __( 'Edit this entry.', 'PROJECT' ), '<p>', '</p>' ); ?>
<?php endif; ?>
<div class="bottom-of-entry"> </div>
<?php comments_template(); ?>
</div> <!– .entry –>
</div> <!– .post –>
<?php endwhile; ?>
<?php endif; ?>
</div> <!– #main –>
</div>
</div>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.8 Pagina autorului (Author)
Afișează conținutul (paginile si post-urile) in funcție de autor (administrator). Structura fișierului author.php este următoarea:
<?php
/**
* Author template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<?php if ( PROJECT_user_can_post() && !is_archive() ) : ?>
<?php locate_template( array( 'post-form.php' ), true ); ?>
<?php endif; ?>
<div id="main">
<?php if ( have_posts() ) : ?>
<h2>
<?php printf( _x( 'Updates from %s', 'Author name', 'PROJECT' ), PROJECT_get_archive_author() ); ?>
<span class="controls">
<a href="#" id="togglecomments"> <?php _e( 'Toggle Comment Threads', 'PROJECT' ); ?></a> | <a href="#directions" id="directions-keyboard"><?php _e( 'Keyboard Shortcuts', 'PROJECT' ); ?></a>
</span>
</h2>
<ul id="postlist">
<?php while ( have_posts() ) : the_post(); ?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
</ul>
<?php else : ?>
<h2><?php _e( 'Not Found', 'PROJECT' ); ?></h2>
<p><?php _e( 'Apologies, looks like this author does not have any posts.', 'PROJECT' ); ?></p>
<?php endif; // end have_posts() ?>
<div class="navigation">
<p class="nav-older"><?php next_posts_link( __( '← Older posts', 'PROJECT' ) ); ?></p>
<p class="nav-newer"><?php previous_posts_link( __( 'Newer posts →', 'PROJECT' ) ); ?></p>
</div>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
3.3.9 Funcția de căutare (Serch)
Aceasta funcție ajută utilizatorul la căutare pe site folosind cuvinte cheie ce apare in pagini si post-uri. Structura fișierului serch.php este următoarea:
<?php
/**
* Search result template.
*
* @package PROJECT
*/
?>
<?php get_header(); ?>
<div id="wrapper">
<?php get_sidebar('main'); ?>
<div class="sleeve_main">
<div id="main">
<h2>
<?php printf( __( 'Search Results for: %s', 'PROJECT' ), get_search_query() ); ?>
<span class="controls">
<a href="#" id="togglecomments"> <?php _e( 'Toggle Comment Threads', 'PROJECT' ); ?></a> | <a href="#directions" id="directions-keyboard"><?php _e( 'Keyboard Shortcuts', 'PROJECT' ); ?></a>
</span>
</h2>
<?php if ( have_posts() ) : ?>
<ul id="postlist">
<?php while ( have_posts() ) : the_post(); ?>
<?php PROJECT_load_entry(); ?>
<?php endwhile; ?>
</ul>
<?php else : ?>
<div class="no-posts">
<h3><?php _e( 'No posts found!', 'PROJECT' ); ?></h3>
<p><?php _e( 'Apologies, but the page you requested could not be found. Perhaps searching will help.', 'PROJECT' ); ?></p>
<?php get_search_form(); ?>
</div>
<?php endif ?>
<div class="navigation">
<p class="nav-older"><?php next_posts_link( __( '← Older posts', 'PROJECT' ) ); ?></p>
<p class="nav-newer"><?php previous_posts_link( __( 'Newer posts →', 'PROJECT' ) ); ?></p>
</div>
</div> <!– main –>
</div> <!– sleeve –>
<div class="clear"></div>
<?php get_sidebar('footer'); ?>
</div> <!– // wrapper –>
<?php get_footer(); ?>
4. Bibliografie
[Dbn01] – http://www.studytonight.com/dbms/database-normalization.php
[Duc11] Jon Duckett – „HTML and CSS: Design and Build Websites”
[Gag03] Marcel Gagne – „Doing It AII with OpenSSH” http://www.linuxiournal.com/article/6909
[Har08] Ross Harmes și Dustin Diaz – „Pro JavaScript Design Patterns”
[Ken01] Beck Kent – „Principles behind the Agile Manifesto" http://www.aailemanifesto.org/
[Mac11] Peter Maclntyre, Brian Danchilla, Mladen Gogala – „Pro PHP Programming”
[Mar10] Radu Marinescu – „Goals, Functions and Myths of Software Engineering”, „Software Process Models”
[McC11] John McCann – „Git, Mercurial, and CVS – Comparison of version control software” http://www.timedoctor.eom/biz3.0/qit-mecurial-and-cvs-comparison-of-svn-software/
[Mys12] Mysql Documentation http://dev.mvsql.com/doc/
[Oak11] Manali Oak – „Advantages of Relațional Databases”
http://www.buzzle.com/articles/advantaaes-of-relational-databases.html
[PHP12] PHP Manual http://php.net/manual
[Pol10] John Pollock – „JavaScript A Beginner’s Guide Third Edition”
[Pre04] Roger S. Pressman – „Software Engineering. A Practitioner's Approach”
[Sch06] Christopher Schmitt – „CSS Cookbook, 3rd Edition (Animal Guide)”
[Sta05] William Stallings – „Cryptography and NetWork Security, 4th edition”
[Teo11] Toby Teorey, Sam Lightstone, Tom Nadeau, H. V. Jagadish – „Databese Modeling And Design, Logical Design Fifth Edition”
[Wik10] Wikipedia – „Server (computing)” http://en.wikipedia.org/wiki/Server (computinq)
[Wik11] HTML http://en.wikipedia.org/wiki/HTML
[Wik12] PHP http://ro.wikipedia.org/wiki/PHP
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: Extensii Platforma WordPress (ID: 149802)
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.
