Aplicaţie Web pentru gestionarea încadrării şi orarului unei şcoli
Creat: 2010/jul Revizuiri/Comentarii
Mai demult (vezi Model Web pentru încadrarea şi orarul unei şcoli) am prezentat problemele referitoare la încadrare şi orar într-un context mai larg, incluzând şi gestionarea "situaţiei şcolare" a elevilor.
Dar a vedea lucrurile—cum este firesc—într-un context comun, nu înseamnă că ele chiar trebuie tratate "în comun"; de exemplu, poate interesa numai componenta de orar, fără integrarea situaţiilor şcolare.
O instalare funcţională a aplicaţiei (ca "demo") se poate vedea la http://scorar.docere.ro/ şi (partea "administrativă") la http://admin.scorar.docere.ro/.
În vederea instalării pe serverul propriu sunt necesare git şi symfony (a vedea Introducere elementară în framework-ul PHP symfony); procedura de instalare constă în etapele descrise mai jos.
Clonaţi repozitoriul scorar, de pe GitHub:
git clone git://github.com/vladbazon/scorar.git
Se obişnuieşte furnizarea unui script de instalare, încât tot ce ar mai fi de făcut ar fi lansarea acestuia: cd scorar; ./install.sh. Însă în acest moment, scorar nu este prevăzută cu un script "install.sh"; ca urmare, a trebuit să includem în repozitoriu şi pachete care de obicei se instalează separat.
S-au descărcat (prin comanda de mai sus) aproape 12 Mb, ceea ce apreciem că este "mult"; explicaţia constă în faptul că am inclus în repozitoriu şi biblioteca TCPDF. Pentru obţinerea de documente PDF (orarele claselor, orarul pe schimburi, etc.) scorar foloseşte plugin-ul sfTCPDFPlugin, care la rândul său angajează biblioteca externă TCPDF; instalarea acestora necesită o anumită documentare şi crearea unor anumite fişiere - încât am preferat să le includem direct în repozitoriu (gata "instalate"), scutindu-l pe utilizator de aceste operaţii suplimentare.
Desigur, pe disc scorar/ ocupă de patru ori mai mult (se poate folosi cd scorar; du -ch, pentru a investiga spaţiul ocupat pe disc). Astfel, subdirectorul .git/ ocupă circa 17 Mb, iar sfTCPDFPlugin circa 19 Mb.
Recomandările oficiale prevăd instalarea bibliotecii symfony într-un subdirector al proiectului (anume, în scorar/lib/vendor, respectiv şi în altProiect/lib/vendor, etc.). Am dorit însă ca o aceeaşi copie fizică să poată fi utilizată de mai multe proiecte, încât am prevăzut instalarea symfony într-un director independent de proiect.
Comenzile următoare descarcă şi dezarhivează biblioteca (în acel director din care sunt lansate):
wget http://www.symfony-project.org/get/symfony-1.4.6.tgz
tar -zxvf symfony-1.4.6.tgz
mv symfony-1.4.6 symfony
rm symfony-1.4.6.tgz
Pentru lămuriri adiacente (inclusiv, privind verificarea unor configurări PHP) - se poate vedea Introducere elementară în framework-ul PHP symfony.
Fişierele "scorar" şi "admin_orar" din scorar/doc/ redau definiţiile a două host-uri; bineînţeles că trebuie să modificaţi calea /home/vb/ corespunzător cazului Dvs. şi desigur, puteţi schimba ServerName.
Unul dintre aceste servere lansează index.php, iar celălalt backend.php; în primul caz (prin http://scorar.d/) se deservesc cererile obişnuite (pentru un user anonim), iar în al doilea (prin http://admin.scorar.d) se deservesc numai cereri din partea unui user înregistrat, după procesul de autentificare prealabilă (iniţial, user = vb şi password = 123456; acestuia i se oferă şi i se permit operaţii de actualizare şi editare).
Am descris tehnica de creare a unui virtualhost în două sau trei articole anterioare acestuia.
Deschideţi fişierul scorar/config/databases.yml şi modificaţi user=vb;password=123456 conform drepturilor proprii de acces la MySQL (puteţi schimba eventual şi dbname=scorar).
Pentru cazul altor "SGBD"-uri (în loc de MySQL) - vezi Doctrine: DSN (Data Source Name).
Apoi, pentru a constitui baza de date respectivă se poate folosi scriptul PHP scorar/symfony:
php symfony doctrine:build --all --and-load
Astfel, se creează baza de date conform definiţiei din config/databases.yml (presupunând că… se poate crea, adică aveţi dreptul "create databases") şi se creează deasemenea toate tabelele definite în config/doctrine/schema.yml; pe de altă parte, se şi înscriu în tabele datele concrete din fişierul data/fixtures/iulie19.yml.
Desigur, baza de date se poate crea şi direct; structura bazei de date este dată în fişierul data/sql/schema.sql.
O descriere grafică se poate vedea deschizând (de exemplu, în browser) fişierul doc/graph.21iulie.dot.png.
În final, aplicaţia poate fi lansată dintr-un browser prin http://scorar.d/ şi respectiv prin http://admin.scorar.d/ (presupunem aici şi mai departe, că "NameServer" este cel prevăzut iniţial).
Ar fi de explicat unele aspecte care ţin de partea administrativă; http://admin.scorar.d/ afişează întâi o pagină de autentificare - trebuie introdus "vb" pentru user şi "123456" pentru password. Această parte a aplicaţiei a fost în mare măsură generată automat de către symfony (apelând doctrine:generate-admin). Precizăm că imaginile redate mai jos corespund serverului "real", pe care administratorul este "vlad" (şi nu "vb").
După autentificare, adăugaţi în bara de adresă http://www.admin.scorar.d/guard/users - veţi obţine:

Click pe Edit va dezvălui că userul "vlad" este super admin, în timp ce userul "marius" are numai permisiunea de "editare-orar" (nu şi pe cea de "editare-useri", de exemplu).
Pentru gestionarea "grupurilor" şi "permisiunilor" super_admin-ul are la dispoziţie "extensii" de rutare analoge celeia redate mai sus: /guard/groups/ şi respectiv /guard/permissions/.
Pentru diverse adaptări privind autentificarea - vezi eventual, scorar/plugins/sfDoctrineGuardPlugin/README.
După autentificare, http://admin.scorar.d/ produce o pagină care începe cu acest meniu simplu:

Acest meniu corespunde tabelelor şi relaţiilor din baza de date scorar:

Semnificaţia câmpurilor şi relaţiilor poate fi dedusă uşor folosind mysql - de exemplu, select * from incadrare;.
Sunt de explicat două itemuri: Schimb şi orare şi încadrări. Pot fi mai multe schimburi, sau numai unul; se poate eventual, înfiinţa un schimb fictiv - de exemplu pentru situaţia când este necesar la un anumit moment, un orar "provizoriu" (urmând să se revină după un timp, la orarul "de bază").

Un schimb are maximum 6 ore (de obicei, în intervalul orar 8-14, sau 14-20), dar în unele zile pot exista clase cu 7 ore. Pentru cazul 8-14, această a 7-a oră înseamnă de regulă "ultima" oră (adică ora 14-15); în schimb, pentru cazul 14-20, a 7-a oră este stabilită ca fiind "prima", sau "ora zero" (înaintea orelor standard 14-20).
Pe cazul redat în imaginea de mai sus, cele două schimburi se desfăşoară în cele 5 zile standard (dar aplicaţia permite şi includerea în orar a celei de-a 6-a zile, sâmbăta). 67766 din coloana "Nr. ore/Zile" spune că în prima, a patra şi în a cincea zi toate clasele din schimbul respectiv au câte maximum 6 ore/zi; în schimb, în zilele de marţi şi miercuri există câte cel puţin o clasă care are 7 ore (şi întrucât coloana de "oră zero" nu este bifată, această a 7-a oră se desfăşoară după programul standard al schimbului respectiv).
Pentru celălalt schimb (caracterizat prin 77767): în toate zilele, exceptând joia - programul începe cu "ora zero" (pentru cel puţin câte o clasă din acel schimb).
"Un schimb are maximum 6 ore" corespunde realităţii şcolare exemplificate de mai sus, dar aplicaţia permite şi "maximum 8 ore" de exemplu.
Informaţia din "Nr.ore/Zile" este esenţială pentru introducerea datelor orarului folosind încadrare şi orar (item care corespunde tabelului denumit csvsql):

Cele două înregistrări din această imagine corespund respectiv orarelor pe fiecare schimb. La origine au fost două foi Excel, conţinând orarul pentru primul şi respectiv al doilea schimb; foile respective au fost salvate în format CSV; deschizând fişierele text rezultate (de exemplu, în gedit) şi folosind metoda "Copy&Paste", ele au fost "aduse" în casetele din formularul prezentat în imaginea de mai sus (mai precis, din cadrul formularului produs de acţiunea New - nevizibilă însă, pe imaginea de mai sus).
Click pe Set (vezi coloana "Actions" a formularului) va declanşa o operaţie complexă de înscriere a datelor: se identifică profesorul (după numele şi prenumele existent la începutul rândului CSV), obiectul, clasele şi orarul indicate; dacă unul dintre aceste elemente nu există în baza de date, atunci el este creat.
Orarul indicat pe fiecare rând CSV (după câmpurile de nume-profesor şi nume-obiect) este împărţit pe zile în conformitate cu formatul "Nr. ore/Zile" specificat în tabelul Schimb; se compară încadrarea existentă cu cea dedusă din CSV şi se fac actualizările necesare (analog, pentru orarul profesorului).
Se pot adăuga oricâte orare, fie pentru toţi profesorii dintr-un acelaşi schimb, fie pentru unul singur, sau pentru un grup de câţiva profesori. Folosind "acţiunile" Edit şi Set se poate modifica şi se poate înscrie drept orar curent oricare dintre orarele existente în tabel (orarele anterior înscrise devin eventual "inactive"); desigur, la un anumit moment unele orare vor putea fi şterse definitiv (odată cu încadrările corespunzătoare), folosind Delete.
Proiectul fiind făcut public, pe GitHub - devine posibilă colaborarea în scopul dezvoltării aplicaţiei…
Este de îmbunătăţit maniera în care se obţin documente PDF; implementarea actuală este pe undeva defectuoasă, încât timpul de răspuns este de două ori mai mare decât ar trebui să fie. (iniţial, am folosit o anumită versiune a bibliotecii TCPDF şi timpul de răspuns era acceptabil; acum este implicată o versiune mai nouă - fără alte modificări, în codul propriu - şi se constată că timpul aproape se dublează).
De fapt, am greşit stocând în repozitoriul nostru pachetul străin TCPDF: la un moment dat, autorii acestui pachet vor produce o versiune superioară - mai bună decât cea stocată de noi - iar aplicaţia noastră ar trebui să folosească această nouă versiune.
Aceste probleme de dependenţă pot fi rezolvate cel mai bine prin realizarea unui script de instalare; repozitoriul trebuie să conţină numai codul propriu al aplicaţiei, urmând ca "install.sh" să descarce de la adresele corespunzătoare şi să instaleze pachetele de care are nevoie aplicaţia proprie.
ŞahStartTemp
Judeţ:
Load another random Bliţ
Linux şi aplicaţii Web
în 24 de ore
Orar şcolar
documentaţie Sphinx