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;
}