Catalog Pentru Windows Phone
Interfața de comunicare cu baza de date
Introducere
Pentru crearea aplicației “Windows Phone Catalog” a necesitat folosirea mai multor limbaje de programare, care imbinate corespunzator execută cerințele utilizatorului.
Aplicația a fost conceputa pornind de la o baza de date (MySQL Database) , ulterior fiind creat un API(application programing interface) in limbajul de programare PHP.
Pentru a realia API-ul am folosit un Framework special care lucrează mult mai simplu si mai efficient decat PHP-ul tradițional cu datele dintr-o bază de date (Laravel Framework) .
Aplicația finală este dezvoltata pe platforma Windows Phone , platformă pusă la dispoziție de catre Microsoft prin aplicația Visual Studio 2013.
Pentru a realizara aplicația Windows Phone a trebuit imbinate cele două limbaje de programare amintite mai sus plus limbajul C# care a contribuit in a face legătura dintre datele preluate de API-ul nostru si expunerea acestor date vizual cu ajutorul tehnologiei XAML , tehnologie special creată de cei de la Microsoft pentru expunerea vizuala a datelor mai pe scurt un designer dedicat aplicatiilor Windows Phone .
Aplicația de gestiune a bazei de date si limbajul de programare folosit in creearea acesteia
Aplicația de gestiune a bazei de date – MySQL
MySQL este o aplicație de gestiune a bazei de date , cea mai utilizată aplicație în realizarea site-urilor web care folosesc limbaje de programare standard(PHP,ASP.NET) si nu numai aceasta având suport pentru dezvoltare de aplicații windows care folosesc limbaje de de programare specifice(C++,Java,C#), acest lucru fiind posibil prin ajutorul API-urilor puse la dispozitia dezvoltatorilor de catre compania suedeză MySQL AB si distribuită sub Licența Publică Generală (GNU).
Prima versiune a aplicației MySQL a luat fiintă pe data de 23 mai 1995 ajungând in zilele noastre la versiunea 5.6.19 versiune flosită si in crearea aplicație Windows Phone Catalog.
MySQL poate rula pe majoritatea platformelor existente : GNU/Linux(CentOS,Ubuntu),
Mac OS X ,Windows XP/Vista/7/8/8.1.
Pentru administrarea bazei de date MySQL putem folosi linia de comandă cât si o mulțime de interfețe grafice puse la dispoziție de catre dezvoltatori precum: MySQL Administrator , Heidi SQL , insă cea mai folosită interfată pentru adiministrare este phpMyAdmin, o aplicație scrisa in limbajul PHP.
Limbajul de programare a bazelor de date –SQL
SQL(Structurated Query Leanguage – Limbaj Structurat de Interogare) a apărut in anul 1974 dezvoltat de catre Donald D. Chamberling si Raymond F. Boyce.
Acesta este un limbaj specific de manipulare a datelor in sisteme de baze de date relaționare si are ca obiectiv inserarea , ștergerea , actualizarea , folosirea si modificarea datelor dintr-o baza de date relationară.
Tipuri de date in SQL
În MySQL (aplicația folosita in creearea bazei de date care ajuta in reazizarea aplicației) există trei tipuri principale de date : text , număr si tipurile referitoare la dată și oră.
In continuare vom prezentata principalele tipuri de date si caracteristicile acestora derivate din cele trei tipuri principale:
Tipuri de date din categoria text
CHAR: este un tip de dată de lungime fixă(255 de caractere) care poate conține litere, numere si caractere special;
VARCHAR: este un tip de date cu lungime de stocare variabilă, poate stoca pana la 255 de caractere (litere, numere si caractere speciale);
TEXT: este un tip de date cu lungime maximă de stocare de pană la 65.535 de caracatere
LONGTEXT:este un tip de date cu o lungime maximă de stocare de pană la 4294967295 de caractere
BLOB: este un tip de date specific lucrului cu biti, acesta pate stoca pana la 65535 de biti.
ENUM:este un tip de date care iti permite să adaugi o lista de valori acesta fiind limitată la valoarea de 65535 de valori.
Tipuri de date din categoria număr
SMALLINT: este cuprins intre valorile -32678 si 32767 , numărul maxim de cifre putând fi scris in paranteze;
INT: este cuprins intre valorile -2147483648 si 2147483647, numărul maxim de cifre putând fi scris in paranteze;
FLOAT: este un tip de date mic ca dimensiune cu ajutorul caruia sunt reprezentate numerele cu zecimale ,numărul maxim de dupa virgulă este specificat in parantză ;
DOUBLE: un tip de date mare care ne ajută in reprezentarea numerelor cu zecimale;
Tipuri de date referitoare la dată si oră
DATE:formatul principal a unei date calendaristice in SQL(YYYY-MM-DD), aceasta poate lua valori intre(1000-01-01 panâ la 9999-12-31);
DATETIME:este o combinație intre data calendaristică si ora la care a fost facută o modificare, formatul specific:YYYY-MM-DD HH:MI:SS si poate lua valori cuprinse intre(1000-01-01 00:00:00 panâ la 9999-12-31 23:59:59);
TIME:reprezintă ora la care sa făcut modificare asupra datelor, formatul standard fiind urmatorul: HH:MI:SS
Instructriunea CREATE DATABASE
Pentru creearea unei baze de date folosim instrucțiunea : CREATE DATABASE.
Această instrucțiune are sintaxa următoare:
CREATE DATABASE nume_baza_de_date;
Fig.1 Crearea bazei de date folosita in realizarea aplicației finale
Instrucțiunea USE „Data Base”
Dupa crearea implicită a bazei de date folosim o comadă specifică limbajului SQL, cu ajutorul căreia folosim baza de data creată.
Această instrucțiune are sintaxa următoare:
USE nume_baza _de_date;
Fig.2 Utilizarea bazei de date folosită in creearea aplicației finale
Instrucțiunea CREATE TABLE
Instrucțiunea CREATE TABLE este definită prin două caracteristici principale. Prin aceasta instrucțiune definim numele tabelului si numele coloaneleor care fac parte din tabel.
Acesta instrucțiune are sintaxa următoare:
CREATE TABLE nume_tabel(
Coloana1 datatype,
Coloana datatype,
Coloana3 datatype
PRYMARY KEY(pentru una sau mai multe coloane)
);
Fig.3 Creearea tabelelor in baza de date folosită in aplicație
Setarea cheilor primare si secundare(PRIMARY KEY FORGIVEN KEY)
Cheia primara este caracterizată prin urmatoarele afirmații:
Este unică in fiecare tabel;
Valorile ei trebuiec sa fie unice;
Fiecare tabel trebuie sa contină obligatoriu cate o cheie primară;
Cheia primară nu trebuie sa conțină valoarea null;
Un tabel poate sa contină una sau mai multe chei primare.
Exemplu setare cheie primară:
Fig.4 Setare cheie primară in tabelul “clasa” din baza de date
Cheia secundară este caracterizată de urmatoarele afirmatii:
Este un grup de attribute care constituie o cheie primară intr-o alată relatie;
O cheie secundară ajută la legarea datele dintre două tabele diferite.
Fig.5 Seratea cheilor primare aferente tabelului “user”
Instructiunile INSERT,UPDATE,DELETE,SELECT
Definirea unei instructiuni INSERT implica trei parti:
Definirea tabelei de destinație pentru inserarea datelor;
Definirea câmpurilor(coloanelor ) care vor primi valori;
Definirea valorilor pentru aceste coloane.
Acestă instrucțiune are sintaxa următoare:
INSERT INTO <numetabel> (camp1,camp2,…,campn)
VALUES(Valoare_camp1,Valoare_camp2,…,Valoare_campn) Fig.6 Exemplu inserare date in tabel
Definirea unei instrucțiuni UPDATE implică trei pasi:
Definirea tabelului destinație pentru modificarea datelor;
Definirea câmpului si a unei noi valori;
Definirea filtrului tabelei.
Acestă instrucțiune are sintaxa următoare
UPDATE <numetabel>SET camp1 = Valoare_camp1
WHERE camp2 =Valoare_camp2
Acțiunea acestei instrucțiuni SQL va modifica valoarea unui camp dintr-o inregistrare.
Definirea unei instrucțiuni DELETE se realizaează in doi pași:
Definirea tabelei de destinație pentru ștergerea datelor;
Definirea filtrului tabelei.
Acestă instrucțiune are sintaxa urmatoare:
DELETE FROM<nume tabel> WHERE<conditie>;
delete from `clasa` where (`clasa`= 13 );
Fig.7 Exemplu stergere stergere date din tabel
Instrucțiunea SELECT se utilizează pentru a obține inregistrari ale bazei de date care indeplinesc anumite criterii.Există partu parți ale acestei instrucțiuni:
Definirea a ceea ce dorim sa obținem;
Definirea tabelului de unde se vor obține informațiile;
Definirea condițiilor de obținere(filtre pentru inregistrări);
Definirea ordini in care se dorește vizualizarea datelor.
Această instrucțiune are sintaxa următoare:
SELECT <lista_campuri> [AS<alias>] FROM <nume_tabel>
WHERE <expresiebooleana> ;
Rezultatul intors de această instrucțiune SQL este o mulțime de inregistrări, care poate fi o tabelă de date fixate de un anumit număr de lini si coloane;
SELECT `id`, `clasa`, `litera` FROM `clasa` WHERE `id`=10;
Fig.8 Exemplu select
Instrucțiunea INNER JOIN
Instrucțiunea INNER JOIN determină o asociere a inregistrarilor din tabele, astefel încât să rezulte un număr total de inregistrări egal cu produsul numarului de inregistrări din fiecare tabel. Dacă in primul tabel sunt inregistrări care nu au correspondenți in cel de-al doilea tabel datele nu sunt extrase.
Această instrucțiune are sintaxa următoare:
SELECT <nume_coloana> FROM <nume_tabel1>
INNER JOIN <nume_tabel2> ON
nume_tabel1.nume_coloana=nume_tabel2.nume_coloana ;
SELECT DISTINCT materie.* FROM materie INNER JOIN profesor_materie_clasa ON
materie.id = profesor_materie_clasa.materie_id
WHERE profesor_materie_clasa.profesor_id;
Fig. 9 Exemplu de INNER JOIN intre două tabele din baza de date
Limbajul folosit in creearea API-ului care manipulează datele din baza de date (PHP-Laravel Framework)
Prezentarea limbajului PHP
Scurt istoric
PHP este un limbaj de programare care a luat naștere in anul 1994 ca o extensie a limbajului server-side Perl, si apoi ca o serie de CGI-uri compilate de catre Rasmus Lerdorf, pentru a genera un curriculum vitae si pentru a urmări numarul de utilizatori al unui site . Apoi a evoluat in PHP/PI 2.0, dar proiectul open-source a început să ia amploare după ce Zeev Suraski si Andi Gutmans, de la Technion au lansat o nouă versiune a interpretorului PHP in vara anului 1998, aceasta versiune primind numele de PHP 3.0. Tot ei au schimbat si numele in acronimul recursiv de acum, până atunci PHP fiind cunoscut ca Personal Home Page. In 2000 a fost lansat PHP 4.0 avâd la baza Zend Engine 1.0.
Utilizare
PHP-ul este folosit pe scara largă in dezvoltarea paginilor si aplicațiilor web.Se folosește in principal înglobat in codul HTML, dar incepând de la versiunea 4.3.0 se poate folosi si in mod “lini de comandă” , permițând crearea de aplicații indepandente. Este unul dintre cele mai importante limbaje de programare web open-source și server-side, existând versiuni disponibile pentru majoritatea web serverelor si pentru toate sistemele de operare.
PHP-ul este disponibil sub licență PHP si Free Software Fundation il consideră a fi un software liber.
Variabile
Toate variabilele din PHP incep cu semnul $($x);
Variabilele utilizate inainte de a le fi atribuite o valoare au valoare implicită;
Variabileleor li se atribuie o valoare cu ajutorul instructiuni de atibuire;
Tipuri de date
Integer –sunt numere intregi ,fară virgule;
Double-sunt numere cu virgule mobile(4.5);
Boolean-au doar doua valori posibile , adevărat sau fals;
Null-este un tip special care are doar o valoare:NULL;
String-sunt secvențe de caractere(“Tilă Valentin Ionuț”);
Array-colecți de numere care pot fi indexate
Constante
O constantă este un nume sau un identificator pentru o valoare simplă. O valoare constantă nu poate fi schimbată in timpul execuției scriptului. Prin conventie prima literă a unei constant este scrisă cu majuscule.
Prezentarea Framework-ului LARAVEL
Scurt istoric
Laravel este un Framework creat de catre Taylor Otwell , lansat in luna octombrie a anului 2011. Acest framework a fost lansat din nevoia de a suplini funcțiile PHP-ului classic care nu furniza caracteristici avansate cum ar fi, support pentru atutentificarea utilizatorului si atutorizarea acestuia.
Conform site-urilor de statistici Laravel Framework este cel mai popular framework printer utilizatorii limbajului PHP.
//continuare
Modul de lucru a unui limbaj MVC(Model View Controller)
MVC este filosofia clasică pentru proiectarea interfețelor grafice in limbajele obiectuale care dateaza din anii 1970. Reprezintă structurarea componentelor in trei părti: model,view, si controller, fiecare având propria utilizare ,funcționalitate si interacțiune cu celelalte părți așa cum este descries in figura următoare:
Fig.10 Schema MVC
Componenta devine un mediator intre model, view si controller. Unul dintre avantajele acestei modalități de a structura componentele este acela ca ne permite sa personalizam look-and-feel-ul unei componente fară a modifica modelul. Putem să asociem unui același model mai multe moduri de vizualizare chiar in același timp.
1.Model
Modelul păstreaza , in general, date cărora se dorește sa li se dea o vizualizare, numindu-se in acest caz model de date.
Modelul comunică indirect cu view-ul si controlerul prin intermediul sistemului de evenimente si nu deține referințe la nici una dintre acestea.Pot exista modele care sa nu țină neapărat datele componentei, ci stări ale vizualizării grafice pentru component.
Trebuie precizat că deseori modelele incorporează atat datele componentei, cat si stări ale vizualizări copmonentelor.
In continuare este prezentat un “Model” din proiectul final. Acest model este creat in PHP utilizand Framework-ul Laravel.
Fig. 11 Exemplu de model creeat pentru proiectul final
2.View
Un view este defapt un template, de cele mai multe ori scris in HTML.El reptrezintă partea de interfață pe care utilizatorul o observă in timpul rularii aplicației.
Un view poate afișa variabile,care trebuiesc trimise catre acesta de controller.
Crearea unui View: cu clasa View, metoda statică View::make(nume view,date[])
Odata cu avansarea framework-urilor, view-urile au avansat, in cele mai noi framework-uri acestea suportă moștenire,scurtături de comenzi (@if,@foresch).
In laravel , view-urile au in spate un “motor”, Blade, ce face posibilă moștenirea Layout-urilor,;view-urile sunt parsate de acest motor si transformate in PHP si HTML pur.
Ecemplu de view:
@layout(“baza/pagina_goala”)
@section(“continut”)
<h2>Categorii Produse {{$nume_categorie}}</h2>
<!—Continut Aici–>
@stop
3.Controller
Un controller este o clasă ce extinde, in laravel, clasa parinte BaseController, si se ocupă cu partea logică a aplicației.
Rolul controllerului este acela de a coordona firul de execuție al aplicației.
De exemplu, un controller poate selecta informații dintr-o baza de date, urmând apoi sa le trimită catre un view.
Cand un utilizator acceseaza un URL in browser, acel URL corespunde (se verifica tabelul de route), unei singure metode in controllerul asociat.
Cand un request este trimis la server, in funcție de forma URL-ului (Ex:/elevi/12/note), si de tipul de request(GET,POST,DELETE,PUT,STORE,etc), tabelul de routare va conduce catre metoda corespondentă a acestui tuplu, din controller.
Laravel dispune de funcții avansate pentru controller, cum ar fi:
Inversion of Control(IoC)
Dependency Injection
Controllere “Resourceful” – facute special pentru operații CRUD pe un anume model.
Metode dinamice pentru trimiterea datelor catre view-uri (withVariabila($valoare), withErrors(MessageBag $erori), clasa Response, etc.)
Exemplu Controller:
<?php
class EleviController extends BaseController {
public function index() {}
public function add() {}
public function store() {}
public function edit($id) {}
public function update($id) {}
public function destroy($id) {}
public function view($id) {}
public function metodaMeaCustom() {}
}
?>
Rute
O rută este o intrare din tabelul de rutare Laravel MVC, aceasta este compusă din: forma URL-ului, tipul de request si acțiunea care se efectuează la request.
Exemplu de rută, care afisează o listă de elevi:
Route::get(“/elevi/lista”,”EleviController@index”);
Exemplu de rută resourceful pentru modelul Produs:
Route::resource(“/produse”,”ProduseController”);
Numirea rutelor:
Route::post(“/login”,[“as”=>”procesarelogin”,”uses”=>”AuthController@procesareLogin”]);
Prezentarea platformei Micosoft .NET
Prezentare generală
Platforma .NET 4.5 este un cadru de dezvoltare a softului, sub care se vor realiza , distribui , și rula aplicații de tip Windows Form,Windows Phone, aplicații WEB si servicii WEB.
.NET Framework conține un nivel de abstractizare intre aplicați si nucleu sistemului de operare, pentru a asigura portabilitatea codului, deasemenea integrează tehnologi care au fost lansate de catre Microsoft incepând cu mijlocul anilor 90(srvici WEB, XML,ActiveX,etc).
1.Undelte de dezvoltare- un set de limbaje(C#,Visual Basic, C++,etc);
2.Medii de dezvoltare- Visual Studio,Visio;
3.Servere speciazizate –SQL Server 2012, SharePoint.
Arhitectura platformei Microsoft .NET
Fig. 12 Arhitectura platformei .NET
Figura 12 exemplifică modul de lucru al platformei .NET. Orice program scris in limbajele .NET este compliat in COMMON INTERMEDIATE LEANGUAGE.
Aceste limbaje sunt sprijinite de o bogată colecție de bibliotecii și clase, ce pun la dispoziție facilități pentru dezvoltarea de aplicații.
Comunicarea dintre aplicații si servicii se face pe baza unor clase de manipulare XML si a datelor ceea ce sprijină dezvoltarea aplicațiilor cu arhitectura n-tier.
La baza tuturor se află cea mai importanta component a lui .NET Framework-CLR (Common Leanguage Runtime) , care răspunde de execuția fiecarui program.
Trăsături ale platformei .NET
Platforma .NET este caracterizata de următoarele trăsături caracteristice:
Dezvoltarea multilimbaj;
Independența de procesor si platformă;
Managementul automat al memoriei;
Suport pentru versionare;
Sprijinirea standardelor deschise;
Distribuirea ușoară;
Arhitectură distribuită;
Securitate a datelor.
Prezentarea limbajului de programare C#
Scurt istoric
//baga scurt istoric
Tipuri de date
1.Tipuri de date predefinite:
Object: tipul de bază al orcarui tip;
String: o secvență de caractere Unicode
Short:tip intreg pe 8 biti;
Int:tip intreg cu semn pe 16 biti;
Long:tip intreg cu semn pe 64 biti;
Float : tip cu virgulă mobilă,simplă precizie
Double:tip cu virgiulă mobile,dublă precizie;
Bool: tip Boolean returnează true sau false;
Char:tip character
Decimal:tip zecimal cu 28 de cifre semnificative.
2.Tipuri de date dinamice
Tipurile de date dinamice permit tratarea unui obiect fară a ne interesa proveniența acestuia. Unui astfel de obiect i se pot transmite mesaje iar legitimitatea acestor apeluri este verificată la rulare.
Acest tip de date dynamic se declară prin cuvantul cheie dynamic.
Exemplu:
dynamic x = MetodaMea();
x.AltaMetoda(3);
Clase,metode,interfețe si delegați
1.Clase
Clasele reprezintă tipuiri referintă . O clasă poate sa moștenescă o singură clasă si poate să implementeze mai multe interfețe.
Modificatori de clasă sunt :
Public
Este accesibil oriunde ;
Pate fi folosit atât pentru clase imbricate cât si pentru clase care sunt continuțe in spatii de nume;
Exemplu:
Exeplu de declarare a unei clase:
namespace WindowsPhoneCatalog
{
public class ClientWeb
{}
}
Internal
Este folosit doar de clasele imbricate;
Semnificaă acces permis doar in clasa sau in spațiul de nume care o cuprinde.
Protected
Este specific claselor imbricate;
Poate fi accesat in clasa curentă sau in clasele derivate.
Exemplu:
public protected class test{}
Private
Este folosit doar de clasele imbricate;
Are acces limitat la clasa continatoare;
Este modificatorul implicit.
Exemplu:
private class test { }
New
Este utilizata doar de clasele imbricate;
Clasa declarată “new” ascunde un membru cu același nume care este moștenit.
Exemplu:
public new class test{}
Sealed
Nu poate fi mostenită;
Poate fi clasa imbricate sau nu.
Exemplu:
public sealed class test {}
Abstract
Clasă incomplet definită;
Nu poate fi instanțiată;
Folosit pentru clase imbricate ;
Toate metodele declarate in ea cu modificatorul de acces abstract trebuiesc suprascrise in clasa care o derivează.
Exemplu:
public abstract class test { }
Partial: clasă definită in mai multe fișiere.
Clasele pot conține constante, metode, evenimente, constructori, operatori, tiputi imbricate.Fiecare membru la clasei poate conține cate un nivel de protecție care controlează gradul de acces la el.
Modificatori de acces ai membrilor unei clase sunt:
Public:acces nelimitat;
Protected : acces limitat in clasa din care face parte sa la tipul derivate din ea
Internal : acces limitat la acest assembly;
Protected internal: acces limitat la acest assembly sau la tipuri derivate din clasă;
Private : acces limitat la clasă;modificatorul implicit de acces.
2.Metode
O metodă este un membru care implementează o acțiune care poate fi efectuată de catre un obiect sau o clasă.
Sintaxa de declarare a unei metode:
public void informatiElev()
{
Console.WriteLine("nume");
Console.ReadKey();
}
Modeificatori de acces ai unei metode pot fii:
New
Static
Virtual
Sealed
Override
Abstract
Tipul de return a unei metode poate fi orice tip de dată care este cel puțin la fel de accesibil ca si metoda insăși sau void(absenta informatiei returnate);
3.Interfețe
O interfață definește un contract.O clasă care implementează o interfată trebuie să suprascrie si toate metodele din interfată.Dacă aceste metode nu sunt suprascrise vom primi eroare la compilare.
O interfata nu poate fi instantiată doar implementată.
Modificatori de acces ai interfeței sunt:new,public,protected,internal,private.
O clasă poate să implementeze una sau mai multe interfețe.
Corpul unei interfețe conține declarați de metode fară implementări.Tipul de return al metodei din clasa care implementează interfața trebuie sa coincidă cu tipul de return al metodei din interfată, tipul parametrilor formali din metoda trebuie sa coincidă cu tipul parametrilor din interfată, metoda din clasă trebuie sa fie declarată publică si nestatică.
Exemplu:
public interface ITransactions
{
// metodele interfetei
void showTransaction();
double getAmount();
}
4.Delegați
Un delegat este un tip referintă folosit pentru a incapsula o metodă cu un anumit antet. Orice metodă care are acest antet poate fi legată la un anumit delegat. Delegați in C# rezolvă același lucru pe care il rezolvau pointeri in C++, dar intr-o manieră orientată pe obiect si cu garanții asupra codului rezultat.
Un delgat are urmatoarea sintaxa:
delegate <return type> <delegate-name> <parameter list>
Modificatori utilizați de delegații pot fi: new, public, protected, internal si private.
Un delegat poate fi creat in interiorul unei clase , cât și in exteriorul acesteia, fiind o declarație din clasa derivată din System.Delegate.
Exemplu:
public delegate int nume(object o1, object o2);
Polimorfism
Polimorfismul este capacitatea unei entități de a lua mai multe forme.
Polimorfismul poate fi de trei feluri:
Parametric: acest tip de polimorfism permite implementarea de funcții care pot prelucra orice număr de parametri, acest lucru se poate obține prin folosirea in C# a unui parametru de tip params.
Ad-hoc: acest tip de polimorfism se manifestă prin supraâncarcarea claselor, acest lucru find posibil prin scrierea in interiorul claselor a mai multor metode care au același nume dar tipuri si numere diferite de parametrii de apel.
Moștenire:este forma cea mai evoluată de polimorfism.Acest tip de polimorfism depinde foarte mult de ierarhia claselor.
Colecții de tip listă si dicționar
1.Liste
Colecțiile de tip listă sunt de mai multe tipuri:
ArrayList:este o clasa concreta care stocheza o colectie de elemente sub forma unui vector auto-redimensionabil. Acest tip suporta mai multi cititori concurenti si poate fi accesat ca un vesctor.
BitArray:tipul acesta de colectie gestioneaza un vector alcatuit doar din date binare reprezentate de tipul boolean, cele mai importante metode fiind:And,Or ,Xor,Not.
Stack:reprezinta o colectie ce permite lucrul conform principiului LIFO.
Queue:reprezinta o colectie ce permite lucrul conform politici FIFO.
CollectionBase:reprezinta o clasa abstracta , bazata pe o colectie puternic tipizata.
2.Dictionar
Colectiile de tip dictionar sunt de 3 tipuri , acestea contin date care sunt manipulate prin intermediul cheii asociate. Acesta extend interfata IDictionary.
Hashtable: reprezinta o colectie de tipul (cheie,valoare).O chei nu poate fi nula.
SortedList: reprezinta o colectie de tipul(cheie,valoare),care sunt sortate dupa chei si se poat acesa dupa cheie sau dupa index.
DictionaryBase: reprezinta o clasa de baza abstracta pentru implementarea unui dictionar utilizator puternic tipizat.Valorile nu sunt vazute ca obiect ci ca tipul specificat de utilizator.
Instructiunile try,catch,finally
Acest tip de instructiunii sunt folosite pentru tratarea exceptiilor.
Exemplu:
Public void afiseaza()
{
Try{
//corpul metodei
}catch(Exception ex)
{
Console.WriteLine(“Eroarea este” + ex);
}
Finally{
Console.WriteLine(“Finalul Programului”);
}
}
Clase specifice .NET folosite in creearea aplicației
In crearea aplicației finale am folosite o serie de clase si metode aferente claselor folosite, pentru a manipula si a expune in mod eficient datele preluate din baza de date cu ajutorul api-ului construit. Aceste clase au datoria de a prelua, transmite si decripta informatii.
Clasa HttpWebRespounse
Sintaxa:
[SerializableAttribute]
public class HttpWebResponse : WebResponse,
ISerializable
Metode:
Close-inchide conexiunea;
CreateObjRef-creaza un obiect care va contine toate elementele necesare pentru a comunica cu un obiect la distanta;
Dispose()-va elibera toate resursele folosite de catre obiect;
Equals(Object)-determina daca doua instante ale clasei sunt egale;
GetResponseHeader-contine partea de inceput al raspunsului;
GetResponseStream – obtine fluxul de date catre raspuns;
GetType:primeste tipul instantei curente;
ToString:returneaza un sir care reprezinta obiectul current.
Cocluzie:
Acesta clasa contine suprot pentru comunicarea HTTP.Acesta este folosită pentru a trimite cereri si a primi raspunsuri folosind protocolul HTTP
Exemplu:
HttpWebResponse r = (HttpWebResponse)((HttpWebRequest)result.AsyncState).EndGetResponse(result);
Debug.WriteLine(r.Cookies.Count + "");
dynamic raspuns = ClientWeb.procesare(r);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
procesare(raspuns);
});
Clasa HttpWebRequest
Sintaxa:
public class HttpWebRequest : WebRequest
Metode:
GetRequestString-metoda este folosita pentru a scrie informatiile in fluxul de date care va fi trimis clientului
CreateHttp-metoda este folosita pentru a initializa o conexiune bazata pe protocolul HTTP
GetRespounse-este folosita pentru a obtine raspunsul de la client;
EndRequestStream(IAsyncResult)-metoda este folosita pentru a obtine datele de la client, inchidera conexiuni ; acesta metoda ruleaza intr-un context asincron;
Cncluzie:
Aceasta clasa reprezinta o extensie a clasei HttpWebResponse.Prin intermediul acestei clase programatorul poate sa trimita requesturi de tip HTTP sis a primeasca raspunsul.Clasa WebRespounse este folosita doar pentru a primi raspunsuri HTTP.
Exemplu:
HttpWebRequest req = WebRequest.CreateHttp(url);
Clasa CookieContainer
Sintaxa:
[SerializableAttribute]
public class CookieContainer
Concluzie:
Clasa CookieContainer reprezinta defapt menegerul fisierului TXT in care un singur obiect HTTP client isi poate salva si poate citi, la fiecare request , cookie-urile (acestea sunt salvate la sfarsitul ciclului de viata al requestului, in format cURL).
Exemplu:
public static CookieContainer cookies = new CookieContainer();
public static void get(string url,ProcesareRaspuns procesator)
{
HttpWebRequest req = WebRequest.CreateHttp(url);
req.CookieContainer = cookies;
req.Method = "GET";
AsyncCallback cb = new AsyncCallback(procesator.proc);
req.BeginGetResponse(cb, req);
}
Clasa AsyncCallBack
Sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void AsyncCallback(
IAsyncResult ar
)
Metode:
BeginGetResponse: metoda este folosita pentru a obtine un raspuns de la client;metoda este executata intr-un context asincron , pentru a evita blocarea interfetei grafice.
EndGetRespounse:metoda este utilizata pentru obtinerea rezultatului propriu zis,care este un obiect de tip WebResponse.
Concluzie:
Clasa AsyncCallBack are un singur constructor care are ca si parametru o metoda care are tipul returnat void si are un parametru de tipul IAsyncResult(prin intermediul acestui parametru programatorul va obtine raspunsul de tip HTTP).
Exemplu:
AsyncCallback cb = new AsyncCallback(procesator.proc);
req.BeginGetResponse(cb, req);
Clasa StreamReader
Sintaxa:
[SerializableAttribute]
[ComVisibleAttribute(true)]
public class StreamReader : TextReader
Metode:
Constructor(Stream):prin intermediul acestui parametru este specificata sursa de date, pentru care va creea strimul;
ReadToEnd: va returna toate datele din stream sub forma sirurilor de caractere;
ReadToEndAsync: va returna toate datele din stram dar intr-un context asyncron;
Close:inchide fluxul de date;
EndOfStream: este folosita pentru a verifica daca sa ajuns la sfarsitul fluzului de date
Concluzie:
Aceasta clasa este folosita pentru a pune la dispozitia programatorului, un mod mai usor de a citi fluxuri de date.
Exemplu:
StreamReader s = new StreamReader(raspuns.GetResponseStream());
string rez = s.ReadToEnd();
s.Close();
Serializarea obiectelor cu JSON
JSON este un acronim în limba engleză pentru JavaScript Object Notation, și este un format de reprezentare si interschimb de date intre aplicațiile informatice.
Este un format text, inteligibil pentru oameni, utilizat pentru reprezentarea obiectelor si a altor structuri de date și este folosit in special pentru a transmite date structurate prin retea, procesul purtând numele de serializare. JSON este alternativa mai simplă și mai eficientă decat XML.
Eleganța formatului JSON provine din faptul că este un subset al limbajului JavaScript, fiind utilizat alături de acest limbaj.
Tipul de media pe acre trebuie să il transmită un document JSON este aplication/json.
Extensia fișierelor JSON este .json.
Exemplu:
{
"book": [
{
"id":"01",
"language": "Java",
"edition": "third",
"author": "Herbert Schildt"
},
{
"id":"07",
"language": "C++",
"edition": "second"
"author": "E.Balagurusamy"
}]
}
Preentare Windows Phone
Windows Phone este un sistem de operare pentru dispositive mobile dezvoltata de catre Microsoft și este succesorul platformei Windows Mobile.
Windows Phone a aparut pentru prima data in pe data de 15 februarie 2010.
Structura unei aplicatii Windows Phone si limbajul de marcare XAML
Într-o aplicatie windows phone se poate naviga catre o nouă pagină si apoi catre pagina anterioară cu ajutorul butoanelor puse la dispozitie de catre telefon.Elemente de baza ale acestui model de navigare este reprezentat de un containe de nivel superior numit PhoneApplicationFrame , care conține mai multe pagini .
Orice clasă care este folosită pentru reprezentarea unei pagini trebuie să moștenească clasa printe PhoneApplicationPage.
Fiecare clasa care reprezinta o pagina are asociata un fisier cu extensia .xaml care va contine stilui pagini.
Exemplu de navigare:
NavigationService.Navigate(new Uri("/ProfesorListaClase.xaml", UriKind.RelativeOrAbsolute));
Stilul unei pagini dintr-o aplicatie Windows Phone
Stilul unei pagini dintr-o aplicatie Windows Phone este creat prin intermediul unui limbaj de marcare dezvoltat de catre echipa Microsoft si care poarta numele de XAML.
XAML este un limbaj de marcare declarativ cu ajutorul caruia putem creea elemente grafice , care ulterior vor fii actionate de catre partea logica a aplicatiei.
Fisierul cu extensia XAML reprezinta de fapt o clasa partiala care impreuna cu fisierul .CS formeaza o singura clasa, realizand pagina dorita de catre dezvoltator.
Exemplu de creearea unor elememte in XAML:
<StackPanel x:Name="LayoutRoot" Width="480" Height="480" Background="{StaticResource PhoneChromeBrush}">
<TextBlock TextWrapping="Wrap" Text="Introduceti nota:" FontSize="30"/>
<TextBox x:Name="tbx"/>
<CheckBox x:Name="cbTeza" Content="Este teza ?"/>
<Button x:Name="btnOK" Content="OK"/>
<Button x:Name="btnCancel" Content="Cancel"/>
</StackPanel>
Dupa cum pute-ti observa mai sus sunt prezentate cateva elemente care creeaza designul unei pagini in XAML.
Creearea de taguri in XAML duce la creearea de obiecte specific fiecarui tab. Aceste obiecte fiind folosite ulterior in partea logica a aplicatiei.
Starile unei aplicatii Windous Phone:
O aplicatie Windous Phone are sapte starii dupa executie :
Running(Aplicatia Ruleaza): dupa ce aplicatia a fost lasata in executie ea continua sa ruleze pana cand utilizatorul navigheaza inainte sau inapoi din aplicatie.
OnNavigatedForm():Aceasta metoda este chemata ori de cate ori utilizatorul navigheaza catre o alta pagina din aplicatie.
Dezactived Event(Evenimentul de dezactivare):Acest eveniment este declansat de utilizator prin apasarea butonului Start sau prin lansarea unei alte aplicatii.
Dormant(Inactiv): În momentul în care utilizatorul navighează înainte,în afara aplicației se va declanșa evenimentul Deactivated iar sistemul de operare va pune aplicația într-o stare de inactivitate.În această stare toate firele de execuție ale aplicației sunt oprite și nici o procesare nu mai are loc dar aplicația rămâne intactă în memoria RAM a telefodnului.
Tombstone: O aplicație care a fost terminată de către sistemul de operare ale cărei informații din memoria RAM ea va fi păstrată de sistemul de operare într-o zonă de memorie persistentă(pe disc).
Activated Event(Evenimentul de activare):aceste evenment este declansata atunci cand utilizatorul se intoarce la o aplicatie care a fost in starea TombStone sau in starea de inactivitate.
Closing Event(Evenimentul de inchidere): aceste eveniment este declansata cand utilizatorul navigheaza inapio in aplicatie , cand se afla in prima pagina a acesteia.
Creearea si Utilizarea aplicatiei
Baza de date
Prezentare
Baza de date create prentru aplicatia finala este o baza de date MySQL. Ca interfata grafiga de administrare am folosit aplicatia HeidiSQL care pune la dispozitia utilizatorului foarte multe prprietati pentru a ne usura munca (crearea de tabele automat, insearrea de date,setarea cheilior primare si secundare.)
Creearea si folosirea bazei de date
Baza de date a aplicateiei Windows Phone catalog este constituita din sase tabele dupa cum urmeaza:user,materie, clasa, nota, absenta, professor_materie_clasa;
Fig.13 Prezentarea Bazei de Date
1.Tabelul “USER” :
Este folosit pentru a stoca datele de logare ale elevilor, profesorilor si profesorilor diriginti.
Cheia primara in acest tabel este coloana “ID”, iar in tabel sunt folosite si doua chei secundare diriginte si clasa_id ambele coloane regasinduse si in tabelul clasa.
Pentru a putea sa se atutentifice un profesor sau un elev trebuie neaparat sa fie introduse datele din coloanele username si parla , colane e_prof facand diferenta dintre profesor sau elev;
Sintaxa de creare a tabelului:
create table user (
id int primary key AUTO_INCREMENT,
e_prof BOOL NOT NULL DEFAULT false,
username VARCHAR(50) NOT NULL,
parola VARCHAR(200) NOT NULL,
nume VARCHAR(200) NOT NULL,
diriginte int,
clasa_id int,
foreign key (diriginte) references clasa(id) on update cascade,
foreign key (clasa_id) references clasa(id) on delete cascade on update cascade
)
2.Tabelul “Materie”:
Este folosit pentru stocarea matriilor predate de catre profesori aferenti.
Materiile sunt distinte de catre profesori prin cheia primara a acestora ”ID”, in acest tabel ne avend chei secundare.
Sintaxa de creeare a tabelului:
create table materie(
id int primary key AUTO_INCREMENT,
denumire VARCHAR(100) NOT NULL
)
3.Tabelul”Materie”:
Tabelul materie este folosit pentru a stoca informaii despre materiile predate in “unitatea de invatamant ” unde este folosita aplicatia;
Cheia primara a acestui tabel este constituita de coloana”id” , in acest tabel ne avand chei secundare;
Sinaxa de creeare a tabelului :
create table materie(
id int primary key AUTO_INCREMENT,
denumire VARCHAR(100) NOT NULL
)
4.Tabelul”profesor_materie_clasa”:
Tabelul “profesor_materie_clasa” este un tabel creeat pentru a ne ajuta in a manipula cu usurinta datele din tabelele ale caror chei primare formeaza acesta tabel;
Cheia primara este fromata din trei chei secundare
profesor_id,: cheiea primara in tabelul “profesor”;
materie_id: cheia primara in tabelul “materie”;
clasa_id : cheia primara in tabelul “clasa”;
Sintaxa de creeare a tabelului:
create table profesor_materie_clasa(
profesor_id int not null,
materie_id int not null,
clasa_id int not null,
foreign key(profesor_id) references user(id) on delete cascade on update cascade,
foreign key(materie_id) references materie(id) on delete cascade on update cascade,
foreign key(clasa_id) references clasa(id) on delete cascade on update cascade,
primary key(profesor_id,materie_id,clasa_id)
)
5.Tabelul”nota”:
Tabelul nota este folosit pentru a stoca notele acordate fiecarui elev de profesor la materia care preda;
Cheia primara a tabelui este constituita de coloana “id” iar in tabel sunt folosite si trei chei secundare profesor_id, materie_id si clasa_id aferente tabelelor user, matreie, clasa;
Pentru a putea pune o nota profesorul trebuie sa introduca valoarea note acordate, data la care a fost acordata sis a bifeze (daca este cazul) profrietatea notei daca este teza sau nu;
Pentru colane data am folosit un tip characteristic numit : Date ;;
Sintaxa de creeare a tabelului:
create table nota(
id int primary key AUTO_INCREMENT,
elev_id int not null,
materie_id int not null,
profesor_id int not null,
e_teza BOOL NOT NULL DEFAULT false,
valoare int NOT NULL,
`data` DATE NOT NULL,
foreign key(elev_id) references user(id) on delete cascade on update cascade,
foreign key(materie_id) references materie(id) on delete cascade on update cascade,
foreign key(profesor_id) references user(id) on update cascade
)
6.Tabelul”abesenta”:
Tabelul absenta este folosit de a stoca date depre elevii care au lipsit , la ce materie si la ce ora;
Cheia primara a tabelui este constituita de coloana “id” iar in tabel sunt folosite si trei chei secundare profesor_id, materie_id si clasa_id aferente tabelelor user, matreie, clasa La o singura materie pot fi adaugate mai multe absente;
Un profesor poate adauga una si motiva o absenta fata de profesorul diriginte care poate doar motiva absente;
Sintaxa de creeare a tabelului;
create table absenta(
id int primary key AUTO_INCREMENT,
elev_id int not null,
materie_id int not null,
profesor_id int not null,
motivata BOOL NOT NULL DEFAULT false,
`data` DATE NOT NULL,
foreign key(elev_id) references user(id) on delete cascade on update cascade,
foreign key(materie_id) references materie(id) on delete cascade on update cascade,
foreign key(profesor_id) references user(id) on update cascade
)
Pentru a avea o imagine mai buna asupara bazei de date , a tabelelor si a legaturilor dintre tabele mai jos este prezenta o diagrama am bazei de date dbcatalog.
//diagram bazei de date
Preluarea si utilizarea datelor
Dupa ce am creeat si populat tabelel din baza de date, a trebuit sa creem o aplicatie care sa selecteze datele si sa le transmita mai departe in aplicatiea Windows Phone pentru a putea sa le expunem visual utilizatorilor.
Pentru a putea manipula datele am creat aplicatia “Catalog-PHP” in limbaajul de programare PHP alaturi de framework-ul Laravel .
In continuare vom prezenta clasele si metodele care vin in ajutorul trasmiteri datelor.
In primul rand am creeat un model de raspuns care codeaza si decodeaza datele primate de la aplicatia Windows Phone Catalog si le transmite catre baza de date ;
Models
Models/Raspuns.php
class Raspuns {
private $rasp = [];
//constructorul clasei
public function __construct() {
$this->rasp["succes"] = true;
$this->rasp["eroare"] = "";
}
//Modelul dupa care sunt adaugate datele
public function adaugareDate($cheie,$valoare) {
$this->rasp[$cheie] = $valoare;
}
//modelul de eroare
public function eroare($texteroare) {
$this->rasp["succes"] = false;
$this->rasp["eroare"] = $texteroare;
}
//functia care codeaza raspunsul in limbajul serializabil JSON
public function scoateJSON() {
return json_encode($this->rasp,true);
}
}
Acesta clasa se ocupa cu modelul de raspuns primit si transmis mai departe catre aplicatia finala sau catre baza de date;
Urmatoarea clasa creeata este User.php:
Models/User.php
In component acestei clase gasim urmatoarele functii : noteDate(), absenteDate(), clasa(), noteElev(), absenteElev();
Aceasta clasa se ocupa cu transmiterea catre baza de date a informatiilor referitoare la notele si absentele fiecarui elev, dar si cu informatii despre profesorul care le-a acordat.
Urmatoarea clasa creeata este Materie.php.Aceasta clasa a fost create dor sa putem folosi tabelul “Materie” din baza de date.
Models/Materie.php
Urmatoarea clasa creeata este clasa: Clasa.php care are in interiorul sau doua functii care verifica daca un copil este elev la o anumita clasa si o functie care returneaza numele clasei;
Models/Clasa.php
Urmatoarea clasa create este clasa:Nota.php care are in component urmatoarel functii:
elev()-care returneaza elevul caruia ia fost punasa nota;
profesor()-care returneaza profesorul care a pus nota;
materie()-care returneaza material la care a fost pusa nota.
Ultima clasa din folderul “Models” este constituita de clasa Absenta.php care are in component urmatoarele functii:
elev()-returneaza elvul care a primit absenta;
profesor()- returneaza profesorul care a pus absenta;
materie()-returneaza material la care a fost pusa absenta.
Route
Incontionarea proiectului am creat route-le care face legatura dintre models si controller.
1.Crearea filtrelor care returneaza ce fel de utilizator este logat;
FiltruLogat
FiltruProfesor
FiltruElev
FiltruDiriginte
2.Creearea rutelor pentru elevi
3.Creearea routelor pentru profesori
4.Crearea routelor pentru profesorii dirigintii.
Controllers
Pentru a putea extrage date din baza de date si a le folosi incontinuare am creat urmatoarele clase in folderul Controllers din proiectul “Catalog-PHP”;
1.LoginController.php – este controllerul care se ocupa cu login-ul in aplicatie .
2.ProfesorController.php-aceasta clasa se ocupa cu etragerea din baza de date a informatiilor despre materiile pe care le preda un profesor si clasele la care preda.
-codul integral al clase se regaseste in Anexa 1 a proiectului;
3.ElevController.php-aceasta clasa se ocupa cu extargerea dein baza de date a materiilor, notelor si absentelor pe care le are un elev.
-codul integral al clase se regaseste in Anexa 1 a proiectului;
4.ListaEleviController.php-returneaza lista cu elevi care apartin unei clase si care sunt la o anumita materie.
5.DiriginteController.php-acesata clasa se ocupa cu extragerea de date din baza de date referitoare la clasa unde un profesor este diriginte;clasa are in componeta urmatoarele functii:
listaEleviSiMaterii()-returneaza lista de materii care sunt predate la o anumita clasa si lista de elevii care sunt in acea clasa;
listaDateElevi()-returneaza lista de note si absenta ale unui elev;
mativareAbsenta()-functia prin care un profesor diriginte motiveaza unui elev o absenta.
-codul integral al clase se regaseste in Anexa 1 a proiectului;
6.DateElevController.php-acesta functie se ocupa cu inserarea si extraderea din baza de date a informatiilor despre un elev;in component clasei avem urmatoarele metode:
dateElev()-returneaza informatii despre numele elevului,clasa din care face parte si materia despre care vrem sa aflam informatii;
adaugareNota()-functia care adauga note in baza de date;
adaugareAbsenta()-functia care adauga absenta in baza de date;
motivareAbsente()-functia care motiveaza absentele unui elev;
codul integral al clase se regaseste in Anexa 1 a proiectului;
Windows Phone Catalog
Pentru a putea expune vizual datele extrase din baza de date cu ajutorul API-ului “Catalog-Php” am creat in aplicatia Visual Studio(Windows Phone SDK 8.0) un proiect windows phone sub numele de Windows Phone Catalog care are in componeta sa atat clase C# care au datoria de a procesa datele primate de la API-ul creat mai sus dar si de a expune aceste date vizual prin paginile .XAML specifice aplicatiilor Windows Phone.
Incontinuar este prezentata structura proiectului WindowsPhoneCatalog.
Models-Windows Pohone
Pentru a putea lucra ma usor cu datele primate de la API am creat o serie de modele dupa datele din baza de date dupa cum urmeaza.
1.Model/Elev.cs –returneaza numele elevului;
namespace WindowsPhoneCatalog.Model
{
public class Elev
{
public int Id { get; set; }
public string Nume {get; set; }
public Elev(int id, string nume)
{
this.Id = id;
this.Nume = nume;
}
public override string ToString()
{
return Nume;
}}}
2.Model/UserLogat.cs –returneaza ce tip de utilizator este logat;
namespace WindowsPhoneCatalog.Model
{
public class UserLogat
{
public static bool e_diriginte = false;
public static bool e_prof = false;
}
}
3.Model/Clasa.cs –returneaza numele clasei din care face parte elevul;
namespace WindowsPhoneCatalog.Model
{
public class Clasa
{
public string Nume { get; set; }
public int Id { get; set; }
public Clasa(int Id, string Nume)
{
this.Id = Id;
this.Nume = Nume;
}
public override string ToString()
{
return Nume;
}
}
}
4.Model/Materie.cs- returneaza numele metariei;
namespace WindowsPhoneCatalog.Model
{
public class Materie
{
public string Nume { get; set; }
public int Id { get; set; }
public Materie(int Id, string Nume)
{
this.Id = Id;
this.Nume = Nume;
}
public override string ToString()
{
return Nume;
}}}
5.Model/Nota.cs – returneaza valoarea si tipul notei pe care o primeste elevul;
namespace WindowsPhoneCatalog.Model
{
public class Nota
{
public bool EsteTeza { get; set; }
public int Id { get; set; }
public int Valoare { get; set; }
public string Data { get; set; }
public Nota(int id, int valoare, bool eteza,string data)
{
this.Id = id;
this.Valoare = valoare;
this.EsteTeza = eteza;
this.Data = data;
}}}
6.Model/Absenta.cs –returneaza daca o absenta este motivate sau nu si data la care a fost pusa;
namespace WindowsPhoneCatalog.Model
{
public class Absenta
{
public bool Motivata { get; set; }
public int Id { get; set; }
public string Data { get; set; }
public Absenta(int id, bool motivata,string data)
{
this.Data = data;
this.Id = id;
this.Motivata = motivata;
}
}}
Clase de baza – Windows Phone
1.Setari.cs- clasa care memoreza stringul de conecatre la servarul nostru;
namespace WindowsPhoneCatalog
{
public class Setari
{
public static string url = "http://192.168.?.?:8000/";
}
}
2.ClientWeb- clasa care face legatura dintre aplicatia Windows Phone si API-ul Catalog-PHP
Metodele clasei ClientWeb fiind urmatoarele:
– public static void get(string url,ProcesareRaspuns procesator)
– public static dynamic procesare(HttpWebResponse raspuns)
namespace WindowsPhoneCatalog
{
public class ClientWeb
{
public static CookieContainer cookies = new CookieContainer();
public static void get(string url,ProcesareRaspuns procesator)
{
HttpWebRequest req = WebRequest.CreateHttp(url);
req.CookieContainer = cookies;
req.Method = "GET";
AsyncCallback cb = new AsyncCallback(procesator.proc);
req.BeginGetResponse(cb, req);
}
public static dynamic procesare(HttpWebResponse raspuns)
{
try
{
StreamReader s = new StreamReader(raspuns.GetResponseStream());
string rez = s.ReadToEnd();
s.Close();
dynamic data = JsonConvert.DeserializeObject<dynamic>(rez);
return data;
}
catch (Exception)
{
return null;
}
}
}
}
3.ProcesareRaspuns.cs- clasa abstracta care este extinsa de toate clasele care proceseaza date din baza de date cu ajutorul API-ului prezentat anterior;
namespace WindowsPhoneCatalog
{
public abstract class ProcesareRaspuns {
public abstract void procesare(dynamic raspuns);
public void proc(IAsyncResult result)
{
try
{
HttpWebResponse r = (HttpWebResponse)((HttpWebRequest)result.AsyncState).EndGetResponse(result);
Debug.WriteLine(r.Cookies.Count + "");
dynamic raspuns = ClientWeb.procesare(r);
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
procesare(raspuns);
});
} catch (Exception e)
{
Debug.WriteLine(e.Message);
}
}
}
}
Procearea si expunerea datelor
1.Login
ProcesareLogin.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareLogin:ProcesareRaspuns
{
private Login paglogin;
public ProcesareLogin(Login paglogin)
{
}
public override void procesare(dynamic raspuns)
{
if (!(bool)raspuns.succes)
{
MessageBox.Show((string)raspuns.eroare);
}
else
{
if ((bool)raspuns.e_prof)
{
paglogin.NavigationService.Navigate(new Uri("/Profesor.xaml", UriKind.Relative));
UserLogat.e_prof = true;
bool e_diriginte = (bool)raspuns.e_diriginte;
UserLogat.e_diriginte = e_diriginte;
}
else
{
paglogin.NavigationService.Navigate(new Uri("/Elevi.xaml", UriKind.Relative));
}
}
} }}
Login.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class Login : PhoneApplicationPage
{
public Login()
{
InitializeComponent();
}
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
ProcesareLogin procesator = new ProcesareLogin(this);
ClientWeb.get(Setari.url + "login?user=" + txtId.Text + "&pass=" + txtParola.Text,procesator);
}
}}
2.Lista materii profesor
ProcesareListaMaterii.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaMaterii:ProcesareRaspuns
{
private Profesor pag;
public ProcesareListaMaterii(Profesor pag)
{
this.pag = pag; }
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return; }
List<Materie> listaptgui = new List<Materie>();
foreach (dynamic materie in raspuns.materii)
{
int matid = (int)materie.id;
string matnume = (string)materie.nume;
Materie matinjson = new Materie(matid, matnume);
listaptgui.Add(matinjson);
}
//adaugam lista la lista de pe prof
pag.listaMaterii.ItemsSource = listaptgui;
}}}
Profesor.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class Profesor : PhoneApplicationPage
{
public Profesor()
{
InitializeComponent();
if (UserLogat.e_diriginte)
{
btnMeniuDirig.IsEnabled = true;
}
ProcesareListaMaterii plm = new ProcesareListaMaterii(this);
ClientWeb.get(Setari.url + "profesor/materiile_mele",plm);
}
private void btnMeniuDirig_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/DiriginteListaElevi.xaml",UriKind.Relative));
}
private void listaMaterii_SelectionChanged2(object sender, SelectionChangedEventArgs e)
{
if (listaMaterii.SelectedItem == null) return;
Materie selectata = (Materie)listaMaterii.SelectedItem;
PhoneApplicationService.Current.State["idmaterie"] = selectata.Id;
NavigationService.Navigate(new Uri("/ProfesorListaClase.xaml", UriKind.Relative));
listaMaterii.SelectedItem = null;
}}}
3.Lista clase profesor
ProcesareListaClase.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaClase:ProcesareRaspuns
{
private ProfesorListaClase plc;
public ProcesareListaClase(ProfesorListaClase plc)
{
this.plc = plc;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
List<Clasa> listaclase = new List<Clasa>();
foreach (dynamic clasa in raspuns.clase)
{
int id = (int)clasa.id;
string nume = (string)clasa.nume;
Clasa c = new Clasa(id, nume);
listaclase.Add(c);
}
plc.listaClase.ItemsSource = listaclase;
}}}
ProfesorListaClase.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class ProfesorListaClase : PhoneApplicationPage
{
private int idmaterie=-1;
public ProfesorListaClase()
{
InitializeComponent();
idmaterie = (int)PhoneApplicationService.Current.State["idmaterie"];
ProcesareListaClase plc = new ProcesareListaClase(this);
ClientWeb.get(Setari.url + "profesor/materia/" + idmaterie + "/clase", plc);
}
private void listaClase_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listaClase.SelectedItem == null) return;
Clasa clasa_selectata = (Clasa)listaClase.SelectedItem;
PhoneApplicationService.Current.State["idclasa"] = clasa_selectata.Id;
NavigationService.Navigate(new Uri("/ProfesorListaElevi.xaml", UriKind.Relative));
listaClase.SelectedItem = null;
}
}
}
4. Lista elevi(profesor)
ProcesareListaElevi.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaElevi:ProcesareRaspuns
{
private ProfesorListaElevi ple;
public ProcesareListaElevi(ProfesorListaElevi ple)
{
this.ple = ple;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
List<Elev> listaelevi = new List<Elev>();
foreach (dynamic elev in raspuns.elevi)
{
int id = (int)elev.id;
string nume = (string)elev.nume;
Elev e = new Elev(id, nume);
listaelevi.Add(e);
}
ple.listaElevi.ItemsSource = listaelevi;
} }}
ProfesorListaElevi.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class ProfesorListaElevi : PhoneApplicationPage
{
public ProfesorListaElevi()
{
InitializeComponent();
ProcesareListaElevi ple = new ProcesareListaElevi(this);
int idmaterie = int.Parse(PhoneApplicationService.Current.State["idmaterie"].ToString());
int idclasa = int.Parse(PhoneApplicationService.Current.State["idclasa"].ToString());
string urlul = Setari.url + "profesor/materia/" + idmaterie + "/clasa/" + idclasa;
ClientWeb.get(urlul, ple);
}
private void listaElevi_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listaElevi.SelectedItem == null) return;
Elev elevselectat = (Elev)listaElevi.SelectedItem;
PhoneApplicationService.Current.State["idelev"] = elevselectat.Id;
PhoneApplicationService.Current.State["numeelev"] = elevselectat.Nume;
NavigationService.Navigate(new Uri("/ProfesorListaNoteAbsente.xaml", UriKind.Relative));
listaElevi.SelectedItem = null;
}
}
}
5.Lista date elevii(profesor)
ProcesareListaDateElev.cs
-codul integral al clase se regaseste in Anexa 2 a proiectului;
ProfesorListaNoteAbsente.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class ProfesorListaNoteAbsente : PhoneApplicationPage
{
public ProfesorListaNoteAbsente()
{
InitializeComponent();
string numeelev = PhoneApplicationService.Current.State["numeelev"].ToString();
numeElev.Text = numeelev;
//date.ShowGridLines = true;
int idmaterie = int.Parse(PhoneApplicationService.Current.State["idmaterie"].ToString());
int idclasa = int.Parse(PhoneApplicationService.Current.State["idclasa"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["idelev"].ToString());
ProcesareListaDateElev plde = new ProcesareListaDateElev(this);
string url = Setari.url + "profesor/materia/" + idmaterie + "/clasa/" + idclasa + "/elev/" + idelev + "/dateelev";
ClientWeb.get(url,plde);
}
}
}
6.Adaugare note, absente si motivare absente
ProcesareAdaugareNota.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareAdaugareNota:ProcesareRaspuns
{
private ProfesorListaNoteAbsente plna;
public ProcesareAdaugareNota(ProfesorListaNoteAbsente plna)
{
this.plna = plna;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
MessageBox.Show("S-a adaugat nota");
//refresh
plna.NavigationService.Navigate(new Uri("/ProfesorListaNoteAbsente.xaml?" + DateTime.Now.Ticks, UriKind.Relative));
plna.NavigationService.RemoveBackEntry();
}
}}
ProcesareAdaugareAbsenta.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareAdaugareAbsenta:ProcesareRaspuns
{
private ProfesorListaNoteAbsente plna;
public ProcesareAdaugareAbsenta(ProfesorListaNoteAbsente plna)
{
this.plna = plna;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
MessageBox.Show("S-a adaugat absenta.");
plna.NavigationService.Navigate(new Uri("/ProfesorListaNoteAbsente.xaml?" + DateTime.Now.Ticks, UriKind.Relative));
plna.NavigationService.RemoveBackEntry();
}}}
ProcesareMotivareAbsenta.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareMotivareAbsenta:ProcesareRaspuns
{
private ProfesorListaNoteAbsente plna;
public ProcesareMotivareAbsenta(ProfesorListaNoteAbsente plna)
{
this.plna = plna;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
MessageBox.Show("S-a motivat absenta!");
//refresh
plna.NavigationService.Navigate(new Uri("/ProfesorListaNoteAbsente.xaml?" + DateTime.Now.Ticks, UriKind.Relative));
plna.NavigationService.RemoveBackEntry();
}
}
}
7.Lista de elevi(diriginte)
ProcesareListaEleviDiriginte.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaEleviDiriginte:ProcesareRaspuns
{
private DiriginteListaElevi dle;
public ProcesareListaEleviDiriginte(DiriginteListaElevi dle)
{
this.dle = dle;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
List<Elev> listaelevi = new List<Elev>();
foreach (dynamic elev in raspuns.elevi)
{
int id = (int)elev.id;
string nume = (string)elev.nume;
Elev e = new Elev(id, nume);
listaelevi.Add(e);
}
DiriginteListaMaterii.listaMaterii.Clear();
foreach (dynamic materie in raspuns.materii)
{
int id = (int)materie.id;
string nume = (string)materie.nume;
Materie m = new Materie(id, nume);
DiriginteListaMaterii.listaMaterii.Add(m);
}
dle.listaElevi2.ItemsSource = listaelevi;
}
}
}
DiriginteListaElevi.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class DiriginteListaElevi : PhoneApplicationPage
{
public DiriginteListaElevi()
{
InitializeComponent();
string url = Setari.url + "diriginte/listaelevisimaterii";
ProcesareListaEleviDiriginte pled = new ProcesareListaEleviDiriginte(this);
ClientWeb.get(url,pled);
}
private void listaElevi2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listaElevi2.SelectedItem == null) return;
Elev selectat = (Elev)listaElevi2.SelectedItem;
PhoneApplicationService.Current.State["diridelev"] = selectat.Id;
PhoneApplicationService.Current.State["numeelev"] = selectat.Nume;
NavigationService.Navigate(new Uri("/DiriginteListaMaterii.xaml",UriKind.Relative));
listaElevi2.SelectedItem = null;
}
}
}
8.Lista de materii(diriginte)
DiriginteListaMaterii.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class DiriginteListaMaterii : PhoneApplicationPage
{
public static List<Materie> listaMaterii = new List<Materie>();
public DiriginteListaMaterii()
{
InitializeComponent();
listaMaterii2.ItemsSource = listaMaterii;
}
private void listaMaterii2_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (listaMaterii2.SelectedItem == null) return;
Materie selectata = (Materie)listaMaterii2.SelectedItem;
PhoneApplicationService.Current.State["diridmaterie"] = selectata.Id;
NavigationService.Navigate(new Uri("/DiriginteListaNoteAbsente.xaml",UriKind.Relative));
listaMaterii2.SelectedItem = null;
}
}
}
9.Note si absente(diriginte)
ProcesareListaDateElevDiriginte.cs
-codul integral al clase se regaseste in Anexa 2 a proiectului;
ProcesareMotivareAbsentaDiriginte.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareMotivareAbsentaDiriginte:ProcesareRaspuns
{
private DiriginteListaNoteAbsente dlna;
public ProcesareMotivareAbsentaDiriginte(DiriginteListaNoteAbsente dlna)
{
this.dlna = dlna;
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
MessageBox.Show("S-a motivat absenta!");
//refresh
dlna.NavigationService.Navigate(new Uri("/DiriginteListaNoteAbsente.xaml?" + DateTime.Now.Ticks, UriKind.Relative));
dlna.NavigationService.RemoveBackEntry();
}
}
}
DiriginteListaNoteAbsente.xaml.cs
namespace WindowsPhoneCatalog
{
public partial class DiriginteListaNoteAbsente : PhoneApplicationPage
{
public DiriginteListaNoteAbsente()
{
InitializeComponent();
string numeelev = PhoneApplicationService.Current.State["numeelev"].ToString();
numeElev.Text = numeelev;
int idmaterie = int.Parse(PhoneApplicationService.Current.State["diridmaterie"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["diridelev"].ToString());
ProcesareListaDateElevDiriginte plded = new ProcesareListaDateElevDiriginte(this);
string url = Setari.url + "diriginte/materie/"+idmaterie+"/elev/" + idelev;
// Debug.WriteLine(url);
ClientWeb.get(url,plded);
}
}
}
Exemplu de clasa XAML
<phone:PhoneApplicationPage
x:Class="WindowsPhoneCatalog.DiriginteListaElevi"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
mc:Ignorable="d"
shell:SystemTray.IsVisible="True">
<!–LayoutRoot is the root grid where all page content is placed–>
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!–TitlePanel contains the name of the application and page title–>
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="CATALOG" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="Elevi" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!–ContentPanel – place additional content here–>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<phone:LongListSelector x:Name="listaElevi2" HorizontalAlignment="Stretch" Margin="5" VerticalAlignment="Stretch" ScrollViewer.VerticalScrollBarVisibility="Auto" ItemTemplate="{StaticResource ElementStyle}" SelectionChanged="listaElevi2_SelectionChanged" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
Utilizarea Aplicatiei Windows Phone Catalog
Anexe
Anexa 1
ProfesorController.php
class ProfesorController extends BaseController
public function materiileMele() {
$r = new Raspuns()
/*
* SELECT DISTINCT materie.* FROM materie INNER JOIN profesor_materie_clasa ON
materie.id = profesor_materie_clasa.materie_id
WHERE profesor_materie_clasa.profesor_id=????
*
$materii = Materie::join("profesor_materie_clasa", "materie.id", "=", "profesor_materie_clasa.materie_id")
->where("profesor_materie_clasa.profesor_id", "=", Auth::user()->id)
->distinct();
if ($materii->count() == 0) {
$r->eroare("Nu predati nicio materie!");
goto iesire;
}
$listamaterii = $materii->get(["materie.*"]);
$listaDate = [];
foreach ($listamaterii as $materie) {
$mat = [];
$mat["id"] = $materie->id;
$mat["nume"] = $materie->denumire;
$listaDate[] = $mat;
}
$r->adaugareDate("materii", $listaDate);
iesire:
return $r->scoateJSON();
}
public function claseleMele($idmaterie) {
$r = new Raspuns();
/*Select pentru a afla la ce clase preda un profesor
* SELECT clasa.* FROM clasa INNER JOIN
profesor_materie_clasa ON
clasa.id = profesor_materie_clasa.clasa_id
WHERE
profesor_materie_clasa.profesor_id=? AND profesor_materie_clasa.materie_id=?
*/
$clase = Clasa::join("profesor_materie_clasa", "clasa.id", "=", "profesor_materie_clasa.clasa_id")
->where("profesor_materie_clasa.profesor_id", "=", Auth::user()->id)
->where("profesor_materie_clasa.materie_id", "=", $idmaterie);
if ($clase->count() == 0) {
$r->eroare("Nu aveti nicio clasa la care predati aceasta materie!");
goto iesire;
}
$listaclase = $clase->get(["clasa.*"]);
$listaDate = [];
foreach ($listaclase as $clasa) {
$cls = [];
$cls["id"] = $clasa->id;
$cls["nume"] = $clasa->clasa . $clasa->litera;
$listaDate[]=$cls;
}
$r->adaugareDate("clase", $listaDate);
iesire:
return $r->scoateJSON();
}}
ElevController.php
class ElevController extends BaseController{
public function listaMaterii() {
$r = new Raspuns();
try {
$idclasa = Auth::user()->clasa_id;
$materii = Materie::join("profesor_materie_clasa","id","=","materie_id")
->where("profesor_materie_clasa.clasa_id","=",$idclasa)
->orderBy("materie.denumire")
->distinct()
->get();
$listaDate = [];
foreach ($materii as $materie) {
$mat = [];
$mat["id"] = $materie->id;
$mat["nume"] = $materie->denumire;
$listaDate[] = $mat;
}
$r->adaugareDate("materii", $listaDate);
} catch (Exception $ex) {
$r->eroare("Eroare baza");
goto iesire;
}
iesire:
return $r->scoateJSON();
}
public function noteAbsente($idmaterie) {
$r = new Raspuns();
try
{
$note = Auth::user()->noteElev()
->where("materie_id","=",$idmaterie) ->orderBy("data","desc")->get();
$absente = Auth::user()->absenteElev()
->where("materie_id","=",$idmaterie)
->orderBy("data","desc")
->get();
$listaDate = [];
foreach ($note as $nota) {
$nt = [];
$nt["data"] = $nota->data;
$nt["valoare"] = $nota->valoare;
if ($nota->e_teza) {
$nt["e_teza"] = true;
} else {
$nt["e_teza"] = false;}
$listaDate[] = $nt; }
$r->adaugareDate("note", $listaDate);
$listaDate = [];
foreach ($absente as $absenta) {
$nt = [];
$nt["data"] = $absenta->data;
if ($absenta->motivata) {
$nt["motivata"] = true;
} else {
$nt["motivata"] = false;}
$nt["id"] = $absenta->id;
$listaDate[] = $nt;}
$r->adaugareDate("absente", $listaDate);
} catch (Exception $ex) {
$r->eroare("Eroare baza");
goto iesire;
}
iesire:
return $r->scoateJSON();}
}
DiriginteController.php
class DiriginteController extends BaseController {
public function listaEleviSiMaterii() {
$r = new Raspuns();
try {
$clasa = Clasa::findOrFail(Auth::user()->diriginte)
$elevii = $clasa->elevi()->orderBy("nume")->get();
$materii = Materie::join("profesor_materie_clasa", "materie.id", "=", "profesor_materie_clasa.materie_id")
->where("profesor_materie_clasa.clasa_id", "=", $clasa->id)->groupBy("profesor_materie_clasa.materie_id")
->orderBy("materie.denumire")->distinct() ->get();
$listaDate = [];
foreach ($elevii as $elev) {
$el = [];
$el["id"] = $elev->id;
$el["nume"] = $elev->nume;
$listaDate[] = $el;}
$r->adaugareDate("elevi", $listaDate);
$listaDate = [];
foreach ($materii as $mat) {
$m = [];
$m["id"] = $mat->id;
$m["nume"] = $mat->denumire;
$listaDate[] = $m;}
$r->adaugareDate("materii", $listaDate);
} catch (Exception $ex) {
$r->eroare("Eroare baza de date!");
goto iesire;}
iesire:
return $r->scoateJSON(); }
public function listaDateElev($idmaterie, $idelev) {
$r = new Raspuns();
try {
$clasa = Clasa::findOrFail(Auth::user()->diriginte);
$elev = User::findOrFail($idelev);
$materie = Materie::findOrFail($idmaterie);
$nr = $clasa->elevi()->where("id", "=", $elev->id)->count();
if ($nr == 0) {
$r->eroare("Elevul nu face parte din aceasta clasa.");
goto iesire;}
$nr = DB::table("profesor_materie_clasa")->where("clasa_id", "=", $clasa->id)->where("materie_id", "=", $materie->id)
->count();
if ($nr == 0) {
$r->eroare("Materia nu se preda la clasa aceasta ");
goto iesire; }
$note = $elev->noteElev()
->where("materie_id", "=", $materie->id)->orderBy("data", "desc") ->get();
$absente = $elev->absenteElev() ->where("materie_id", "=", $materie->id)->orderBy("data", "desc") ->get();
$listaDate = [];
foreach ($note as $nota) {
$nt = [];
$nt["data"] = $nota->data;
$nt["valoare"] = $nota->valoare;
if ($nota->e_teza) {
$nt["e_teza"] = true;
} else {
$nt["e_teza"] = false;}
$listaDate[] = $nt; }
$r->adaugareDate("note", $listaDate);
$listaDate = [];
foreach ($absente as $absenta) {
$nt = [];
$nt["data"] = $absenta->data;
if ($absenta->motivata) {
$nt["motivata"] = true;
} else {
$nt["motivata"] = false; }
$nt["id"] = $absenta->id;$listaDate[] = $nt;}
$r->adaugareDate("absente", $listaDate);
} catch (Exception $ex) {
$r->eroare("Eroare baza de date"); goto iesire;}
iesire:
return $r->scoateJSON();}
public function motivareAbsenta($idmaterie,$idelev,$idabs) {
$r = new Raspuns();
try {
$clasa = Clasa::findOrFail(Auth::user()->diriginte);
$elev = User::findOrFail($idelev);
$materie = Materie::findOrFail($idmaterie);
$nr = $clasa->elevi()->where("id", "=", $elev->id)->count();
if ($nr == 0) {
$r->eroare("Elevul nu face parte din aceasta clasa.");
goto iesire;}
$nr = DB::table("profesor_materie_clasa")->where("clasa_id", "=", $clasa->id) ->where("materie_id", "=", $materie->id)
->count();
if ($nr == 0) {
$r->eroare("Materia nu se preda la clasa aceasta ");goto iesire; }
$abs = $elev->absenteElev()
->where("materie_id","=",$materie->id)->where("id","=",$idabs)->first();
if ($abs == null) {
$r->eroare("Absenta nu exista!"); goto iesire;}
$abs->motivata = true;
$abs->save();
} catch (Exception $ex) {
$r->eroare("Eroare baza de date");
goto iesire;
}
iesire:
return $r->scoateJSON();}}
DateElevController.php
class DateElevController extends BaseController {
public function dateElev($idmaterie, $idclasa, $idelev) {
$r = new Raspuns();
try {
$materie = Materie::findOrFail($idmaterie);
$clasa = Clasa::findOrFail($idclasa);
$elev = User::findOrFail($idelev);
//verificare daca preda laa clasa selectata materia selectata
$verif = DB::table("profesor_materie_clasa")->where("profesor_id", "=", Auth::user()->id)
->where("materie_id", "=", $idmaterie)->where("clasa_id", "=", $idclasa)->count();
if ($verif == 0) {
$r->eroare("Nu aveti suficiente drepturi.");
goto iesire;}
//elevul cu $idelev apartine de clasa cu $idclasa???
if ($elev->clasa_id != $clasa->id) {
$r->eroare("Eroare! Elevul " . $elev->nume . " nu apartine clasei " . $clasa->nume());
goto iesire; }
//IA NOTELE
$note = $elev->noteElev()
->where("materie_id", "=", $materie->id)->where("profesor_id", "=", Auth::user()->id)
->orderBy("data", "desc")->get(["id", "data", "valoare", "e_teza"]);
$listaDate = [];
foreach ($note as $nota) {
$not = [];
$not["valoare"] = $nota->valoare;
$not["data"] = $nota->data;
$not["e_teza"] = $nota->e_teza;
$not["id"] = $nota->id;
$listaDate[] = $not;}
$r->adaugareDate("note", $listaDate);
//ABSENTE
$absente = $elev->absenteElev()
->where("materie_id", "=", $materie->id)->where("profesor_id", "=", Auth::user()->id)
->orderBy("data", "desc")->get(["data", "motivata", "id"]);
$listaDate = [];
foreach ($absente as $absenta) {
$abs = []; $abs["data"] = $absenta->data;
$abs["motivata"] = $absenta->motivata; $abs["id"] = $absenta->id; $listaDate[] = $abs;}
$r->adaugareDate("absente", $listaDate);
} catch (Exception $ex) {
$r->eroare("Eroare database.");
goto iesire;}
iesire:
return $r->scoateJSON();}
public function adaugareNota($idmaterie, $idclasa, $idelev, $nota, $teza) {
$r = new Raspuns();
try {
$materie = Materie::findOrFail($idmaterie);
$clasa = Clasa::findOrFail($idclasa);
$elev = User::findOrFail($idelev);
//verificare daca preda laa clasa selectata materia selectata
$verif = DB::table("profesor_materie_clasa")
->where("profesor_id", "=", Auth::user()->id) ->where("materie_id", "=", $idmaterie)
->where("clasa_id", "=", $idclasa)->count();
if ($verif == 0) {
$r->eroare("Nu aveti suficiente drepturi.");
goto iesire;
}
//elevul cu $idelev apartine de clasa cu $idclasa???
if ($elev->clasa_id != $clasa->id) {
$r->eroare("Eroare! Elevul " . $elev->nume . " nu apartine clasei " . $clasa->nume());
goto iesire;}
$nota = (int) $nota;
if ($nota < 1 || $nota > 10) {
$r->eroare("Eroare! Nota trebuie sa fie intre 1 si 10 inclusiv.");
goto iesire; }
$tezab = false;
if ($teza == 1) { $tezab = true;}
$n = new Nota();
$n->valoare = $nota;
$n->elev_id = $elev->id;
$n->materie_id = $materie->id;
$n->profesor_id = Auth::user()->id;
$n->e_teza = $tezab;
$n->data = date("Y-m-d");
$n->save();
} catch (Exception $ex) {
$r->eroare("Eroare database.");
goto iesire; }
iesire:
return $r->scoateJSON();}
public function adaugareAbsenta($idmaterie, $idclasa, $idelev) {
$r = new Raspuns();
try {
$materie = Materie::findOrFail($idmaterie);
$clasa = Clasa::findOrFail($idclasa);
$elev = User::findOrFail($idelev);
//verificare daca preda laa clasa selectata materia selectata
$verif = DB::table("profesor_materie_clasa")
->where("profesor_id", "=", Auth::user()->id) ->where("materie_id", "=", $idmaterie)
->where("clasa_id", "=", $idclasa) ->count();
if ($verif == 0) {
$r->eroare("Nu aveti suficiente drepturi.");
goto iesire; }
//elevul cu $idelev apartine de clasa cu $idclasa???
if ($elev->clasa_id != $clasa->id) {
$r->eroare("Eroare! Elevul " . $elev->nume . " nu apartine clasei " . $clasa->nume());
goto iesire;
}
$n = new Absenta();
$n->elev_id = $elev->id;
$n->materie_id = $materie->id;
$n->profesor_id = Auth::user()->id;
$n->data = date("Y-m-d");
$n->motivata = false;
$n->save();
} catch (Exception $ex) {
$r->eroare("Eroare database.");
goto iesire; }
iesire:
return $r->scoateJSON();}
public function motivareAbsenta($idmaterie, $idclasa, $idelev, $idabs) {
$r = new Raspuns();
try {
$materie = Materie::findOrFail($idmaterie);
$clasa = Clasa::findOrFail($idclasa);
$elev = User::findOrFail($idelev);
//verificare daca preda laa clasa selectata materia selectata
$verif = DB::table("profesor_materie_clasa")
->where("profesor_id", "=", Auth::user()->id) ->where("materie_id", "=", $idmaterie)
->where("clasa_id", "=", $idclasa) ->count();
if ($verif == 0) {
$r->eroare("Nu aveti suficiente drepturi.");
goto iesire;
}
//elevul cu $idelev apartine de clasa cu $idclasa???
if ($elev->clasa_id != $clasa->id) {
$r->eroare("Eroare! Elevul " . $elev->nume . " nu apartine clasei " . $clasa->nume());
goto iesire;
}
$abs = Auth::user()->absenteDate()
->where("elev_id","=",$elev->id)
->where("materie_id","=",$materie->id)
->where("id","=",$idabs)
->first();
if ($abs == null) {
$r->eroare("Eroare! Aceasta absenta nu exista!");
goto iesire;
}
$abs->motivata = true;
$abs->save();
} catch (Exception $ex) {
$r->eroare("Eroare database.");
goto iesire;
}
iesire:
return $r->scoateJSON();
}
}
Anexa 2
ProcesareListaDateElev.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaDateElev:ProcesareRaspuns
{ private ProfesorListaNoteAbsente plna;
public ProcesareListaDateElev(ProfesorListaNoteAbsente plna)
{
this.plna = plna;
}
private void punePeView(List<Nota> lnote,List<Absenta> labsente)
{
//titlu lista note
RowDefinition rand = new RowDefinition();
rand.Height = new GridLength(70.0);
plna.date.RowDefinitions.Add(rand);
TextBlock titlu1 = new TextBlock();
titlu1.Padding = new Thickness(5,5,5,5);
titlu1.Text = "LISTA NOTE";
titlu1.FontSize = 40.0;
Grid.SetColumnSpan(titlu1, 4);
Grid.SetRow(titlu1,0);
plna.date.Children.Add(titlu1);
//cap tabel note
RowDefinition r1 = new RowDefinition();
r1.Height = new GridLength(50.0);
plna.date.RowDefinitions.Add(r1);
TextBlock capt_data = new TextBlock();
capt_data.Padding = new Thickness(5, 5, 5, 5);
capt_data.Text = "Data";
capt_data.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_data, 1);
Grid.SetColumn(capt_data, 0);
Grid.SetRow(capt_data,1);
TextBlock capt_valoare = new TextBlock();
capt_valoare.Padding = new Thickness(5, 5, 5, 5);
capt_valoare.Text = "Nota";
capt_valoare.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_valoare, 1);
Grid.SetColumn(capt_valoare, 1);
Grid.SetRow(capt_valoare, 1);
TextBlock capt_teza = new TextBlock();
capt_teza.Padding = new Thickness(5, 5, 5, 5);
capt_teza.Text = "Este teza";
capt_teza.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_teza, 1);
Grid.SetRow(capt_teza, 1);
Grid.SetColumn(capt_teza, 2);
plna.date.Children.Add(capt_data);
plna.date.Children.Add(capt_valoare);
plna.date.Children.Add(capt_teza);
//bagam note
int i = 2;
foreach (Nota n in lnote)
{
RowDefinition randnou = new RowDefinition();
randnou.Height = new GridLength(40);
plna.date.RowDefinitions.Add(randnou);
TextBlock data = new TextBlock();
data.Padding = new Thickness(5, 5, 5, 5);
data.Text = n.Data;
Grid.SetColumn(data, 0);
Grid.SetRow(data, i);
Grid.SetColumnSpan(data, 1);
plna.date.Children.Add(data);
TextBlock valoare = new TextBlock();
valoare.Padding = new Thickness(5, 5, 5, 5);
valoare.Text = n.Valoare + "";
Grid.SetColumn(valoare, 1);
Grid.SetRow(valoare, i);
Grid.SetColumnSpan(valoare, 1);
plna.date.Children.Add(valoare);
TextBlock teza = new TextBlock();
teza.Padding = new Thickness(5, 5, 5, 5);
if (n.EsteTeza)
{
teza.Text = "DA";
}
else
{
teza.Text = "NU";
}
Grid.SetColumn(teza, 2);
Grid.SetRow(teza, i);
Grid.SetColumnSpan(teza, 1);
plna.date.Children.Add(teza);
i++;
}
//buton da adaugat note
RowDefinition randcuplus = new RowDefinition();
randcuplus.Height = new GridLength(128);
plna.date.RowDefinitions.Add(randcuplus);
Button plus = new Button();
plus.Background = new ImageBrush { ImageSource = new BitmapImage(new Uri("/Assets/Img/plus.png", UriKind.Relative)) };
Grid.SetColumnSpan(plus, 4);
Grid.SetRow(plus, i++);
plus.Width = 128;
plus.Height = 128;
plus.BorderThickness = new Thickness(0);
plus.HorizontalAlignment = HorizontalAlignment.Center;
plus.VerticalAlignment = VerticalAlignment.Center;
plus.Click += plus_Click;
plna.date.Children.Add(plus);
//rand gol
RowDefinition r = new RowDefinition();
r.Height = new GridLength(60);
plna.date.RowDefinitions.Add(r);
i++;
//titlu lista absente
RowDefinition rand1 = new RowDefinition();
rand1.Height = new GridLength(70.0);
plna.date.RowDefinitions.Add(rand1);
TextBlock titlu11 = new TextBlock();
titlu11.Padding = new Thickness(5, 5, 5, 5);
titlu11.Text = "LISTA ABSENTE";
titlu11.FontSize = 40.0;
Grid.SetColumnSpan(titlu11, 4);
Grid.SetRow(titlu11, i++);
plna.date.Children.Add(titlu11);
//cap tabel note
RowDefinition r11 = new RowDefinition();
r11.Height = new GridLength(50.0);
plna.date.RowDefinitions.Add(r11);
TextBlock capt_data1 = new TextBlock();
capt_data1.Padding = new Thickness(5, 5, 5, 5);
capt_data1.Text = "Data";
capt_data1.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_data1, 1);
Grid.SetColumn(capt_data1, 0);
Grid.SetRow(capt_data1, i);
TextBlock capt_motivata = new TextBlock();
capt_motivata.Padding = new Thickness(5, 5, 5, 5);
capt_motivata.Text = "Motivata";
capt_motivata.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_motivata, 1);
Grid.SetRow(capt_motivata, i);
Grid.SetColumn(capt_motivata, 1);
TextBlock capt_motivare = new TextBlock();
capt_motivare.Padding = new Thickness(5, 5, 5, 5);
capt_motivare.Text = "Motivare";
capt_motivare.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_motivare, 1);
Grid.SetRow(capt_motivare, i);
Grid.SetColumn(capt_motivare, 2);
plna.date.Children.Add(capt_data1);
plna.date.Children.Add(capt_motivata);
plna.date.Children.Add(capt_motivare);
i++;
foreach (Absenta abs in labsente)
{
RowDefinition randnou = new RowDefinition();
randnou.Height = new GridLength(40);
plna.date.RowDefinitions.Add(randnou);
TextBlock data = new TextBlock();
data.Padding = new Thickness(5, 5, 5, 5);
data.Text = abs.Data;
Grid.SetColumn(data, 0);
Grid.SetRow(data, i);
Grid.SetColumnSpan(data, 1);
plna.date.Children.Add(data);
TextBlock mot = new TextBlock();
mot.Padding = new Thickness(5, 5, 5, 5);
if (abs.Motivata)
{
mot.Text = "DA";
}
else
{
mot.Text = "NU";
}
Grid.SetColumn(mot, 1);
Grid.SetRow(mot, i);
Grid.SetColumnSpan(mot, 1);
plna.date.Children.Add(mot);
if (!abs.Motivata)
{
Button motivare = new Button();
motivare.Width = 40.0;
motivare.Height = 40.0;
motivare.Content = "M";
//motivare.BorderThickness = new Thickness(0);
motivare.Tag = abs.Id;
Grid.SetColumn(motivare, 2);
Grid.SetRow(motivare, i);
Grid.SetColumnSpan(motivare, 1);
motivare.Click += motivare_Click;
plna.date.Children.Add(motivare);
}
i++;
}
//buton de plus absente
RowDefinition randcuplus2 = new RowDefinition();
randcuplus2.Height = new GridLength(128);
plna.date.RowDefinitions.Add(randcuplus2);
Button plus2 = new Button();
plus2.Background = new ImageBrush { ImageSource = new BitmapImage(new Uri("/Assets/Img/plus.png", UriKind.Relative)) };
Grid.SetColumnSpan(plus2, 4);
Grid.SetRow(plus2, i++);
plus2.Width = 128;
plus2.Height = 128;
plus2.BorderThickness = new Thickness(0);
plus2.HorizontalAlignment = HorizontalAlignment.Center;
plus2.VerticalAlignment = VerticalAlignment.Center;
plus2.Click += plus2_Click;
plna.date.Children.Add(plus2);
}
void plus2_Click(object sender, RoutedEventArgs e)
{
int idmaterie = int.Parse(PhoneApplicationService.Current.State["idmaterie"].ToString());
int idclasa = int.Parse(PhoneApplicationService.Current.State["idclasa"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["idelev"].ToString());
string url = Setari.url + "profesor/materia/" + idmaterie + "/clasa/" + idclasa + "/elev/" + idelev + "/adaugareabsenta";
ProcesareAdaugareAbsenta paa = new ProcesareAdaugareAbsenta(plna);
ClientWeb.get(url, paa);
}
void motivare_Click(object sender, RoutedEventArgs e)
{
int idmaterie = int.Parse(PhoneApplicationService.Current.State["idmaterie"].ToString());
int idclasa = int.Parse(PhoneApplicationService.Current.State["idclasa"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["idelev"].ToString());
Button apasat = (Button)sender;
int idabs = (int)apasat.Tag;
string url = Setari.url + "profesor/materia/" + idmaterie + "/clasa/" + idclasa + "/elev/" + idelev + "/motivareabsenta/" + idabs;
ProcesareMotivareAbsenta pma = new ProcesareMotivareAbsenta(plna);
ClientWeb.get(url, pma);
}
void plus_Click(object sender, RoutedEventArgs e)
{
Popup popup = new Popup();
popup.Height = 300;
popup.Width = 400;
popup.VerticalOffset = 100;
PopupAdaugareNota pan = new PopupAdaugareNota();
popup.Child = pan;
popup.IsOpen = true;
pan.btnOK.Click += (s, args) =>
{
try
{
int nota = int.Parse(pan.tbx.Text);
if (nota < 1 || nota > 10)
{
MessageBox.Show("Introduceti o cifra intre 1 si 10!");
return;
}
int teza = 0;
if (pan.cbTeza.IsChecked ?? false)
{
teza = 1;
}
int idmaterie = int.Parse(PhoneApplicationService.Current.State["idmaterie"].ToString());
int idclasa = int.Parse(PhoneApplicationService.Current.State["idclasa"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["idelev"].ToString());
string url = Setari.url + "profesor/materia/"+idmaterie+"/clasa/"+idclasa+"/elev/"+idelev+"/adaugarenota/"+nota+"/teza/" + teza;
ProcesareAdaugareNota panota = new ProcesareAdaugareNota(plna);
ClientWeb.get(url,panota);
popup.IsOpen = false;
}
catch (FormatException)
{
MessageBox.Show("Introduceti o cifra intre 1 si 10!");
}
};
pan.btnCancel.Click += (s, args) =>
{
popup.IsOpen = false;
};
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
List<Nota> listanote = new List<Nota>();
foreach (dynamic nota in raspuns.note)
{
int id = (int)nota.id;
int valoare = (int)nota.valoare;
string data = (string)nota.data;
bool e_teza = (bool)nota.e_teza;
listanote.Add(new Nota(id,valoare,e_teza,data));
}
List<Absenta> listaabsente = new List<Absenta>();
foreach (dynamic absenta in raspuns.absente)
{
int id = (int)absenta.id;
string data = (string)absenta.data;
bool motivata = (bool)absenta.motivata;
listaabsente.Add(new Absenta(id,motivata,data));
}
punePeView(listanote,listaabsente);
}
}
}
ProcesareListaDateElevDiriginte.cs
namespace WindowsPhoneCatalog.ProcesariWebRequest
{
public class ProcesareListaDateElevDiriginte:ProcesareRaspuns
{
private DiriginteListaNoteAbsente dlna;
public ProcesareListaDateElevDiriginte(DiriginteListaNoteAbsente dlna)
{
this.dlna = dlna;
}
private void punePeView(List<Nota> lnote, List<Absenta> labsente)
{
//titlu lista note
RowDefinition rand = new RowDefinition();
rand.Height = new GridLength(70.0);
dlna.date.RowDefinitions.Add(rand);
TextBlock titlu1 = new TextBlock();
titlu1.Padding = new Thickness(5, 5, 5, 5);
titlu1.Text = "LISTA NOTE";
titlu1.FontSize = 40.0;
Grid.SetColumnSpan(titlu1, 4);
Grid.SetRow(titlu1, 0);
dlna.date.Children.Add(titlu1);
//cap tabel note
RowDefinition r1 = new RowDefinition();
r1.Height = new GridLength(50.0);
dlna.date.RowDefinitions.Add(r1);
TextBlock capt_data = new TextBlock();
capt_data.Padding = new Thickness(5, 5, 5, 5);
capt_data.Text = "Data";
capt_data.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_data, 1);
Grid.SetColumn(capt_data, 0);
Grid.SetRow(capt_data, 1);
TextBlock capt_valoare = new TextBlock();
capt_valoare.Padding = new Thickness(5, 5, 5, 5);
capt_valoare.Text = "Nota";
capt_valoare.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_valoare, 1);
Grid.SetColumn(capt_valoare, 1);
Grid.SetRow(capt_valoare, 1);
TextBlock capt_teza = new TextBlock();
capt_teza.Padding = new Thickness(5, 5, 5, 5);
capt_teza.Text = "Este teza";
capt_teza.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_teza, 1);
Grid.SetRow(capt_teza, 1);
Grid.SetColumn(capt_teza, 2);
dlna.date.Children.Add(capt_data);
dlna.date.Children.Add(capt_valoare);
dlna.date.Children.Add(capt_teza);
//bagam note
int i = 2;
foreach (Nota n in lnote)
{
RowDefinition randnou = new RowDefinition();
randnou.Height = new GridLength(40);
dlna.date.RowDefinitions.Add(randnou);
TextBlock data = new TextBlock();
data.Padding = new Thickness(5, 5, 5, 5);
data.Text = n.Data;
Grid.SetColumn(data, 0);
Grid.SetRow(data, i);
Grid.SetColumnSpan(data, 1);
dlna.date.Children.Add(data);
TextBlock valoare = new TextBlock();
valoare.Padding = new Thickness(5, 5, 5, 5);
valoare.Text = n.Valoare + "";
Grid.SetColumn(valoare, 1);
Grid.SetRow(valoare, i);
Grid.SetColumnSpan(valoare, 1);
dlna.date.Children.Add(valoare);
TextBlock teza = new TextBlock();
teza.Padding = new Thickness(5, 5, 5, 5);
if (n.EsteTeza)
{
teza.Text = "DA";
}
else
{
teza.Text = "NU";
}
Grid.SetColumn(teza, 2);
Grid.SetRow(teza, i);
Grid.SetColumnSpan(teza, 1);
dlna.date.Children.Add(teza);
i++;
}
//rand gol
RowDefinition r = new RowDefinition();
r.Height = new GridLength(60);
dlna.date.RowDefinitions.Add(r);
i++;
//titlu lista absente
RowDefinition rand1 = new RowDefinition();
rand1.Height = new GridLength(70.0);
dlna.date.RowDefinitions.Add(rand1);
TextBlock titlu11 = new TextBlock();
titlu11.Padding = new Thickness(5, 5, 5, 5);
titlu11.Text = "LISTA ABSENTE";
titlu11.FontSize = 40.0;
Grid.SetColumnSpan(titlu11, 4);
Grid.SetRow(titlu11, i++);
dlna.date.Children.Add(titlu11);
//cap tabel note
RowDefinition r11 = new RowDefinition();
r11.Height = new GridLength(50.0);
dlna.date.RowDefinitions.Add(r11);
TextBlock capt_data1 = new TextBlock();
capt_data1.Padding = new Thickness(5, 5, 5, 5);
capt_data1.Text = "Data";
capt_data1.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_data1, 1);
Grid.SetColumn(capt_data1, 0);
Grid.SetRow(capt_data1, i);
TextBlock capt_motivata = new TextBlock();
capt_motivata.Padding = new Thickness(5, 5, 5, 5);
capt_motivata.Text = "Motivata";
capt_motivata.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_motivata, 1);
Grid.SetRow(capt_motivata, i);
Grid.SetColumn(capt_motivata, 1);
TextBlock capt_motivare = new TextBlock();
capt_motivare.Padding = new Thickness(5, 5, 5, 5);
capt_motivare.Text = "Motivare";
capt_motivare.FontWeight = FontWeights.Bold;
Grid.SetColumnSpan(capt_motivare, 1);
Grid.SetRow(capt_motivare, i);
Grid.SetColumn(capt_motivare, 2);
dlna.date.Children.Add(capt_data1);
dlna.date.Children.Add(capt_motivata);
dlna.date.Children.Add(capt_motivare);
i++;
foreach (Absenta abs in labsente)
{
RowDefinition randnou = new RowDefinition();
randnou.Height = new GridLength(40);
dlna.date.RowDefinitions.Add(randnou);
TextBlock data = new TextBlock();
data.Padding = new Thickness(5, 5, 5, 5);
data.Text = abs.Data;
Grid.SetColumn(data, 0);
Grid.SetRow(data, i);
Grid.SetColumnSpan(data, 1);
dlna.date.Children.Add(data);
TextBlock mot = new TextBlock();
mot.Padding = new Thickness(5, 5, 5, 5);
if (abs.Motivata)
{
mot.Text = "DA";
}
else
{
mot.Text = "NU";
}
Grid.SetColumn(mot, 1);
Grid.SetRow(mot, i);
Grid.SetColumnSpan(mot, 1);
dlna.date.Children.Add(mot);
if (!abs.Motivata)
{
Button motivare = new Button();
motivare.Width = 40.0;
motivare.Height = 40.0;
motivare.Content = "M";
//motivare.BorderThickness = new Thickness(0);
motivare.Tag = abs.Id;
Grid.SetColumn(motivare, 2);
Grid.SetRow(motivare, i);
Grid.SetColumnSpan(motivare, 1);
motivare.Click += motivare_Click;
dlna.date.Children.Add(motivare);
}
i++;
}
}
void motivare_Click(object sender, RoutedEventArgs e)
{
int idmaterie = int.Parse(PhoneApplicationService.Current.State["diridmaterie"].ToString());
int idelev = int.Parse(PhoneApplicationService.Current.State["diridelev"].ToString());
Button apasat = (Button)sender;
int idabs = (int)apasat.Tag;
string url = Setari.url + "diriginte/materia/" + idmaterie + "/elev/" + idelev + "/motivareabsenta/" + idabs;
ProcesareMotivareAbsentaDiriginte pmad = new ProcesareMotivareAbsentaDiriginte(dlna);
ClientWeb.get(url, pmad);
}
public override void procesare(dynamic raspuns)
{
bool succes = (bool)raspuns.succes;
if (!succes)
{
MessageBox.Show((string)raspuns.eroare);
return;
}
List<Nota> listanote = new List<Nota>();
foreach (dynamic nota in raspuns.note)
{
int valoare = (int)nota.valoare;
string data = (string)nota.data;
bool e_teza = (bool)nota.e_teza;
listanote.Add(new Nota(0, valoare, e_teza, data));
}
List<Absenta> listaabsente = new List<Absenta>();
foreach (dynamic absenta in raspuns.absente)
{
int id = (int)absenta.id;
string data = (string)absenta.data;
bool motivata = (bool)absenta.motivata;
listaabsente.Add(new Absenta(id, motivata, data));
}
punePeView(listanote, listaabsente);
}
}
}
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: Catalog Pentru Windows Phone (ID: 149601)
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.
