7. Výpis funkcí
V této kapitole je vypsán zdrojový kód souboru fce.php, který obsahuje funkce nutné pro vlastní běh konfiguračního modulu.
K jednotlivým funkcím je připsán jednoduchý komentář vyjadřující jejich účel. Funkce jsou řazeny abecedně.
define()
- substituce dlouhých nebo často používaných řetězců za jiný. Hodí se pro zjednodušení zápisu.
"BR" = tag <br /> a zalomení řádku
"NL" = zalomení řádku
"ZAHLAVI" = celá hlavička XHTML dokumentu až po open tag </body>
"ZAPATI" = záhlaví XHTML dokumentu: </body></html>
"VALID" = odkaz a obrázek na validační stránky W3C pro kontrolu správnosti dokumentu XHTML1 http://validator.w3.org/
"FILE_ZAHL" = definuje hlavičku souboru XML, do kterého se zapisuje (kódování a otevírací tagy souboru)
"FILE_ZAP" = definuje zápatí souboru XML, do kterého se zapisuje (uzavírací tagy)
define("BR", "<br />\n");
define("NR", "\n");
define("NL", "<hr />");
define("ZAHLAVI", '
<?xml version="1.1" encoding="windows-1250"?>
<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.1 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head> <meta http-equiv="Content-type" content="text/html; charset=windows-1250" />
<link rel="stylesheet" href="test.css" type="text/css" />
<title>Konfigurační modul testovacího systému</title>
</head>
<body>' );
define("ZAPATI", '</body></html>');
define("VALID",'<hr /><p><a href="http://validator.w3.org/check?uri=referer">
<img src="http://www.w3.org/Icons/valid-xhtml11" alt="Valid XHTML 1.1!" height="31" width="88" />
</a> </p>');
define("FILE_ZAHL" ,
'<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE test SYSTEM "test5.dtd">
<test>');
define("FILE_ZAP" , '
</test>
');
define("FILE_ZAHL2" ,
'<?xml version="1.0" encoding="windows-1250"?>
<!DOCTYPE cfg SYSTEM "cfg5.dtd">
<cfg>
');
define("FILE_ZAP2" , '
</cfg>
');
function is_implicit_n($in) {if ($in!="a") $in="n"; return($in);}
function is_implicit_a($in) {if ($in!="n") $in="a"; return($in);}
Edit_ot()
zobrazí otázku $cislo z pole $arr_in do formulářů a umožňuje její editaci; vrací nové pole $arr_in
function Edit_ot($arr_in,$cislo, $Poc_Odp2)
{
$otazka = $arr_in[$cislo][0][0];
$Poc_Odp2 = $_SESSION[s_Poc_Odp2];
Print '
<br />
<form action="otazky.php" method="get" onSubmit="return kontrola(this)" />
<p>
Chci otázku číslo:
<input type="text" name="Edit_Ot" value="" size="5" />
<input type="submit" name="Editovat" value="Editovat ->" />
<input type="submit" name="Del" value="Smazat ->" />
</p>
<input type="hidden" name="Edit" value="true" />
<input type="hidden" name="C" value="'.$Cis.'" />
<input type="hidden" name="q" value="1" />
</form>
';*/
Print '<form action="otazky.php">';
Print 'Otázka číslo '.$cislo.': '.BR;
Print '<textarea name="Otazka_Upr" rows="5" cols="40">'.$otazka.'</textarea><br />';
if (isset ($Edit2))
{
$Poc_Odp2++;
if ($Poc_Odp < 2) $Poc_Odp=2;
unset ($Edit2);
}
if (isset ($Edit3))
{
$Poc_Odp2 = $Poc_Odp2-1;
if ($Poc_Odp >10) $Poc_Odp=10;
unset ($Edit3);
}
$_SESSION[s_Poc_Odp2] = $Poc_Odp2;
for($j=1; $j<=$Poc_Odp2; $j++) //edit odpovedi k dane otazce
{
$znac = Array(1=>"a)", "b)", "c)", "d)", "e)", "f)", "g)", "h)", "i)", "j)", "k)", "l)", "m)", "n)");
if ($arr_in[$cislo][$j][1]=="a") $check="checked";
Print BR.'Odpověď '.$znac[$j].': '.BR;
Print '<textarea name="Odp_Upr['.$j.']" rows="3" cols="40">'.$arr_in[$cislo][$j][0].'</textarea><br />';
Print 'Správnost: '.'<input type="checkbox" name="Odp_Spr['.$j.']" value="a" '.$check.'>'.' ';
// bodove hodnoceni
Print 'Body:'.'
<select name="Bod['.$j.']" size="1">';
for ($k=1; $k<=5; $k++)
{
if ($arr_in[$cislo][$j][2]== $k) $select="selected";
Print '<option value="'.$k.'" '.$select.'>'.$k;
unset ($select);
}
Print '</option>
<br />';
Print 'Typ odpovědi:'.'
<select name="Typ_Odp['.$j.']" SIZE="1">';
if ($arr_in[$cislo][$j][2]== "Normal") $select1="selected";
if ($arr_in[$cislo][$j][2]== "URL") $select2="selected";
Print '<option value="Normal" '.$select1.'>Normal';
Print '<option value="URL" '.$select2.'>URL';
unset ($select1);
unset ($select2);
Print '</select>
<br />';
unset ($check);
}
Print ' '.'<input type="submit" value="Zmenit">';
Print '<input type="hidden" name="Cis" value="'.$cislo.'">';
Print '<input type="hidden" name="Change" value="true">';
$_SESSION[s_Poc_Odp] = $Poc_Odp;
Print '</form>';
Print '<form action="otazky.php">';
Print ' '.'<input type="submit" name="Edit2" value="Přidat odpověď">';
Print ' '.'<input type="submit" name="Edit3" value="Ubrat odpověď"><br /><br />';
Print '<input type="hidden" name=Edit value="true">';
Print '<input type="hidden" name="Edit_Ot" value="'.$cislo.'">';
Print '<input type="hidden" name="Editovat" value="X">';
Print '<input type="hidden" name="Poc_Odp2" value="'.$Poc_Odp2++.'">';
Print '<input type="hidden" name="q" value="2">';
Print '</form>';
// navrat bez ulozeni
Print '<form action="otazky.php">';
Print '<input type="submit" value=">> Návrat bez uložení <<">';
Print '<input type="hidden" name="Change" value="false">';
Print '</form>';
Return $otazka;
Return $arr_in;
Return $Poc_Odp2;
}
Nactifile()
nacte obsah souboru $jmeno do proudu
function nactifile($jmeno)
{
$fp = fopen($jmeno,'r');
$data = fread($fp, filesize($jmeno));
fclose($fp);
return ($data);
}
Parse2arr()
z datoveho proudu xml souboru preparseruje a udela pole, které vrátí
function parse2arr($proud)
{
$parser = xml_parser_create(); //vytvoreni parseru
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); //preskakovani bilych znaku
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
// nerozlisuje mala velka pismena
//xml_set_character_data_handler($parser,$proud);
xml_parse_into_struct($parser,$proud,$vals,$index);
xml_parser_free($parser);
return ($vals);
}
Prepis_cfg()
zjednoduší a přepíše veliké pole s konfiguračními daty z parseru a vybere potřebné hodnoty, kterým přiřadí jednotlivé indexy
function prepis_cfg($arr_in)
{
for($i=0;$i<=sizeof($arr_in);$i++)
{
switch ($arr_in[$i][tag]): /* porovnavani tagu xml */
case "zadani":{
$arr_out[z_ad]=$arr_in[$i][attributes][adresa];
$arr_out[z_ot]=intval($arr_in[$i][attributes][otazek]);
$arr_out[z_ca]=intval($arr_in[$i][attributes][cas]);
$arr_out[z_lo]=is_implicit_n($arr_in[$i][attributes][login]);
} break;
case "michani":{
$arr_out[m_ot]=is_implicit_n($arr_in[$i][attributes][otazek]);
$arr_out[m_od]=is_implicit_n($arr_in[$i][attributes][odpovedi]);
} break;
case "vysledky":{
$arr_out[v_po]=intval($arr_in[$i][attributes][pocitani]);
$arr_out[v_zo]=is_implicit_a($arr_in[$i][attributes][zobrazovat]);
$arr_out[v_uk]=is_implicit_n($arr_in[$i][attributes][ukladat]);
$arr_out[v_ad]=$arr_in[$i][attributes][adresar];
} break;
endswitch;
}
return($arr_out);
}
Prepis_test()
zjednoduší a přepíše veliké pole s otázkami z parseru a vybere potřebné hodnoty, kterým přiřadí jednotlivé indexy
function prepis_test($arr_in)
{
$ot=1; $odp=1;
for($i=0;$i<=sizeof($arr_in);$i++)
{
switch ($arr_in[$i][tag]):
case "okruh": $arr_out[0][0]=$arr_in[$i][value];
break;
case "otazka":{
switch($arr_in[$i][type]):
case "open": $odp=1;
break;
case "close": $ot++;
break;
endswitch;
}
break;
case "zadani": { if ($arr_in[$i][attributes][typ]=="url"):
$arr_out[$ot][0][0]='<a href="'.$arr_in[$i][value].'" target="new" class="test_url">'.$arr_in[$i][value].'</a>';
else: $arr_out[$ot][0][0]=$arr_in[$i][value];
endif;
}
break;
case "odpoved":{ if ($arr_in[$i][attributes][typ]=="url"):
$arr_out[$ot][$odp][0]='<a href="'.$arr_in[$i][value].'" target="new" class="test_url">'.$arr_in[$i][value].'</a>';
else: $arr_out[$ot][$odp][0]=$arr_in[$i][value];
endif;
}
$arr_out[$ot][$odp][1]=$arr_in[$i][attributes][spravnost];
$arr_out[$ot][$odp][2]=intval($arr_in[$i][attributes][body]);
$arr_out[$ot][0][1]=$odp;
$odp++;
break;
endswitch;
}
$arr_out[0][1]=$ot-1;
return ($arr_out);
}
Smaz_Ot()
smaže vybranou otázku včetně odpovědí a zkrátí pole $arr_in
function Smaz_Ot($arr_in, $cislo)
{
$vymaz = array_splice($arr_in, $cislo, 1);
$arr_in[0][1]--;
return $arr_in;
}
Znacky()
vrací písmenný index odpovědi odpovídající pořadovému číslu odpovědi
function Znacky()
{
$znac = Array(1=>"a)", "b)", "c)", "d)", "e)", "f)", "g)", "h)", "i)", "j)", "k)", "l)", "m)", "n)");
return $znac;
}
Zobr_ot_all()
zobrazí v okně výpis otázek s odpověďmi, bodovým hodnocením a barevným odlišením správnosti.
function Zobr_ot_all($arr_in)
{
$prvku = $arr_in[0][1];
for($i=1; $i<=$prvku; $i++)
{
if($arr_in[$i]!=""):
Print '<font class="test_ota">'.$i.'. '.$arr_in[$i][0][0].'</font><BR>'; /* vypisuji otazky */
for($j=1; $j<=$arr_in[$i][0][1]; $j++)
{
$znac = Array(1=>"a)", "b)", "c)", "d)", "e)", "f)", "g)", "h)", "i)", "j)", "k)", "l)", "m)", "n)"); // jednotlive odpovedi razeny pomoci pismen
Print '<table>';
$text_bod = ' body';
if ($arr_in[$i][$j][2]==1):
$text_bod =' bod';
elseif ($arr_in[$i][$j][2]>=5):
$text_bod =' bodů';
endif;
// vypisuji otazky s bodovym hodnocenim a barevne odlisenou spravnosti
switch($arr_in[$i][$j][1])
{
case "a":
Print '<tr><td width="50"></td><td width="70"><font class=test_bod>['.$arr_in[$i][$j][2].$text_bod.'] </td><td><font class="cfg_odp_a">'.$znac[$j].' '.$arr_in[$i][$j][0].'</font><br /></td></tr>';
break;
case "n":
Print '<tr><td width="50"></td><td width="70"><font class=test_bod>['.$arr_in[$i][$j][2].$text_bod.'] </td><td><font class="cfg_odp_n">'.$znac[$j].' '.$arr_in[$i][$j][0].'</font><br /></td></tr>';
break;
default:
}
Print '</table>';
}
else:
endif;
}
}
Zobr_Zahl()
definuje záhlaví modulu obsahující login a jméno testu
function Zobr_Zahl($Login,$Test_Name)
{
Print '<h2 class="test">Modul editace otázek a odpovědí</h2>'.NR;
Print '<h1 class="test">'.$Test_Name.'</h1>'.NR.NR;
Print 'Přihlášen je uživatel: <b>'.$Login.'</b>';
Print '<a href="'.$PHP_SELF.'?action=logout"> (Odhlásit)</a>'.NR.NL.NR.NR;
}