Ennek a lényege a következő: Egy egyszerű szerkezetű szövegfájlt (adatfájlt) alakít tesztté egy PHP program (index1.php), egy másik PHP program (ertekel.php) pedig kiértékeli a válaszainkat. 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. Az összes kérdés megválaszolása után törölhetjük válaszainkat vagy kérhetünk egy értékelést.
Látható, hogy az összes fájl a quiz könyvtárban, vagy ennek valamelyik alkönyvtárában található.
Másoljuk le az "indexC.php" fájlt "indexD.php", a "mainC.css" fájlt "mainD.css", valamint a "menuC.inc" fájlt "menuD.inc" néven és javítsuk át a rá való hivatkozásokat!
Javítsuk ki a "Tudáspróba" menüpont hívását (menuD.inc-ben):
<a href='indexD.php?kod=tp'>Tudáspróba</a>
Szúrjuk be ki a "Tudáspróba" menüpont megjelenítését vezérlő részt indexD.php-be (a "Hírek" if-je után):
if ($kod=='tp') { // Tudáspróba $fn = "quiz/index.txt"; $htm = txtmegjel($fn); echo "$htm"; }
Ellenőrizzük az "quiz/index.txt" meglétét (a leckeD.zip-ben van becsomagolva)!
Ezután elméletileg működik az első quiz-ünk (a Quiz1)!
Az adatfájl elején pontosan öt sornak kell állnia, mert a 6. sort már kérdésnek értelmezi a feldolgozó program!
<form action='ertekel.php' method='post' id='quiz'> (1) <ol> <li> <p>Mi a vezetéknevem?<br><img style='width:64px;' src='imgs/bk.jpg' /></p> (2) <div class='inp'><input type='radio' name='q01' id='q01A' value='A' /></div> (3) <div class='lab'><label for='q01A'>Burcsi</label></div> (4) <div class='jel'>A</div><br> <div class='inp'><input type='radio' name='q01' id='q01B' value='B' /></div> (3) <div class='lab'><label for='q01B'>Károly</label></div> (4) <div class='jel'>B</div><br> <div class='inp'><input type='radio' name='q01' id='q01C' value='C' /></div> (3) <div class='lab'><label for='q01C'>Ferenc</label></div> (4) <div class='jel'>C</div><br> <div class='inp'><input type='radio' name='q01' id='q01D' value='D' /></div> (3) <div class='lab'><label for='q01D'>Burján</label></div> (4) <div class='jel'>D</div><br> </li> <li> <p>Mi az első keresztnevem?</p> (2) <div class='inp'><input type='radio' name='q02' id='q02A' value='A' /></div> (3) <div class='lab'><label for='q02A'>Burján</label></div> (4) <div class='jel'>A</div><br> <div class='inp'><input type='radio' name='q02' id='q02B' value='B' /></div> (3) <div class='lab'><label for='q02B'>Károly</label></div> (4) <div class='jel'>B</div><br> <div class='inp'><input type='radio' name='q02' id='q02C' value='C' /></div> (3) <div class='lab'><label for='q02C'>Ferenc</label></div> (4) <div class='jel'>C</div><br> </li> ..... <li> <p>Milyen nemű lehetek?</p> (2) ... </li> </ol> <input type='hidden' name='kdrb' value='4'> (7) <input type='hidden' name='hval' value='DBCA'> (7) <input type='hidden' name='fcim' value='$cim'> (7) <div class='ressub'> <input type='reset' value=' Adott válaszok törlése '> (6) <input type='submit' value=' Rendben van, értékelés '> (5) </div> </form>
A tisztán PHP program elején két állandót/konstanst adunk meg, a weboldal fej- és lábrészét ($htmlfej,$htmllab), amelyeket majd később a megfelelő "időpontban" kiírunk (43. ill. 126. sor).
$htmllab = " </body> </html> ";
Megjelenítéskor az üres sor és a sortörések is megjelennek. (Próbáljuk ki: futassuk le az "index1.php"-t, majd nézzük meg a forrást!)
$kod = $_GET['kd']; if ( $kod == "" ) { $kod = "minta"; } // hívás .txt nélkül $inp = "data/$kod.txt";
A "kd" paraméter tartalmazza az adatfájl nevét (kiterjesztés nélkül). Ezek helye a "data" könyvtár, ha nincs fájlnév, a "data/minta.txt" lesz a tesztalany.
if (!file_exists($inp)) { echo "<h1 style='margin-top:300px;font-size:300%;color:red;'>A(z) $inp fájl nem létezik!</h1>"; } else { ... }
A "file_exists($inp)" függvény a zárójelben lévő adatfájl ($inp) létezését vizsgálja (a "!" ennek a tagadása), ha a fájl létezik, az "else" ág fut, egyébként egy hibaüzenetet ír ki (hatalmas piros betűkkel).
$s = file("$inp"); // Adatfájl beolvasása tömbbe - 5. sor már az első a kérdés $cim = chop(array_shift($s)); // teszt megnevezése $info = chop(array_shift($s)); // információ $szerzo = chop(array_shift($s)); // szerző(i) $datum = chop(array_shift($s)); // dátuma $forras = chop(array_shift($s)); // forrása(i)
Az "$cim = chop(array_shift($s));" magyarázata (az alatta lévők hasonlóan működnek):
Tehát az adatfájl első öt sorát (feldolgozás után) kivesszük a tömbből, azaz csak tisztán a kérdések és a rájuk adható válaszok maradnak.
Ezután az 59., 60. sor a fentiekből a címet és az alcímet/infót formázva kiírja.
echo " <p class='h1'>$cim</p> <p class='h2'>$info</p> <form action='ertekel.php' method='post' id='quiz'> <ol> ";
Majd megkezdjük a form létrehozását (62. sor), ebben egy lista tartalmazza a kérdéseket és az erre adható válaszokat (64. sor).
$ki = 0; // kérdés indexe /1/ $i = 0; // sor indexe $hval = ""; do { /2/ $sor = chop($s[$i]); $i++; /3/ $vi = 0; // válasz indexe /4/ $num = 0; // helyes válasz sorszáma (0,1,...) echo " <li> <p>$sor</p>"; /5/ do { /1/ $sor = chop($s[$i]); $i++; /1/ $sor = substr($sor,1); // tab leszedve /2/ if ($sor[0]=='*') { /3/ $sor = substr($sor,1); // * leszedve $num = $vi; } $ssz = $ki+1; if ($ssz<10) { $ssz = "0$ssz"; } /4/ // kérdés sorszáma (kétjegyűvé kiegészítve) $jel = chr(65+$vi); // válasz betűjele: A,B, ... /5/ $valt = "q$ssz"."$jel"; /6/ $vi++; /6/ echo " <div class='inp'><input type='radio' name='q$ssz' id='$valt' value='$jel' /></div> <div class='lab'><label for='$valt'>$sor</label></div> <div class='jel'>$jel</div><br>"; /7/ } while (chop($s[$i]) != ''); /1/ echo " </li> "; /5/ $hval = $hval.chr(65+$num); /6/ // stringben adom át a helyes válaszokat $ki++; $i++; } while (chop($s[$i]) != ''); /2/
Két egymásba ágyazott hátultesztelő ciklus, a külső készíti elő és dolgozza fel a kérdést, a belső pedig a válaszok sorait. Az utolsó kérdés után üres sor áll, így kilép a belső ciklusból,
Az értékelő program itt is (lásd "Kérdőív program") a konstansok megadásával kezdődik, ezt most már nem részletezzük. (10-28. sor)
$kdrb = $_POST['kdrb']+0; // numerikus legyen! $hval = $_POST['hval']; $fcim = $_POST['fcim'];
A "GET"-el átadott paraméterekhez hasonlóan kell a "POST" adatait is átvenni. Ezek karakter-típusúak lesznek, ezért ha "0"-val növeljük, automatikusak numerikussá konvertálódik.
echo "$htmlfej"; echo "<p class='h1'>$fcim</p>\n"; echo "<p class='h2'>A teszt értékelése</p>\n";
Az első "echo" az oldal fejrészét generálja (head és környéke), a másik kettő a fő- és alcímet írja ki a weboldalra.
echo "<div class='kerd'><b>Kérdés sorszáma</b></div>"; echo "<div class='hval'><b>Helyes válasz</b></div>"; echo "<div class='aval'><b>Adott válasz</b></div><br>\n";
A kiírás egy sorba történik, aminek a megjelenését a "kerd", "hval", "aval" stílusosztályok vezérlik (részletezve a "Stílusok" lapon lesz), ugyanezek a stílusok megtalálhahatók a lentebbi ciklus belsejében is.
$ossz = 0; for ( $i=1; $i<=$kdrb; $i++ ) { $ii = ($i<10) ? "0$i" : $i ; $hv = $hval[$i-1]; $nev = "q$ii"; $av = $_POST["$nev"]; echo "<div class='kerd'> $i. Kérdés</div>"; echo "<div class='hval'> $hv</div>"; if ($av==$hv) { $ossz++; echo "<div class='aval'> <span style='font-weight:bold;color:red;'>$av</span></div>"; } else { echo "<div class='aval'> $av</div>"; } echo "<br>\n"; }
echo "<br><p class='h2'>A helyes válaszok száma: $ossz</p>\n"; if ($ossz==$kdrb) { echo "<p class='h2'>Gratulálok, ez 100%-os teljesítmény!</p>\n"; }
Az "$ossz" változóban gyűjtögetett értéket írjuk ki, s ha ez egyezik a kérdések számával, akkor gratulálunk is.
A legvégén generáljuk a weboldal lábrészét. (68. sor)
A teljes stílusfájl: "quiz/css/style1.css"
Csak a legfontosabb stílusok rövid magyarázata szerepel itt. Célszerű a megértésükhöz kicsit módosítva kipróbálni ezeket, majd (ha az jobb volt) visszaállítani az eredetit.
.inp { display:inline-block; width:3%; padding-top:8px; text-align:right; vertical-align:top; } .lab { display:inline-block; width:90%; margin:0 4px 4px 4px; padding:4px 8px 4px 8px; background-color:#eee; line-height:24px; } .jel { display:inline-block; width:3%; }
Az .inp, .lab, .jel stílusosztályok egy sorban lévő téglalap alakú blokkok, szélességüket a lapszélesség százalékában adtuk meg (pl. width:3%; a rádiógombnak kicsi kell).
(Hasonló az értékeléshez szükséges lenti három stílushoz!)
.kerd { display:inline-block; width:30%; line-height:24px; } .hval { display:inline-block; width:20%; } .aval { display:inline-block; width:10%; }
A fenti három stílusosztály (.kerd, .hval, .aval) mindegyike téglalap alakú blokk, melyek egy sorban vannak (display:inline-block;), szélességüket pedig a lapszélesség százalékában adtuk meg (width:xx%;).