formularze w php – testy, dyktanda i inne pomoce
Transkrypt
formularze w php – testy, dyktanda i inne pomoce
VIII Konferencja Informatyka w Edukacji, Toruń, 5-6 lipca 2011 FORMULARZE W PHP – TESTY, DYKTANDA I INNE POMOCE DYDAKTYCZNE Borowiecka Agnieszka Ośrodek Edukacji Informatycznej i Zastosowań Komputerów w Warszawie 02-026 Warszawa, ul. Raszyńska 8/10 [email protected]; http://agn.oeiizk.waw.pl The Internet is a common medium among youngsters therefore it is advisable to use it during lessons. Interactive web pages with forms can be important educational element. PHP language can be used to create simple teaching aids like forms with quizzes, automatically checked spelling exercises or word-guess puzzles. 1. Wstęp Działania interaktywne, a szczególnie róŜnego typu aktywności z wykorzystaniem technologii informacyjno-komunikacyjnej, stanowią waŜną część kaŜdej lekcji. Do przygotowania prostych testów, zagadek czy dyktand moŜemy wykorzystać formularze na stronie WWW. Do automatyzacji tworzenia bardziej rozbudowanych formularzy, a przede wszystkim do ich obsługi warto uŜyć skryptów PHP. Gotowe strony z zadaniami dla uczniów moŜna następnie wykorzystać na lekcji lub udostępnić w sieci Internet jako ćwiczenia domowe czy powtórzeniowe. Pracę rozpoczynamy zwykle od przygotowania czystego kodu HTML generującego formularz i przechwycenia odpowiednim skryptem danych wprowadzonych do niego przez uŜytkownika. Nieco trudniejszym zadaniem jest odpowiednie „obsłuŜenie” formularza – nie tylko zapamiętanie wyników, ale i ich analiza, wskazanie błędnych i poprawnych odpowiedzi. Jeśli często wykorzystujemy róŜne testy i zadania umieszczane na stronach WWW powinniśmy przygotować proste skrypty i funkcje, dzięki którym utworzenie kolejnego ćwiczenia dla uczniów stanie się mało pracochłonne. 2. Tworzenie testów Formularze naleŜą do standardu HTML i są obsługiwane przez niemal wszystkie przeglądarki. Tworzymy je za pomocą znaczników <form> </form>. W nagłówku tworzonego formularza podajemy metodę przesyłania danych do skryptu, który je przetworzy (atrybut method), oraz adres URL, pod który naleŜy przesłać zawartość pól formularza (atrybut action). Atrybut method moŜe przyjmować jedną z dwóch wartości: post lub get. Wartość post oznacza, Ŝe dane zostaną przesłane jako oddzielny strumień i pozwala przesyłać dowolne ilości danych. Umieszczając na formularzu przycisk typu submit pozwalamy uŜytkownikowi na zatwierdzenie wprowadzonych danych i przesłanie ich na adres wskazany w atrybucie action znacznika form. Dane z formularza są przetwarzane automatycznie – PHP tworzy zmienne o nazwach identycznych z nazwami pól w formularzu (określonymi przez atrybut name) i przypisuje im odpowiednie wartości. Aby uzyskać dostęp do zmiennych formularza naleŜy skorzystać z odpowiedniej tablicy superglobalnej $_POST lub $_REQUEST. W prawidłowo napisanym skrypcie powinniśmy takŜe sprawdzić, czy istnieją wszystkie potrzebne nam zmienne – uŜytkownik mógł uruchomić skrypt obsługujący formularz bezpośrednio, wprowadzając jego nazwę w polu adresu przeglądarki. 2 Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne Rysunek 1 Przykładowy fragment kodu generującego formularz i efekt wywołania Przygotowując test najczęściej korzystamy z pytań jednokrotnego wyboru (pola opcji <input type="radio">) lub pytań wielokrotnego wyboru (pola wyboru <input type="checkbox">). W przypadku pytań, dla których istnieje więcej niŜ jedna prawidłowa odpowiedź, udzielone odpowiedzi powinny być przekazywane w postaci tablicy (name="odp[]"). NaleŜy takŜe pamiętać, by określić jaka wartość będzie odpowiadała wybranej przez uŜytkownika odpowiedzi (atrybut value). Pytania i odpowiedzi muszą zostać wpisane do źródła tworzonej strony i uzupełnione o odpowiednie znaczniki formatujące. Jednak, aby skrócić kod strony i uprościć generowanie formularza moŜemy utworzyć specjalną tablicę pomocniczą, zawierającą wszystkie pytania i odpowiedzi, a następnie wykorzystać odpowiednią pętlę do generowania testu. Rysunek 2 Automatyczne generowanie testu W kolejnym kroku przygotowujemy skrypt wypisujący wyniki testu. W najprostszej wersji, po sprawdzeniu, czy istnieją odpowiednie zmienne – czyli czy uŜytkownik zaznaczył wszystkie odpowiedzi, wypisujemy na ekranie odpowiednie komentarze. MoŜemy równieŜ wykorzystać pomocniczą tablicę zawierającą pytania i odpowiedzi do wypisania pełnej informacji o wyborach uŜytkownika. Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne 3 Rysunek 3 Wypisanie wyników testu Wyniki testu mogą być wypisane na ekranie, zapisane w pliku lub bazie danych. Jeśli uŜytkownik ma od razu uzyskać informację o tym, które odpowiedzi były prawidłowe, naleŜy przechowywać taką informację w skrypcie, np. jako tablicę asocjacyjną, w której dane są trzymane w formie: numer pytania=>prawidłowa odpowiedź. 3. Dyktando Często uŜywanym elementem formularza są listy wyboru (<select>... </select>). Stosujemy je zwykle wtedy, gdy uŜytkownik wypełniający formularz powinien wybrać jedną z kilku krótkich pozycji, a nie moŜemy wykorzystać pól opcji. Ciekawym zastosowaniem list wyboru mogą być np. testy z języka obcego, w których wybierana jest odpowiednia forma gramatyczna brakującego wyrazu w zdaniu. Innym zastosowaniem moŜe być proste dyktando. Rysunek 4 Dyktando Wpisywanie listy wyboru dla kaŜdego sprawdzanego słowa w dyktandzie jest dość uciąŜliwe. Warto przygotować prostą funkcję fraza(), generującą odpowiednią listę, np. złoŜoną z fraz --, rz i Ŝ. Po wpisaniu treści dyktanda wystarczy w odpowiednie miejsca wpisać fragment kodu z wywołaniem funkcji: <?php fraza($wyniki[9]); ?>, gdzie zmienna $wyniki będzie słuŜyła do przechowywania informacji, jaka pozycja na danej liście została wybrana. Początkowo wszystkie listy wyświetlają pierwszą pozycję (dwie kreski), po naciśnięciu przycisku Sprawdź – pozycje zmienione przez osobę wypełniającą formularz zachowają swoje nowe wartości. Dyktando moŜna w prosty sposób rozbudować dodając wyświetlane poniŜej informacje takie, jak liczba poprawnych i błędnych odpowiedzi, komentarz zachęcający do dalszej pracy itp. Warto takŜe wykorzystać arkusze stylów do czytelnego sformatowania dyktanda lub do zaznaczenia kolorem prawidłowych i błędnych odpowiedzi. 4. Zgadywanka Najpopularniejszym elementem formularzy jest pole tekstowe, jednocześnie jest ono najmniej wygodne w obsłudze – wymaga od piszących skrypty rozpatrzenia wszystkich moŜliwych wersji odpowiedzi, popełnianych błędów, itp. Zwykle pola tekstowe stosujemy tylko wtedy, gdy uŜytkownik musi podać jakąś wartość (np. swoje imię), a nie znamy lub nie moŜemy prosto utworzyć listy wszystkich moŜliwych odpowiedzi. Jeśli jednak ograniczymy długość słowa wprowadzanego w polu tekstowym do jednego 4 Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne znaku (atrybut maxlength="1"), to moŜemy w prosty sposób przygotować grę polegającą na odgadywaniu ukrytego wyrazu. Odgadnięte wcześniej litery przekazujemy jako ukryte pole formularza (<input type="hidden" name="odp" value="<?php echo $odp; ?>" />), a szukany wyraz jest definiowany w skrypcie jako wartość pomocniczej zmiennej $wyraz (np. $wyraz="marchew"). Rysunek 5 Zgadywanka Zabawa będzie bardziej atrakcyjna dla uczniów, gdy będą mogli odgadywać róŜne wyrazy. Wymaga to przygotowania zbioru wyrazów, np. w postaci tablicy, oraz wybrania (wylosowania) wyrazu odgadywanego przez ucznia i przekazywania pomiędzy poszczególnymi wywołaniami skryptu. Nie jest wskazane przekazywanie odgadywanego wyrazu jako ukrytego pola formularza, bo łatwo byłoby go podejrzeć w kodzie strony. Lepiej zamiast tego wykorzystać ciasteczka lub sesje. Dodatkowym utrudnieniem moŜe być ograniczenie liczby prób podczas odgadywania wyrazów, np. przez zliczanie błędnych odpowiedzi – nie pozwalamy popełnić więcej niŜ 3 błędy. 5. Formularze z grafiką Innym elementem PHP, jaki moŜemy wykorzystać przy tworzeniu zadań dla uczniów, jest moŜliwość generowania grafiki. Najprostsze zastosowanie automatycznie generowanych rysunków, to wyświetlanie w postaci wykresu wyników testu. Oczywiście niezbędne będzie przechowywanie wyników np. w pliku lub w bazie. Ale moŜna sobie równieŜ wyobrazić inny przykład automatycznie generowanej grafiki. Na poniŜszym rysunku widoczny jest zegar, na którym naleŜy odczytać wskazywaną godzinę. Tarcza zegara została wczytana z pliku pomocniczego, zaś połoŜenie wskazówek jest losowane i odpowiednio rysowane. Rysunek 6 Generowanie grafiki do testu Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne 6. 5 Skrypty PHP 6.1. Ankieta Plik obsloga.php <?php if ((isset($_POST['p1']))&&(isset($_POST['p2'])) &&(isset($_POST['p3']))) { $p1=$_POST['p1']; echo "<p>W pytaniu 1 wybrałeś odpowiedź $p1</p>"; $p2=$_POST['p2']; echo "<p>W pytaniu 2 wybrałeś odpowiedź $p2</p>"; $p3=$_POST['p3']; echo "<p>W pytaniu 3 wybrałeś odpowiedź $p3</p>"; } else { echo '<p>Wypełnij najpierw wszystkie pytania formularza! </p>'; } ?> Tablica z pytaniami <?php $pytania=array(array('1. Według alergologów tego warzywa nie zaliczamy do uczulających:','pomidora','kalafiora','selera'), array('2. OdświeŜającą moc arbuz zawdzięcza temu, Ŝe składa się z wody:','w ponad 60%','w ponad 75%','w ponad 90%'), array('3. Według specjalistów, aby dziecko polubiło nowe warzywo, musi go spróbować nawet:','3-5 razy','5-10 razy','10-15 razy')); for ($i=0;$i<count($pytania);$i++) { $p=$pytania[$i]; echo '<p>'.$p[0].'</p>'; echo '<p>'; for ($j=1;$j<count($p);$j++) { echo '<input type="radio" name="p'.($i+1).'" value="'.($j).'" />' .$p[$j]. "<br />\n"; } echo '</p>'; } ?> Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne 6 6.2. Dyktando Funkcja fraza() tworząca listę wyboru: function fraza($i) { $lit=array('--','Ŝ','rz'); echo '<select name="p[]">'; for ($x=0;$x<3;$x++) { echo '<option value="'.$x.'"'; if ($x==$i) { echo ' selected="selected"'; } echo '>'.$lit[$x].'</option>'; } echo '</select>'; } Wywołanie funkcji w miejscu wypisania listy: <?php fraza($wyniki[0]); ?> Zmienna tablicowa przechowująca informacje o prawidłowej odpowiedzi: $odp=array(1,2,....); Zmienna $wyniki przechowująca dotychczasowe odpowiedzi: if (isset($_POST['p'])) { $wyniki=$_POST['p']; } else { for ($x=0;$x<count($odp);$x++) { $wyniki[]=0; } } Zliczanie poprawnych odpowiedzi: if (isset($_POST['p'])) { $ile=0; for ($i=0;$i<count($odp);$i++) { if ($wyniki[$i]==$odp[$i]) {$ile++;} } echo '<p>Poprawnych odpowiedzi: '.$ile.', błędnych: '.(count($odp)$ile).'.</p>'; } 7 Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne 6.3. Zagadka Zmienna przechowująca odgadywany wyraz: $wyraz='pomidor'; Wypisanie długości odgadywanego wyrazu: echo strlen($wyraz); Zmienna $odp przechowuje odgadnięte litery i kropki zamiast jeszcze nie odgadniętych: if (isset($_POST['odp'])&&($_POST['odp']!='')) { $odp=$_POST['odp']; } else { $odp=str_repeat('.',strlen($wyraz)); } Przekazywanie zmiennej $odp oprzy kolejnych przesyłaniach formularza: <input type="hidden" name="odp" value="<?php echo $odp; ?>" /> Wygenerowanie tabelki z ukrytymi literami echo '<table><tr>'; for ($i=0;$i<strlen($odp);$i++) { echo '<td class="wyraz">'.$odp[$i].'</td>'; } echo '</tr></table>'; Losowanie wyrazu do odgadywania – wykorzystujemy sesje do przekazywania wylosowanego wyrazu, zmienna $co przechowuje listę wszystkich odgadywanych wyrazów: session_start(); if (isset($_SESSION["wyraz"])) { $wyraz=$_SESSION["wyraz"]; } else { $co=array('pomidor','marchew','pietruszka','ogórek','kapusta','sałata', 'bakłaŜan','ziemniak'); $wyraz=$co[array_rand($co)]; $_SESSION["wyraz"]=$wyraz; $odp=str_repeat('.',strlen($wyraz)); } 8 Agnieszka Borowiecka, Formularze w PHP – testy, dyktanda i inne pomoce dydaktyczne 6.4. Generowanie grafiki – zegarek Kod rysujący wskazówki na tarczy zegarka: <?php Header("Content-type: image/png"); $obrazek=ImageCreateFromPNG("zegar.png"); $black=ImageColorExact ($obrazek, 255, 255, 255); imagecolortransparent($obrazek, $black); $i=$_GET['i']; $j=$_GET['j']; $kolor=ImageColorExact ($obrazek, 100, 100, 100); $j=($j/5)-3; imagesetthickness($obrazek,18); ImageLine($obrazek, 213, 213, 214+130*cos(deg2rad($j*30)), 214+130*sin(deg2rad($j*30)), $kolor); $kolor=ImageColorExact ($obrazek, 80, 70, 30); $i=$i-3; imagesetthickness($obrazek,28); ImageLine($obrazek, 213, 213, 214+100*cos(deg2rad($i*30)), 214+100*sin(deg2rad($i*30)),$kolor); imagesetthickness($obrazek,1); $kolor=ImageColorExact ($obrazek, 255, 55, 55); imagefilledellipse($obrazek, 213, 213, 40, 40, $kolor); ImagePNG($obrazek); ?>