Ennek a lényege a következő: Egy egyszerű szerkezetű szövegfájlt alakít tesztté egy PHP és egy Javascript programpáros. Minden feladat egy kérdésből és két vagy több válaszból (max. 5) áll. A válaszok közt csak egy hibátlan van, ezt kell megjelölni, ezért 1 pontot kapunk. Hiba esetén egyszer javíthatunk, de ilyenkor már csak 0,5 pont jár. Az összes kérdés megválaszolása után törölhetjük válaszainkat vagy kérhetünk egy összesített (százalékos) értékelést.
Az adatfájl elején pontosan öt sornak kell állnia, mert a 6. sort már kérdésnek értelmazi a feldolgozó program!
var grade = 0; // pontszám var count1 = 0; // jó válaszok számlálója az üzenethez (mod 4) var count2 = 0; // rossz válaszok számlálója az üzenethez (mod 4) var msg = 6; // üzenetek/hibaüzenetek száma var msg1 = new Array( 'Eltaláltad! Lottózzál!', 'Szuper!', 'A válasz hibátlan!', 'Jó választás. A helyes választ adta!', 'Rendben! Ügyes!', 'Csak így tovább! A válasz helyes ...'); var msg2 = new Array( 'Nem nyert! No még egyszer!', 'Nem talált! No még egyszer!', 'Nem, a válasz helytelen. Próbáld meg újból!!', 'Hoppá! A válasz helytelen. Próbáld meg újra!', 'A válasz helytelen. Gondold át, és próbáld meg újra!', 'Sajnos nem ez a helyes válasz. Próbáld meg újra!'); function correct(qN, aN) { ..... } function showMessage(correct, count) { ..... } function showGrade() { ..... }
A Javascript program a használt változók megadásával kezdődik. Látható, hogy az értékadás nagyon hasonlít a PHP-beli társához, csupán a "var" kulcsszót kell elé tenni (tömböknél pedig még a "new"-t).
Az első négy értékadás ezen számlálók kezdőértékét állítja be.
A következő két értékadásban adjuk meg azokat a szövegeket, amelyek közül (véletlenszerű választással) egyet kiír a Javascript program (jó válasz esetén a felsőkből, hibás válasznál az alsókból választ). Ezek természetesen módosíthatók, de bővíthető is a lista, csak ügyelni kell a határolójelekre (bővítéskor az "msg = 6" is javítandó!)!
A PHP által generált HTML kérdőív eseményvezérelt:
A Javascript további soraival nem foglalkozunk.
<?php echo " <!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>PHP Quiz 2</title> <link rel='stylesheet' href='css/style2.css'/> </head> <body> "; $kod = $_GET['kd']; if ( $kod == '' ) { $kod = 'minta'; } // hívás: prg?kd=name (.txt nélkül) $inp = "data/$kod.txt"; if (!file_exists($inp)) { echo "<p style='padding-top:25%;text-align:center;font-size:64px;color:red;'>A \"$inp\" adatfájl nem létezik!</p>"; } else { // Adatfájl beolvasása ... // Adatfájl elemzése ... // JavaScript változók feltöltése ... // Form megjelenítése ... } echo " </body> </html> "; ?>
Az index2.php program eleje "legyártja" a weboldal fejrészét, majd paraméterként bekéri (az index1.php-hez hasonlóan) az adatfájl nevét.
A program "lelke" a pirossal kiemelt elágazás, amely az adatfájl létezését vizsgálja, ha nincs, hibaüzenettel leáll. Ha van, akkor működni kezd a Javascripttel segített quiz (részletek a következő négy fülön), majd végül előállítja a formot lezáró dolgait, és a weboldal lábrészét.
// Adatfájl beolvasása $t = array(); $f = fopen ($inp,"r"); // $f - fájl azonosító while (!feof($f)) { array_push($t, chop(fgets($f,1024))); } fclose($f); $jojelzo = "*"; // ez jelzi a helyes választ $ind_ekerd = 5; // első kérdés indexe (0,1,...) $BD = array('0','B','D','T','P','V'); // válaszok betűjele
Magyarázat soronként:
$cim = $t[0]; // teszt megnevezése 1. $info = $t[1]; // információ $szerzo = $t[2]; // szerző(i) $datum = $t[3]; // dátuma $forras = $t[4]; // forrása(i) $ansdb = '0'; $keydb = '0'; $trydb = '0'; // JavaScript változók "feje" 2. $kerdb = 0; // kérdés sorszáma $ind = $ind_ekerd; // ugrás az első kérdésre do { 3. $kerdb++; // kérdések számolása 5. $ind++; // első válaszra áll $valdb = 0; do { 4. $valdb++; 6. if (substr($t[$ind],1,1) == $jojelzo) { 7. $jossz = $valdb; $t[$ind] = substr($t[$ind],2); // tab és jelző le } else { $t[$ind] = substr($t[$ind],1); // tab le } $ind++; 8. } while ($t[$ind] != ''); // üres sornál kilép $ansdb .= ",$valdb"; 9. $keydb .= ",$jossz"; $trydb .= ",0"; $ind++; // üres sor átlépése } while ($t[$ind] != ''); // a második üres sornál kilép
echo "<script language='JavaScript'>\n"; echo "\tvar numQ = $kerdb ;\n"; // kérdések száma összesen echo "\tvar answers = new Array( $ansdb ) ;\n"; // válaszok száma a kérdésenként echo "\tvar key = new Array( $keydb ) ;\n"; // helyes válasz sorszáma kérdésenként echo "\tvar tryAgain = new Array( $trydb ) ;\n"; // hibaszámláláshoz kérdésenként echo "</script>\n"; echo "<script language='JavaScript' src='index2.js'></script>\n";
Nézzük meg a futó script (../quiz/index2.php?kd=minta) forrását, jól látható a fenti 7 utasítás hatása!
echo "<p class='h1'> $cim </p>\n"; 1. echo "<p class='h2'> $info </p>\n"; echo "<div id='but'><a href='..'>Vissza a kezdőoldalra!</a></div>\n\n"; echo "<form id='form' method='post'>\n"; $at = explode(",",$ansdb); $kt = explode(",",$keydb); // PHP tömbbe 2. $ind = $ind_ekerd; // ugrás az első kérdésre for ( $i=1; $i<(1+$kerdb); $i++ ) { 3. $ii = $i; if ($i<10) { $ii = " ".$i; } 5. echo "<p class='kerdes'><span class='ssz'>$ii.</span>$t[$ind]</p>\n"; 6. $ind++; echo "<table class='t1'>\n"; 7. echo "<col class='c1'><col class='c2'><col class='c3'>\n"; for ( $j=1; $j<(1+$at[$i]); $j++ ) { // válaszok 4. $inp = "<input type='radio' name='V$i' onclick='correct($i,$j);'>"; 8. echo "<tr>\n"; 9. echo "\t<td>$inp</td>\n\t<td>$t[$ind]</td>\n\t<td>$BD[$j]</td>\n"; echo "</tr>\n"; $ind++; } echo "</table>\n\n"; 10. $ind++; } echo " <div id='resub'> 11. <button type='reset'>Törlöm az előző válaszaimat!</button> <button type='submit' onclick='showGrade();'>Rendben, jöhet az értékelés!</button> </div> </form> 12. <p class='h3'>$szerzo ($datum)</p> <p class='h4'>$forras</p> <div id='but'><a href='..'>Vissza a kezdőoldalra!</a></div><br> ";
Másoljuk le az "indexD.php" fájlt "indexE.php", a "mainD.css" fájlt "mainE.css", valamint a "menuD.inc" fájlt "menuE.inc" néven és javítsuk át a rá való hivatkozásokat!