Serwis WWW, HTML5, CSS, JavaScript i php
Tematyka zajęć:
W ramach zajęć poznamy możliwości realizacji aplikacji internetowych wykorzystujących HTML5, CSS i JavaScript po stronie klienta i php po stronie serwera.
- Zadania
- Grafika SVG w języku HTML5
- Obsługa stanu w serwisie WWW
- Obsługa ciasteczek w JavaScript
- Sesje w serwise WWW
- Technologia AJAX
- Miniportal do obsługi ocen semestralnych
- Zadania
- Opracować prostą stronę zawierającą listę uczniów i oceny z danego przedmiotu (język html i element <table>).
- Tworzymy plik zadanie1.html, zawierający informację o uczniach zformatowany z wykorzystaniem elementu <table>. Przykładowy ekran.
- Opracować stronę zawierającą listę ocen z wykorzystaniem języka php. Lista ocen w pliku csv.
- Tworzymy dwa pliki. Pierwszy plik zadanie2.php czyta dane z drugiego pliku zawierającego dane ucznia ( nazwisko, imię i ocenę ) - zadanie2.csv. Plik php zawiera
polecenie czytające plik oraz formatujący odpowiedź. Plik zadanie2.csv zawiera informację o uczniach. Ponieżej szablony pliku zadanie2.php i pliku zadanie2.csv.
Poniżej inna wersja pliku php umożliwiającego posortowanie pobranych danych z pliku po nazwisku.
// szablon pliku zadanie2.php $uchwyt = fopen($nazwa,"r") ; // otwarcie pliku print "<table><tr><th>Lp.</th><th>Nazwisko</th><th>Imie</th><th>Ocena</th></tr>"; $lp = 0 ; while ( false !== ($linia = fgets($uchwyt)) ) // odczyt rekordów pliku { $lp++ ; list($imie,$nazwisko,$ocena) = explode(":",$linia) ; print "<tr><td>".$lp."</td><td>".$nazwisko."</td> ... ; // należy dokończyć } print "</table>" ;
Adam:Abacki:4: Bogdan:Zazadzki:3 ...
// szablon pliku zadanie2.php $uchwyt = fopen($nazwa,"r") ; // otwarcie pliku print "<table><tr><th>Lp.</th><th>Nazwisko</th><th>Imie</th><th>Ocena</th></tr>"; $lp = 0 ; while ( false !== ($linia = fgets($uchwyt)) ) // odczyt rekordów pliku { $lp++ ; list($imie,$nazwisko,$ocena) = explode(":",$linia) ; print "<tr><td>".$lp."</td><td>".$nazwisko."</td> ... ; // należy dokończyć } print "</table>" ;
- Opracować formularz dodający ucznia do pliku z listą ocen.
- Tworzymy dwa pliki. Pierwszy plik zadanie3.html jest formularzem ( lab4, zadanie A ), drugi jest plikiem php który czyta przesłane dane ( lab4, zadanie A )
i zapisuje do pliku z zadanie 2 ( lab4, zad C ). Ponieżej szablon pliku zadanie3.php.
$imie = $_POST['imie'] ; ... $record = "\n".$nazwisko.":".$imie.":".$ocena.":" ; fwrite($uchwyt,$record) ;
- Grafika SVG w języku HTML5
- Trójkąt i okrąg w grafice SVG, pliki "lab5_B01.html" i "lab5_B01.css".
Plik lab5_B01.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html > <html> <head> <meta charset="ISO-8859-2" /> <title>Trojkat</title> <link rel="stylesheet" href="lab5_B01.css" type="text/css" media="all" /> </head> <body> <div class="trojkat_svg_box"> <svg encoding="ISO-8859-2" id="svg" width="100%" height="100%" style="background-color:#000000;" xmlns="http://www.w3.org/2000/svg"> <!-- prostokat points = ( x1,y1, x1,y2, y2,x2, x2,y1 ) --> <polygon id ="tlo" points="0,0,0,500,500,500,500,0" class="tlo"/> <!-- trojkat points = ( x1,y1, x2,y2, x3,y3 ) --> <polygon id ="trojkat" points="50.00,50.00,350.00,150.00,100.00,300.00" class="trojkat"/> <!-- kolo cx = x, cy = y, R = r --> <circle id="kolo" cx="200" cy="200" r="141.42" fill="none" stroke="blue" stroke-width="1" class="kolo" /> <circle id ="K" cx="200.00" cy="200.00" r="2" stroke="black" stroke-width="1" fill="black"/> </svg> </div> </body> </html>
Plik lab5_B01.css - ( [listing dokumentu] [link do dokumentu] )
/* lab4_7a */ .trojkat_svg_box { text-align: center; width: 500px; height: 500px; border: none; float: left; margin: 10px; } .tlo{ pointer-events: none; fill:white; stroke:none } .trojkat{ fill:#cccccc; stroke:#000000; stroke-width:1; } .punkt{ stroke:black; stroke-width:2; fill:black; pointer-events:all; cursor: pointer; } /* .trojkat_svg { text-align: center; width: 500px; height: 500px; border: black solid 1px; float: left; } .xyz_input { width: 30px; } .naviation_panel { float: left; width: 200px; margin: 10px; } .legend { float: left; width: 700px; margin: 10px; } .opis { float: left; width: 700px; margin: 10px; } .wysokosci{ visibility: hidden; stroke:green; stroke-width:1; } .srodkowe{ visibility: hidden; stroke:blue; stroke-width:1; } .symetralne{ visibility: hidden; stroke:rgb(99,99,99); stroke-width:1; } */
- Okrąg opisany na trójkącie, grafika SVG, pliki "lab5_B02.html" i "lab5_B02.js". W ramach zadania zostanie zrealizowana
strona WWW w której poprzez formularz wprowadzamy wierzchołki trójkąta. Skrypt w Javascript
sprawdzi czy wprowadzone punkty tworzą trójkąt, a następnie wyznaczy parametry okręgu opisanego
na tym trójkącie.
Plik lab5_B02.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html > <html> <head> <meta charset="ISO-8859-2" /> <title>Trojkat</title> <link rel="stylesheet" href="lab5_B01.css" type="text/css" media="all" /> <script type="text/javascript" src="lab5_B02.js" > </script> </head> <body onload="javascript: load_img();"> <div class="trojkat_svg_box"> <svg encoding="ISO-8859-2" id="svg" width="100%" height="100%" style="background-color:#000000;" xmlns="http://www.w3.org/2000/svg"> <polygon id ="tlo" points="0,0,0,500,500,500,500,0" class="tlo"/> <polygon id ="trojkat" points="50.00,50.00,350.00,150.00,100.00,300.00" class="trojkat"/> <circle id="kolo" cx="200" cy="200" r="141.42" fill="none" stroke="blue" stroke-width="1" class="kolo" /> <circle id ="K" cx="200.00" cy="200.00" r="2" stroke="black" stroke-width="1" fill="black"/> </svg> </div> <div class="naviation_panel"> <fieldset> <legend>Wierzcholki trojkata</legend> <label for="x1">X1:</label> <input type="text" name="x1" id="x1" class="xyz_input" value="50"/> <label for="y1">Y1:</label> <input type="text" id="y1" name="y1" class="xyz_input" value="50"/> <br /> <label for="x2">X2:</label> <input type="text" name="x2" id="x2" class="xyz_input" value="350"/> <label for="y2">Y2:</label> <input type="text" name="y2" id="y2" class="xyz_input" value="150"/> <br /> <label for="x3">X3:</label> <input type="text" name="x3" id="x3" class="xyz_input" value="100"/> <label for="y3">Y3:</label> <input type="text" name="y3" id="y3" class="xyz_input" value="300"/> <br /><br /> <input type="button" value="Rysuj" onclick="load_img();" /> </fieldset> </div> </body> </html>
Plik lab5_B02.js - ( [listing dokumentu] [link do dokumentu] )
top.eulerLine = EulerLine; function load_img() { var x1=document.getElementById("x1").value; var x2=document.getElementById("x2").value; var x3=document.getElementById("x3").value; var y1=document.getElementById("y1").value; var y2=document.getElementById("y2").value; var y3=document.getElementById("y3").value; var trojkat=[]; trojkat[0]=[]; trojkat[1]=[]; trojkat[2]=[]; trojkat[0][0]=parseFloat(x1); trojkat[0][1]=parseFloat(y1); trojkat[1][0]=parseFloat(x2); trojkat[1][1]=parseFloat(y2); trojkat[2][0]=parseFloat(x3); trojkat[2][1]=parseFloat(y3); window.eulerLine(trojkat); } function EulerLine(trojkat) { //sprawdzamy czy sie da zbudowac trojkat var czy_sie_da=0; var d=[]; d[0]=Math.sqrt( (trojkat[0][0]-trojkat[1][0])*(trojkat[0][0]-trojkat[1][0]) + (trojkat[0][1]-trojkat[1][1])*(trojkat[0][1]-trojkat[1][1]) ); d[1]=Math.sqrt( (trojkat[1][0]-trojkat[2][0])*(trojkat[1][0]-trojkat[2][0]) + (trojkat[1][1]-trojkat[2][1])*(trojkat[1][1]-trojkat[2][1]) ); d[2]=Math.sqrt( (trojkat[2][0]-trojkat[0][0])*(trojkat[2][0]-trojkat[0][0]) + (trojkat[2][1]-trojkat[0][1])*(trojkat[2][1]-trojkat[0][1]) ); if(d[0]+d[1]<=d[2]) czy_sie_da=1; if(d[1]+d[2]<=d[0]) czy_sie_da=1; if(d[0]+d[2]<=d[1]) czy_sie_da=1; if(czy_sie_da==1) { alert("Z podanych punktow nie mozna zbudowac trojkata"); return 0; } else { var srodek=[]; srodek[0]=[]; srodek[1]=[]; srodek[2]=[]; for(i=0;i<3;i++) { if(i==2) sasiad = 0; else sasiad = i+1; srodek[i][0]=(trojkat[sasiad][0]+trojkat[i][0])/2; srodek[i][1]=(trojkat[sasiad][1]+trojkat[i][1])/2; } //obliczamy wspolczynniki rownania prostych dla symetralnych bokow var a_symetr=[]; var b_symetr=[]; for(i=0;i<3;i++) { if(i==2) sasiad = 0; else sasiad = i+1; var A = trojkat[sasiad][1] - trojkat[i][1]; var B = trojkat[sasiad][0] - trojkat[i][0]; var C = trojkat[sasiad][0]*trojkat[i][0] - (trojkat[sasiad][1]*trojkat[i][0]); a_symetr[i] = -1*(1/(A/B)); // z warunku na prostpadlosc prostych b_symetr[i] = srodek[i][1] - a_symetr[i]*srodek[i][0]; } var U=[]; var R=0; //wyznaczamy punkt przeciecia symetralnych, czyli srodek okregu opisanego U[0]= (b_symetr[1]-b_symetr[0])/(a_symetr[0]-a_symetr[1]); U[1]= a_symetr[1]*U[0]+b_symetr[1]; //wyznaczamy promien okregu opisanego R = (trojkat[1][0] - U[0])*(trojkat[1][0] - U[0]) ; R = R + (trojkat[1][1] - U[1])*(trojkat[1][1] - U[1] ) ; R = Math.sqrt(R) ; var polyTrojkat = document.getElementById('trojkat'); var kolo = document.getElementById('kolo'); var k = document.getElementById('K'); polyTrojkat.setAttribute('points',''+trojkat[0][0]+', '+trojkat[0][1]+', '+trojkat[1][0]+' '+trojkat[1][1]+', '+trojkat[2][0]+', '+trojkat[2][1]); kolo.setAttribute('cx',U[0]); kolo.setAttribute('cy',U[1]); kolo.setAttribute('r',R); k.setAttribute('cx',U[0]); k.setAttribute('cy',U[1]); } }
- Obsługa stanu w serwisie WWW
- przechowywanie danych przez przeglądarkę na dysku - http cookie,
- przechowywanie danych przez serwer - przechowywanie danych sesyjnych.
- Obsługa ciasteczek w języku JavaScript
- (wymagane dane) nazwa i przypisana jej wartość.
- (opcjonalne dane) expires - czas ważności danego ciasteczka (po jego upłynięciu przeglądarka przestanie je wysyłać i powinna je usunąć z komputera klienta), przykładowy format daty: Tuesday, 03-Jan-2019 18:30:00 GMT. Brak parametru oznacza, że ciasteczko zostanie usunięte po zamknięciu przeglądarki.
- (opcjonalne dane) Parametry ograniczające widoczność ciasteczka:
- path - parametr podany w celu ograniczenia widoczności ciasteczka do danej ścieżki dostępu do katalogu (liczy się ścieżka widoczna w URL-u pliku, a nie rzeczywiste położenie na dysku serwera.
- domain - parametr określa dokąd ciateczko może być wysłane, przy czym serwer może określić tylko swoją domenę lub domeny niższego stopnia. W momencie wywołania przez użytkownika adresu URL, przeglądarka sprawdza czy ma ważne ciasteczka dla tej domeny.
- secure - parametr nie posiada wartości, jeżli zostanie podany, to ciasteczko będzie widoczne (wysłane) tylko wtedy gdy połączenie będzie szyfrowane (użycie protokołu HTTPS).
- Sprawdzamy ciasteczka umieszczone dla witryny www.fis.agh.edu.pl wykonując
kod javascript umieszczony w pliku "lab5_D01.html"
Plik lab5_D01.html ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!doctype html> <html> <head> <title>Lista zmiennych Cookie</title> <meta charset="ISO-8859-2"> <script language="JavaScript" > window.onload = showCookies ; function showCookies() { var outMsg = ''; if (document.cookie.length = 0 ) { outMsg = " Brak ciasteczek " ; } else { outMsg += "<table><tr><th>Nazwa ciasteczka</th><th>Zawartos ciasteczka</th></tr>" ; var thisCookie = document.cookie.split(";"); for ( var i=0; i<thisCookie.length; i++ ) { outMsg += "<tr><td>" + thisCookie[i].split("=")[0] + "</td>"; outMsg += "<td>" + thisCookie[i].split("=")[1] +"</td></tr></tr>"; } outMsg += "</table>"; } document.getElementById("cookieData").innerHTML = outMsg ; } </script> </head> <body> <h3>Lista ciasteczek</h3> <p id="cookieData"> </p> </body> </html>
- W kolejnym skrypcie tworzymy nowe ciasteczko, które umożliwi wypełnienie pola
po wczytaniu ponownym skryptu, plik "lab5_D02.html"
Plik lab5_D02.html ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!doctype html> <html> <head> <title>Zmiana elementw graficznych</title> <meta charset="ISO-8859-2"> <script type="text/javascript"> window.onload = nameFieldInit ; function nameFieldInit() { var userName = ''; if (document.cookie.length > 0 ) { var dimCookie = document.cookie.split(";") ; for ( var i=0; i<dimCookie.length; i++ ) { dataCookie = dimCookie[i].split("=") ; // alert ( dataCookie[0]+" => "+dataCookie[1]) ; if ( "userName" == dataCookie[0] ) { userName = dataCookie[1] ; document.getElementById("nameField").value = userName; document.getElementById("nameField").onblur = setCookie; } } } } function setCookie() { var expireDate = new Date(); expireDate.setMonth(expireDate.getMonth()+6); var userName = document.getElementById("nameField").value; document.cookie = "userName=" + userName + ";expires=" + expireDate.toGMTString(); } </script> </head> <body> <form onsubmit="setCookie()" > <p>Podaj swoje imi: <input type="text" id="nameField" /> </p> <input type="submit" /> </form> </body> </html>
- Przechowywanie ustawiania styli na stronie www w ciasteczkach, plik "lab5_D03.html"
Plik lab5_D03.html ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!doctype html> <html> <head> <title>Zmiana koloru tla</title> <meta charset="ISO-8859-2"> <style type="text/css"> body { background-color:white; } </style> <script type="text/javascript"> function get_cookie(Name) { var search = Name + "=" var returnvalue = ""; if (document.cookie.length > 0) { offset = document.cookie.indexOf(search) // if cookie exists if (offset != -1) { offset += search.length // set index of beginning of value end = document.cookie.indexOf(";", offset); // set index of end of cookie value // -- alert ( "[ offset = "+offset+", end = "+end+" ]" ); if (end == -1) end = document.cookie.length; returnvalue=unescape(document.cookie.substring(offset, end)) } } return returnvalue; } function setcolor(what){ document.body.style.backgroundColor=what document.cookie="bgcolor="+what } function setcolor1(){ if (get_cookie("bgcolor") != "") { var bgcolor = get_cookie("bgcolor"); document.body.style.backgroundColor = bgcolor; } } </script> </head> <body onload="setcolor1();"> <form name="a1"> <p><select name="a2" size="1"> <option value="white">Select background color </option> <option value="#F0F0F0">Light gray</option> <option value="#80FFFF">Sky blue</option> <option value="#C6C6FF">Purple</option> <option value="white">White</option> </select> <input type="button" value="Go" onClick="setcolor(document.a1.a2.options[document.a1.a2.selectedIndex].value)"></p> </form> </body> </html>
- Personalizowanie wyglądu strony z wykorzystaniem styli CSS, plik "lab5_D04.html"
Plik lab5_D04.html ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<html> <head> <title>Test cookie</title> <script> function changeColor() { var ind_poz_wyb = document.getElementById('sel').options.selectedIndex; var klucz_poz_wyb = document.getElementById('sel').options[ind_poz_wyb].value; document.getElementById('div_b').style.border='5px solid '+klucz_poz_wyb; cookieHandler.setCookie('color', klucz_poz_wyb, 1 ); cookieHandler.setCookie('index', ind_poz_wyb, 1 ); console.log(klucz_poz_wyb) ; } function setColor() { if ( cookieHandler.isValidCookie('color') ) { var marg_color = cookieHandler.getCookieValue('color'); var ind_color = cookieHandler.getCookieValue('index'); document.getElementById('div_b').style.border='5px solid ' + marg_color; document.getElementById('sel').options.selectedIndex=ind_color; console.log(marg_color) ; console.log(ind_color); } else { document.getElementById('div_b').style.border='5px solid blue'; document.getElementById('sel').options.selectedIndex=0; } } function unSetCookie() { cookieHandler.deleteCookie('color'); cookieHandler.deleteCookie('index'); } function listCookie() { var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); var text = "<table><tr><th>Nazwa ciasteczka</th><th>Zawartosc ciasteczka</th></tr>" ;; for(var i = 0; i < ca.length; i++) { text += "<tr><td>" + ca[i].split("=")[0] + "</td>"; text += "<td>" + ca[i].split("=")[1] +"</td></tr></tr>"; } text += "</table>"; document.getElementById('div_cookie').innerHTML = text ; } var cookieHandler = {}; cookieHandler.isValidCookie = function (cookieName) { var cookieValue = cookieHandler.getCookieValue(cookieName); return (cookieValue == '') ? false : true; }; cookieHandler.setCookie = function (cookieName, cookieValue, nDays) { var d = new Date(); //d.setTime(d.getTime() + (nDays*24*60*60*1000)); d.setTime(d.getTime() + (60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/"; } cookieHandler.getCookieValue = function (cookieName) { var name = cookieName + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for(var i = 0; i <ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ''; } cookieHandler.deleteCookie = function (cookieName) { cookieHandler.setCookie(cookieName,'',-730); } window.onload = setColor; </script> <style> #div_b { border: 5px solid blue ; width: 250px; margin: 10px; padding: 10px; } </style> </head> <body> <div id='div_b'> <p><b>Test serwisu z ciateczkami</b> <br/> obsluga po stronie klienta w JS</p> <p>Wybierz kolor ramki</p> <form> <select id='sel' onchange='changeColor()'> <option value='blue'>Niebieska</option> <option value='red'>Czerwona</option> <option value='green'>Zielona</option> = <option value='yellow'>Zolta</option> </select><br/><br/> <input type='button' id='del' value='Usun cookie' onclick='unSetCookie()'></input> <br/><br/> <input type='button' id='list' value='Lista cookie' onclick='listCookie()'></input> <br/><br/> <input type='button' id='rel' value='Przeladuj strone' onclick='location.reload();'></input> </form> </div> <div id="div_cookie"></div> </body> </html>
- Personalizowanie informacji na stronie, plik "lab5_D05.php"
Plik lab5_D05.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php if( isset($_COOKIE["thema"]) ) { // echo print_r($_COOKIE) ; $thema = $_COOKIE["thema"]; } else { $thema = 0; setcookie("thema", "0", time()+60, "/"); } $thema_val = array ( "Wybierz temat serwisu", "Flora i fauna", "Podroze", "Technologia", "Nauka" ) ; $option = '' ; $max = count($thema_val) ; for ( $i=0; $i < $max; $i++ ) { if ( $i == $thema ) { $option .= "<option value='".$i."' selected >".$thema_val[$i]."</option>" ; } else { $option .= "<option value='".$i."'>".$thema_val[$i]."</option>" ; } } switch ($thema) { case 0: $content_title = 'Strona tytulowa' ; break ; case 1: $content_title = 'Flora i fauna' ; $content=' <figure> <img src="../images/flora_fauna.jpg" alt="flora_fauna" /> <figcaption style="text-align:center; width:70%">Rys.1 Flora.</figcaption> </figure> '; break ; case 2: $content_title = 'Podroze' ; $content=' <figure> <img src="../images/podroze.jpg" alt="podroze" /> <figcaption style="text-align:center; width:70%">Rys.1 Podroze.</figcaption> </figure> '; break ; case 3: $content_title = 'Technologia' ; $content=' <figure> <img src="../images/technologia.jpg" alt="technologia" /> <figcaption style="text-align:center; width:70%">Rys.1 Technologia.</figcaption> </figure> '; break ; case 4: $content_title = 'Nauka' ; $content=' <figure> <img src="../images/nauka.jpg" alt="nauka" /> <figcaption style="text-align:center; width:70%">Rys.1 Nauka.</figcaption> </figure> '; break ; } ?> <html> <head> <title>Test cookie</title> <script> function changeThema() { var ind_poz_wyb = document.getElementById('sel').options.selectedIndex; console.log(ind_poz_wyb) ; cookieHandler.setCookie('thema', ind_poz_wyb, 1 ); } function unSetCookie() { cookieHandler.deleteCookie('thema'); } function listCookie() { var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); var text = "<table><tr><th>Nazwa ciasteczka</th><th>Zawartosc ciasteczka</th></tr>" ;; for(var i = 0; i < ca.length; i++) { text += "<tr><td>" + ca[i].split("=")[0] + "</td>"; text += "<td>" + ca[i].split("=")[1] +"</td></tr></tr>"; } text += "</table>"; document.getElementById('div_cookie').innerHTML = text ; } var cookieHandler = {}; cookieHandler.isValidCookie = function (cookieName) { var cookieValue = cookieHandler.getCookieValue(cookieName); return (cookieValue == '') ? false : true; }; cookieHandler.setCookie = function (cookieName, cookieValue, nDays) { var d = new Date(); d.setTime(d.getTime() + (nDays*24*60*60*1000)); var expires = "expires="+ d.toUTCString(); document.cookie = cookieName + "=" + cookieValue + ";" + expires + ";path=/"; } cookieHandler.getCookieValue = function (cookieName) { var name = cookieName + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for(var i = 0; i <ca.length; i++) { var c = ca[i]; while (c.charAt(0) == ' ') { c = c.substring(1); } if (c.indexOf(name) == 0) { return c.substring(name.length, c.length); } } return ''; } cookieHandler.deleteCookie = function (cookieName) { cookieHandler.setCookie(cookieName,'',-730); } </script> <style> #nav { border: 1px solid blue ; width: 300px; margin: 10px; padding: 10px; float:left; } #content { width: 500px; float:left; } </style> </head> <body> <div id='nav'> <p>Test serwisu z ciasteczkami, <br/> dostarczanie wybranej tresci z serwisu.</p> <br/> <form> <select id='sel' onchange='changeThema();'> <?php echo $option ; ?> </select><br/><br/> <input type='button' id='del' value='Usun cookie' onclick='unSetCookie();'></input> <br/><br/> <input type='button' id='list' value='Lista cookie' onclick='listCookie()'></input> <br/><br/> <input type='button' id='rel' value='Przeladuj strone' onclick='location.reload();'></input> </div> <div id='content'> <h2><?php echo $content_title ; ?></h2> <?php echo $content; ?> </div> <div id="div_cookie"></div> </body> </html>
- Obsługa sesji w serwisie WWW
- Sprawdzamy zawartość globalnych tablic $_COOKIE i $_SESSION na serwerze, skrypt w pliku lab5_E01.php".
Plik lab5_E01.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php print '<br/><br/>' ; print 'Tablica $_COOKIE<br/>'; print '=================<br/>'; foreach ( $_COOKIE as $key => $value ) { print '$_COOKIE['.$key.'] = '.$value.'<br/>' ; } print '<br/>' ; print 'Tablica $_SESSION</br>'; print '==================<br/>'; foreach ( $_SESSION as $key => $value ) { print '$_SESSION['.$key.'] = '.$value.'<br/>' ; } ?>
- W kolejnym skrypcie ustawiamy sesję i ponownie sprawdzamy tablice $_COOKIE i $_SESSION, skrypt w pliku "lab5_E02.php".
Plik lab5_E02.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php session_start(); print "Sesssion ID = ".session_id(); print '<br/><br/>' ; print 'Tablica $_COOKIE<br/>'; print '=================<br/>'; foreach ( $_COOKIE as $key => $value ) { print '$_COOKIE['.$key.'] = '.$value.'<br/>' ; } print '<br/>' ; print 'Tablica $_SESSION</br>'; print '==================<br/>'; foreach ( $_SESSION as $key => $value ) { print '$_SESSION['.$key.'] = '.$value.'<br/>' ; } ?>
- Ustawiamy zmienną sesyjną w tablicy $_SESSSION, plik "lab5_E03.php".
Plik lab5_E03.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php session_start(); print "Sesssion ID = ".session_id().'<br/>'; print "Session name - ".session_name().'<br/>'; print "Ustawiamy zmienna sesyjna 'USER' <br/>" ; $_SESSION['user'] = 'Kowalski' ; print '<br/>' ; print 'Tablica $_COOKIE<br/>'; print '=================<br/>'; foreach ( $_COOKIE as $key => $value ) { print '$_COOKIE['.$key.'] = '.$value.'<br/>' ; } print '<br/>' ; print 'Tablica $_SESSION</br>'; print '==================<br/>'; foreach ( $_SESSION as $key => $value ) { print '$_SESSION['.$key.'] = '.$value.'<br/>' ; } ?>
- Ustawienie parametrów ciasteczek do przesyłania identyfikatora sesji, plik "lab5_E04.php".
Plik lab5_E04.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php $lifetime=300; session_start(); setcookie(session_name(),session_id(),time()+$lifetime,'/'); print "Sesssion ID = ".session_id().'<br/>'; print "Session name - ".session_name().'<br/>'; print "Ustawiamy zmienna sesyjna 'USER' <br/>" ; $_SESSION['user'] = 'Kowalski' ; print '<br/>' ; print 'Tablica $_COOKIE<br/>'; print '=================<br/>'; foreach ( $_COOKIE as $key => $value ) { print '$_COOKIE['.$key.'] = '.$value.'<br/>' ; } print '<br/>' ; print 'Tablica $_SESSION</br>'; print '==================<br/>'; foreach ( $_SESSION as $key => $value ) { print '$_SESSION['.$key.'] = '.$value.'<br/>' ; } ?>
- Usunięcie zmiennych sesyjnych i sesji na serwerze, plik "lab5_E05.php"
Plik lab5_E05.php ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<?php session_start(); print "Sesssion ID = ".session_id().'<br/>'; print "Session name - ".session_name().'<br/>'; print "Usuwamy zmienne sesyjne <br/>" ; unset($_SESSION['user']) ; print "Usuwamy sesje <br/>" ; setcookie( session_name(), session_id(), time()-42000, '/' ) ; session_destroy(); print "Sprawdzamy Sesssion ID = ".session_id().'<br/>'; print '<br/>' ; print 'Tablica $_COOKIE<br/>'; print '=================<br/>'; foreach ( $_COOKIE as $key => $value ) { print '$_COOKIE['.$key.'] = '.$value.'<br/>' ; } print '<br/>' ; print 'Tablica $_SESSION</br>'; print '==================<br/>'; foreach ( $_SESSION as $key => $value ) { print '$_SESSION['.$key.'] = '.$value.'<br/>' ; } ?>
- Technologia AJAX
- Pierwsza aplikacja AJAX, pliki klienta: "lab5_F01.html" i "lab5_F01.js" oraz na serwerze "lab5_F01.php".
Plik lab5_F01.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html> <html> <head> <title>Ajax: Przyklad 1</title> <script src="lab5_F01.js" type="text/javascript" ></script> </head> <body> <div style="text-align:center" > <table border="1" > <tr><th>Ajax: Pierwszy skrypt</th></tr> </table> <br /> <form action="#"> <input type="button" value="Pokaz informacje" onclick="sendRequest()"/> </form> </div> </body> </html>
Plik lab5_F01.js - ( [listing dokumentu] [link do dokumentu] )
var xhr; function sendRequest() { if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() ; xhr.onreadystatechange = handleResponse ; xhr.open("GET", "lab5_F01.php", true); xhr.send(null); } else { return (null) ; } } function handleResponse() { if (xhr.readyState == 4) { alert(xhr.responseText) ; } }
Plik lab5_F01.php - ( [listing dokumentu] [link do dokumentu] )
<?php print "Hello, AJAX" ; ?>
- Status żądania aplikacji AJAX, pliki klienta: "lab5_F02.html" i "lab5_F02.js" oraz na serwerze "lab5_F01.php" (poprzednie ćwiczenie).
Plik lab5_F02.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html> <html> <head> <title>Ajax: Przyklad 2</title> <script src="lab5_F02.js" type="text/javascript"></script> </head> <body> <div style="text-align:center" > <table border="1" > <tr><th>Ajax: Drugi skrypt</th></tr> </table> <br /> <form action="#"> <input type="button" value="Pokaz informacje" onclick="sendRequest()"/> </form> <div id="MyDivElement"></div> </div> </body> </html>
Plik lab5_F02.js - ( [listing dokumentu] [link do dokumentu] )
var xhr; function sendRequest() { if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() ; xhr.onreadystatechange = handleResponse ; xhr.open("GET", "lab5_F01.php", true); xhr.send(null); } else { return (null) ; } } function handleResponse() { myDiv = document.getElementById("MyDivElement"); if (xhr.readyState == 1) { myDiv.innerHTML += "Status zadania: 1 (laduje)<br/>" ; } else if (xhr.readyState == 2) { myDiv.innerHTML += "Status zadania: 2 (zaladowany)<br/>" ; } else if (xhr.readyState == 3) { myDiv.innerHTML += "Status zadania: 3 (interaktywny)<br/>" ; } else if (xhr.readyState == 4) { if ( xhr.status == 200 ) { response = xhr.responseText; myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ; myDiv.innerHTML += response ; } } }
- Nagłówki żądania aplikacji AJAX, pliki klienta: "lab5_F03.html" i "lab5_F03.js" oraz na serwerze "lab5_F01.php" (poprzednie ćwiczenie).
Plik lab5_F03.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html> <html> <head> <title>Ajax: Przyklad 3</title> <script src="lab5_F03.js" type="text/javascript"></script> </head> <body> <div style="text-align:center" > <table border="1" > <tr><th>Ajax: Trzeci skrypt</th></tr> </table> <br /> <form action="#"> <input type="button" value="Pokaz informacje" onclick="sendRequest()"/> </form> <div id="MyDivElement"></div> </div> </body> </html>
Plik lab5_F03.js - ( [listing dokumentu] [link do dokumentu] )
var xhr; function sendRequest() { if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() ; xhr.onreadystatechange = handleResponse ; xhr.open("GET", "lab5_F01.php", true); xhr.send(null); } else { return (null) ; } } function handleResponse() { myDiv = document.getElementById("MyDivElement"); if (xhr.readyState == 1) { myDiv.innerHTML += "Status zadania: 1 (laduje)<br/>" ; } else if (xhr.readyState == 2) { myDiv.innerHTML += "Status zadania: 2 (zaladowany)<br/>" ; } else if (xhr.readyState == 3) { myDiv.innerHTML += "Status zadania: 3 (interaktywny)<br/>" ; } else if (xhr.readyState == 4) { if ( xhr.status == 200 ) { response = xhr.responseText; myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ; myDiv.innerHTML += response + "<br/>" ; myDiv.innerHTML += "<pre>" + xhr.getAllResponseHeaders() + "</pre><br />" ; } } }
- Przesłanie danych z formularza w technologii AJAX, metoda GET http, pliki klienta: "lab5_F04.html" i "lab5_F04.js" oraz na serwerze "lab5_F04.php".
Plik lab5_F04.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html> <html> <head> <title>Ajax: Przyklad 4</title> <script src="lab5_F04.js" type="text/javascript"></script> </head> <body> <div style="text-align:center" > <table border="1" > <tr><th>Ajax: Czwarty skrypt</th></tr> </table> <br /> <form action="#"> Dowolny tekst: <input id="info" name="info" /><br /> <input type="button" value="Pokaz informacje" onclick="sendRequest()"/> </form> <div id="MyDivElement"></div> </div> </body> </html>
Plik lab5_F04.js - ( [listing dokumentu] [link do dokumentu] )
var xhr; function sendRequest() { if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() ; var info = document.getElementById('info').value ; var url = "lab5_F04.php" ; url += "?info=" + info; xhr.onreadystatechange = handleResponse ; xhr.open("GET", url, true); xhr.send(null); } else { return (null) ; } } function handleResponse() { myDiv = document.getElementById("MyDivElement"); if (xhr.readyState == 4) { if ( xhr.status == 200 ) { response = xhr.responseText; myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ; myDiv.innerHTML += response + "<br/>" ; myDiv.innerHTML += "<pre>" + xhr.getAllResponseHeaders() + "</pre><br />" ; } } }
Plik lab5_F04.php - ( [listing dokumentu] [link do dokumentu] )
<?php $info = $_GET['info'] ; $request_method = $_SERVER['REQUEST_METHOD'] ; $query_string = $_SERVER['QUERY_STRING'] ; echo "<p>Env:</p>" ; echo "<table>" ; echo "<tr><td>REQUEST_METHOD: </td><td>".$request_method."</td></tr>" ; echo "<tr><td>QUERY_STRING: </td><td>".$query_string."</td></tr>" ; echo "<tr><td> Wartosc zmiennej 'info': </td><td>".$info."</td></tr>" ; echo "</table>" ; ?>
- Przesłanie danych z formularza w technologii AJAX, metoda POST http, pliki klienta: "lab5_F05.html" i "lab5_F05.js" oraz na serwerze "lab5_F05.php".
Plik lab5_F05.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!DOCTYPE html> <html> <head> <title>Ajax: Przyklad 5</title> <script src="lab5_F05.js" type="text/javascript"></script> </head> <body> <div style="text-align:center" > <table border="1" > <tr><th>Ajax: Piaty skrypt</th></tr> </table> <br /> <form action="#" > Dowolny tekst: <input id="info" name="info" /><br /> <input type="button" value="Pokaz informacje" onclick="sendRequest()"/> </form> <div id="MyDivElement"></div> </div> </body> </html>
Plik lab5_F05.js - ( [listing dokumentu] [link do dokumentu] )
var xhr; function sendRequest() { if (window.XMLHttpRequest) { xhr = new XMLHttpRequest() ; var info = document.getElementById('info').value ; var url = "lab5_F05.php" ; var data = "info=" + encodeURIComponent(info) ; xhr.onreadystatechange = handleResponse ; xhr.open("POST", url, true); xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded") ; xhr.send(data); } else { return (null) ; } } function handleResponse() { myDiv = document.getElementById("MyDivElement"); if (xhr.readyState == 4) { if ( xhr.status == 200 ) { response = xhr.responseText; myDiv.innerHTML += "Status zadania: 4 (zakonczony)<br/>" ; myDiv.innerHTML += response + "<br/>" ; myDiv.innerHTML += "<pre>" + xhr.getAllResponseHeaders() + "</pre><br />" ; } } }
Plik lab5_F05.php - ( [listing dokumentu] [link do dokumentu] )
<?php $info = $_POST['info'] ; $request_method = $_SERVER['REQUEST_METHOD'] ; $query_string = $_SERVER['QUERY_STRING'] ; echo "<p>Env:</p>" ; echo "<table border='1'>" ; echo "<tr><td>REQUEST_METHOD: </td><td>".$request_method."</td></tr>" ; echo "<tr><td>QUERY_STRING: </td><td>".$query_string."</td></tr>" ; echo "<tr><td> Wartosc zmiennej 'info': </td><td>".$info."</td></tr>" ; echo "</table>" ; ?>
- Miniportal do obsługi ocen semestralnych [wersja 2021.01.15.001]
- portal_login.html - plik opracowany w języku html zawiera formularz logowania. Po wprowadzeniu nazwy użytkownika i hasła dane są przesłane do pliku "portal_sprawdz.php". Dane wysyłane są metodą "post" protokołu http.
- portal_sprawdz.php – plik zawierający kod opracowany w języku php. Po pobraniu danych przesłanych z formularza logowania (odczyt danych z tablicy $_POST) dane użytkownika porównywane są z danymi zapisanymi w pliku tekstowym "portal_users.txt". W przypadku poprawnej weryfikacji użytkownika system tworzy zmienne sesyjne ($_SESSION) oraz wysyła odpowiednie przekierowanie użytkownika na odpowiednią stronę. Dla nauczyciela wywoływana jest strona nauczyciela - "portal_nauczyciel.php" a przypadku ucznia strona "portal_uczen.php". W przypadku podania błędnych danych uwierzytelniających wyświetlana jest strona "portal_blad.html".
- portal_users.txt – plik zawiera dane użytkownika, tj. numer identyfikacyjny, imię i nazwisko, typ oraz hasło do serwisu. Dane użytkowników zapisane są w kolejnych rekordach pliku. Kolejność danych w pliku: numer identyfikacyjny (liczba naturalna), imię, nazwisko, hasło i typ. Dane są oddzielone znakiem dwukropka. Typ użytkownika reprezentują pojedyncze duże litery – N – nauczyciel i U – uczeń. Przykładowy wpis w pliku: 1:Adam:Abacki:haslo:N>
- portal_blad.html – plik zawiera informację o błędnym logowaniu do systemu oraz link przekierowujący na stronę logowania.
- portal_uczen.php - plik wyświetla dane poprawnie uwierzytelnionego w serwisie ucznia. Dane są odczytywane z pliku "portal_oceny.txt". Plik składa się z czterech części. W pierwszej części sprawdzamy czy użytkownik jest poprawnie zalogowany do serwisu – sprawdzenie czy jest ustawiona zmienna $_SESSION["log"]. W następnej części sprawdzamy czy plik został uruchomiony przez odpowiedniego użytkownika, w tym przypadku ucznia – sprawdzamy zmienną $_SESSION["typ"]. Po prawidłowej weryfikacji użytkownika w części pierwszej w drugiej skrypt odczytuje dane ucznia z pliku "portal_oceny.txt". W ostatniej części skryptu dane ucznia wyświetlane są w tabeli, która jest tworzona dynamicznie. W ramach serwisu uczeń może tylko odczytać dane przygotowane przez nauczyciela.
- portal_nauczyciel.php – plik umożliwia wprowadzenie danych uczniów do systemu. Podobnie jak plik "portal_uczen.php" plik można podzielić na cztery logiczne części. Tak jak w przypadku pliku "portal_uczen.php" na początku sprawdzamy poprawność uwierzytelnienia – zmienna $_SESSION["log'] oraz autoryzację użytkownika – czy plik wyświetla użytkownik typu nauczyciel – zmienna $_SESSION["typ"]. Po poprawnej weryfikacji użytkownika następuje odczyt danych zawartych w pliku "portal_oceny.txt'. W ostatniej części skryptu generowana jest tabela zawierająca dane wszystkich uczniów, którzy zostali umieszczeni w pliku "portal_oceny.txt". Utworzona w skrypcie tabela zawiera pola, które można edytować. W ramach generowanego dokumentu html wykorzystano nowy atrybut 'contenteditable” który umożliwia edycję danych w dokumencie html bez konieczności wykorzystywania elementu <input/>. Po wprowadzeniu danych dane wysyłane są poprzez funkcję opracowaną w języku Javascript umieszczoną w pliku "portal_func.js", który dołączony jest w nagłówku tworzonego dokumentu html przez skrypt umieszczony w pliku "portal_nauczyciel.php".
- portal_func.js – plik napisany w języku Javascript. W ramach pliku zawarte są dwie funkcje. Pierwsza z nich "fn_zapisz()" jest uruchomiana poprzez akcję onclick() w dokumencie html wygenerowanym przez skrypt zawarty w pliku "portal_nauczyciel.php". Początkowo odczytujemy dane z zamieszczone w tabeli dotyczące ocen uczniów. Po ich odpowiednim sformatowaniu w ramach funkcji wysyłamy dane do serwera WWW. Dane wysyłamy do skryptu "portal_zapisz.php" wykorzystując technologię AJAX. Wykorzystanie technologii AJAX umożliwia nam przesłanie danych na serwer bez przeładowania aktualnie wyświetlanej strony. W ramach pliku "portal_func.js" umieszczona jest jeszcze druga funkcja "Response()". Zadaniem tej funkcji jest przekazanie użytkownikowi informacji o poprawnym zapisaniu danych po stronie serwera.
- portal_zapisz.php – plik zawiera skrypt napisany w języku php. W ramach skryptu następuję odebranie danych opracowanych przez nauczyciela i ich zapis do pliku "portal_oceny.txt". Na początku sprawdzamy czy dane przesyła użytkownik uwierzytelniony w systemie – sprawdzenie zmiennej $_SESSION["log"]. W następnym kroku odczytujemy dane przesłane z strony nauczyciela – odczyt zmiennej $_POST["data"]. Po zdekodowaniu przesłanych danych odczytujemy pierwszy wiersz z pliku "portal_oceny.txt" zawierający informacje o przedmiotach obsługiwanych w ramach serwisu a następnie nadpisujemy plik "portal_oceny.txt" nowymi danymi.
- portal_oceny.txt – plik zawiera informacje o przedmiotach oraz ocenach obsługiwanych w ramach naszego sytemu. W pierwszym rekordzie umieszczamy nazwy przedmiotów rozdzielone znakiem dwukropka. W kolejnych liniach umieszczone są dane dla kolejnych uczniów. Plik należy wcześniej przygotować umieszczając w nim przedmioty i numery wszystkich uczniów, którzy będą obsługiwani w systemie.
- Logowanie do serwisu, plik "portal_login.html"
Plik portal_login.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!doctype html> <html> <head> <title>Strona logowania do serwisu</title> <meta charset="ISO-8859-2"> </head> <body> <!-- prosta strona z formularzem do logowania --> <div> <h1>Panel logowania</h1> <form method="post" action="portal_sprawdz.php"> <table> <tr><td>Uytkownik:</td><td><input type="text" name="user" value="" size="15" /></td></tr> <tr><td>Haso: </td><td><input type="password" name="pass" size="15" /></td></tr> <tr><td colspan="2"><input type="submit" value="zaloguj" /></td></tr> </table> </form> </div> </body> </html>
- Skrypt sprawdzający poprawność logowania na podstawie pliku z danymi użytkowników, plik "portal_sprawdz.php"
Plik portal_sprawdz.php - ( [listing dokumentu] [link do dokumentu] )
<?php error_reporting(E_ALL); try { $nazwisko = $_POST['user'] ; $haslo = $_POST['pass'] ; /*** czytamy plik z danymi uzytkownikow ***/ $nazwa = "portal_users.txt" ; if (file_exists($nazwa)) { //echo "Plik $nazwa istnieje" $uchwyt = fopen($nazwa,"r"); $ok = 0 ; while ( false !== ($linia = fgets($uchwyt)) ) { list($id,$imie,$user,$pass,$typ) = explode(":",$linia) ; if ( $user == $nazwisko and $pass == $haslo ) { session_start(); $_SESSION['log'] = 'ok'; $_SESSION['id'] = $id ; $_SESSION['typ'] = $typ ; $_SESSION['user'] = $imie." ".$user ; $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); if ( $typ == 'U' ) { $extra = 'portal_uczen.php'; header("Location: http://$host$uri/$extra"); exit; } else { $extra = 'portal_nauczyciel.php'; header("Location: http://$host$uri/$extra"); exit; } } } $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_blad.html'; header("Location: http://$host$uri/$extra"); exit; } else { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_blad.html'; header("Location: http://$host$uri/$extra"); exit; } } catch(Exception $e) { echo $e->getMessage(); } ?>
- Plik z danymi użytkowników, plik "portal_users.txt"
Plik portal_users.txt - ( [listing dokumentu] [link do dokumentu] )
1:Adam:Abacki:aaa:U: 2:Bogdan:Babacki:aaa:U: 3:Lucjan:Cabacki:aaa:N: 4:Marek:Dadacki:aaa:U: 5:Bogdan:Kowalski:aaa:U:
- Plik obsługujący niepoprawne logowanie użytkownika, plik "portal_blad.html"
Plik portal_blad.html - ( [listing dokumentu] [link do dokumentu] [widok dokumentu])
<!doctype html> <html> <head> <title>Bd logowania</title> <meta charset="ISO-8859-2"> </head> <body> <div> <h1>Niepoprawne dane do logowania !</h1> <p>Podaj poprawnie identyfikator uytkownika i haso ! </p> <a href="portal_login.html">Powrt</a> </div> </body> </html>
- Plik ucznia wyświetlający dostępne oceny w systemie, plik "portal_uczen.php"
Plik portal_uczen.php - ( [listing dokumentu] [link do dokumentu] )
<?php session_start(); if ($_SESSION["log"]!="ok") { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_login.html'; header("Location: http://$host$uri/$extra"); exit; } if ($_SESSION["typ"] != "U" ) { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_nauczyciel.php'; header("Location: http://$host$uri/$extra"); exit; } $id = $_SESSION['id'] ; ?> <!doctype html> <html> <head> <title>Panel ucznia</title> <meta charset="ISO-8859-2"> <style type="text/css"> table { border-collapse:collapse; width: 450px; } table, td, th { border:1px solid blue; } </style> </head> <body> <?php $nazwa = "portal_oceny.txt" ; /** wyswielimy oceny ucznia ktory sie zalogowal **/ echo "<h1>Oceny ucznia: ".$_SESSION['user']." </h1>" ; echo "<table border=\"1\" ><tr><th>Lp.</th><th>Nazwa przedmiotu</th> <th>Ocena na półrocze</th><th>Ocena roczna</th></tr>" ; if (file_exists($nazwa)) { $uchwyt = fopen($nazwa,"r"); $linia = fgets($uchwyt) ; $przedmioty = explode(":",$linia) ; while ( false !== ($linia = fgets($uchwyt)) ) { $oceny = array() ; $oceny = explode(":",$linia) ; // print_r($oceny) ; if ( $oceny[0] == $_SESSION['id'] ) { for ( $ii=0; $ii<count($przedmioty); $ii++ ) { $ip = $ii+1 ; $txt = '<tr><td>'.$ip ; $txt .= '</td><td>'.$przedmioty[$ii] ; $io = 2*$ii ; $txt .= '</td><td>'.$oceny[$io+1] ; $txt .= '</td><td>'.$oceny[$io+2] ; $txt .= '</td></tr>'; echo $txt ; } } } } echo "</table>" ; ?> </body> </html>
- Plik nauczyciela wprowadzający dane do serwisu, plik "portal_nauczyciel.php"
Plik portal_nauczyciel.php - ( [listing dokumentu] [link do dokumentu] )
<?php session_start(); if ($_SESSION["log"]!="ok") { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_login.html'; header("Location: http://$host$uri/$extra"); exit; } if ($_SESSION["typ"] != "N" ) { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_uczen.php'; header("Location: http://$host$uri/$extra"); exit; } //else { // session_destroy(); // session_write_close(); //} $id = $_SESSION['id'] ; ?> <!doctype html> <html> <head> <title>Panel nauczyciela</title> <meta charset="ISO-8859-2"> <style type="text/css"> table { border-collapse:collapse; width: 450px; } table, td, th { border:1px solid blue; } </style> <script src="portal_func.js" ></script> </head> <body > <h1>Panel nauczyciela</h1> <?php echo "<h3>Oceny kocowe na procze i koniec roku</h3>" ; $nazwa = "portal_users.txt" ; if (file_exists($nazwa)) { //echo "Plik $nazwa istnieje" $uchwyt = fopen($nazwa,"r"); $ok = 0 ; while ( false !== ($linia = fgets($uchwyt)) ) { list($id,$imie,$user,$pass,$typ) = explode(":",$linia) ; if ( $typ == 'U') { $uczen[$id]['imie'] = $imie ; $uczen[$id]['nazw'] = $user ; } } } $l_uczniow = count($uczen) ; echo "<table border=\"1\" >" ; $nazwa = "portal_oceny.txt" ; if (file_exists($nazwa)) { $uchwyt = fopen($nazwa,"r"); $linia = fgets($uchwyt) ; $przedmioty = explode(":",$linia) ; $txt = "<tr><th>Lp.</th><th>ID</th><th>I.Nazwisko</th>" ; $txt1 = "<tr><th> </th><th> </th><th> </th>" ; for ( $ii=0; $ii<count($przedmioty); $ii++ ) { $txt .= "<th colspan=\"2\">".$przedmioty[$ii]."</th>" ; $txt1 .= "<th>sem.</th><th>kon.</th>" ; } $txt .= "</tr>" ; $txt1 .= "</tr>" ; print $txt ; print $txt1 ; $id_uczen = 0 ; while ( false !== ($linia = fgets($uchwyt)) ) { $oceny = array() ; $id_uczen = $id_uczen + 1 ; $oceny = explode(":",$linia) ; $l_przed = count($oceny)-1 ; $txt = '<tr><td>'.$id_uczen.'</td><td id="u'.$id_uczen.'">'.$oceny[0].'</td>' ; $txt .= '<td>'.$uczen[$oceny[0]]['imie'].' '.$uczen[$oceny[0]]['nazw'].'</td>' ; for ( $ii=0; $ii<count($oceny)-1; $ii++ ) { $ident = $oceny[0].'_'.$ii ; $txt .= '<td contenteditable="true" id='.$ident.'>'.$oceny[$ii+1].'</td>' ; } $txt .= '</tr>'; echo $txt ; //} } echo "</table>\n" ; echo "<p><input type=\"button\" value=\"Wyslij\" onclick=\"fn_zapisz();\" /> <span id=\"ok\"></span></p>" ; echo "<input type=\"hidden\" name=\"l_uczen\" id=\"luczen\" value=\"".$id_uczen."\" />\n" ; echo "<input type=\"hidden\" name=\"l_przed\" id=\"lprzed\" value=\"".$l_przed."\" />\n" ; } ?> </body> </html>
- Plik zawierający funkcje w języku Javascript odczytujące dane z strony nauczyciela
i wysyłający na serwer WWW, plik "portal_func.js"
Plik portal_func.js - ( [listing dokumentu] [link do dokumentu] )
function fn_zapisz() { var luczen = document.getElementById('luczen').value ; var lprzed = document.getElementById('lprzed').value ; var dane = new Array(); var result = new Array(); for ( var i1=0; i1<luczen; i1++ ) { i11 = i1+1; id_u = 'u'+i11 ; dane[i1] = new Array() ; dane[i1][0] = document.getElementById(id_u).innerHTML ; //alert(dane[i1][0]); txt = (dane[i1][0]).toString() ; for ( var i2=0; i2<lprzed; i2++ ) { id_p = dane[i1][0].toString()+'_'+(i2).toString() ; i3 = i2+1 ; dane[i1][i3] = document.getElementById(id_p).innerHTML ; txt += ':'+(dane[i1][i3]).toString() ; } result.push (txt) ; } json_data = JSON.stringify(result); var param = "data=" + encodeURIComponent(json_data) ; http_request = new XMLHttpRequest(); } http_request.onreadystatechange = Response; url="portal_zapisz.php" ; now = new Date(); url = url + '?time=' + now.getTime() ; http_request.open('POST', url, true); http_request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); http_request.setRequestHeader("Content-length", param.length); http_request.send(param); } function Response() { if (http_request.readyState == 4) { var result = http_request.responseText; document.getElementById('ok').innerHTML = result ; } }
- Plik zapisujący dane do serwisu, plik "portal_zapisz.php"
Plik portal_zapisz.php - ( [listing dokumentu] [link do dokumentu] )
<?php session_start(); if ($_SESSION["log"]!="ok") { $host = $_SERVER['HTTP_HOST']; $uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\'); $extra = 'portal_login.html'; header("Location: http://$host$uri/$extra"); exit; } $data = $_POST['data'] ; $data = str_replace("\\n","",$data) ; $dane = json_decode($data); $nazwa = "portal_oceny.txt" ; if (file_exists($nazwa)) { $uchwyt = fopen($nazwa,"r"); $linia = fgets($uchwyt) ; } fclose($uchwyt) ; $uchwyt = fopen($nazwa,"w") ; fwrite($uchwyt, $linia) ; for ( $i=0; $i < count($dane); $i++ ) { $txt = $dane[$i]."\n" ; fwrite($uchwyt, $txt) ; } fclose($uchwyt) ; // print_r ($dane) ; print "OK. Dane zapisane." ; ?>
- Plik portal_oceny.txt zawierający przykładowe dane. Rekord pierwszy zawiera przedmioty dostępne w serwisie,
kolejne rekordy dane studentów. Każdy rekord zawiera dane dla jednego studenta. Na początku każdej linii
znajduje się identyfikator ucznia zgodny z identyfikatorem użytkownika w pliku "portal_users.txt".
Po numerze identyfikacyjnym należy wprowadzić znak dwukropka w licznie równej
dwukrotności liczby przedmiotów (w prezentowanym przykładzie – 4 przedmioty – 8 dwukropków).
Tak przygotowany plik nie zawiera ocen. Oceny zostaną wprowadzone poprzez panel nauczyciela.
Plik portal_oceny.txt - ( [listing dokumentu] [link do dokumentu] )
j.polski:matematyka:historia 1:4:3:5<br>:3:4<br>:3<br> 2:4:4:4<br>:4:3<br>:4<br> 4:5<br>:2<br>:4<br>:4<br>:4<br>:4<br> 5:3<br>:4<br>:4<br>:4<br>:4<br>:4<br>
- Linki do dodatkowych materiałów (dostęp na dzień 10.03.2023)
- Grafika SVG
- SVG Tutorial
- SVG Tutorial
- Grafika canvas
- Kurs HTML5 – Canvas – Podstawy
- Canvas tutorial
- HTML Canvas Tutorial
- HTML5 Canvas Tutorials Home
Protokół http jest bezstanowy. Standardowo po zakończeniu obsługi żądania http przez serwer, serwer nie zapisuje danych dotyczących klienta, a przeglądarka po wyświetleniu informacji, nie posiada danych umożliwiających utrzymanie interakcji z serwerem. Jednak, jeżeli tworzymy spersonalizowany serwis, dostępny poprzez logowanie, oczekujemy od serwisu, aby zarówno przeglądarka jak i serwer pamiętały interakcje pomiędzy serwerem i przeglądarką.
Do realizacji tego zadania opracowano dwie technologie:
HTTP Cookie umożliwiają przechowanie tymczasowych danych pomiędzy kolejnymi wizytami na konkretnej stronie na komputerze klienta. Ciasteczka ustawia serwer i przesyła do klienta w nagłówku protokołu http, po stronie klienta informacja jest zapisyna na dysku i przy kolejnych wywołaniach do serwisu klient dodaje ciasteczka do nagłówka żądania http. Ciasteczka używamy np. do obsługi logowania ( zapamiętanie sesji ), personalizowania strony ( zapamiętanie preferencji użytkownika ) czy badania preferencji użytkownika ( ankiety ). Maksymalna wielkość ciasteczka to 4 kB, przeglądarka może zapisac 300 plików cookie ale dla danego serwera (ścieżki) maksymalnie 20.
Wysyłając ciasteczko z serwera ustawiamy następujące parametry (atrybuty):
Set-Cookie: nazwa=wartość; expires=DATA; path=¦CIEŻKA; domain=DOMENA; secure
W ramach tego punktu zostanie przedstawiona technologia AJAX. Zadania zostaną zrealizowane z wykorzystaniem HTML5 i języka Javascript po stronie przeglądarki i skryptów php działających po stronie serwera.

W ramach projektu zostanie opracowany serwis udostępniający oceny semestralne i końcowe ucznia. Serwis będzie wymagał dostępu poprzez uwierzytelnienie użytkownika. Po uwierzytelnieniu użytkownika w zależności od jego typu (autoryzacja) system udostępni stronę przeznaczoną dla nauczyciela, kiedy typ użytkownika to nauczyciel lub w przypadku kiedy typ użytkownika to uczeń stronę przeznaczoną dla ucznia. Opracowany projekt składa się z kilku plików. Poniżeej opis plików i realizowane zadania w ramach serwisu.