Programování v PHP Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, Helena Wallenfelsová, 2011 Další možnosti formulářů BI-PHP, cvičení 4 Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 1/6
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <title>formular s ruznymi prvky, jejich obsluha</title> </head> <body> <?php // vychozi hodnoty pro prvni zobrazeni stranky $devices = null; // vychozi pro checkboxes $chkdvd = ""; $chkscanner = ""; $chkprinter = ""; $chkmonitor = ""; // vychozi pro radio buttons (napr. vybrana 1. hodnota) $chk1 = (empty($_get["btnodesli"]))?"checked='checked'":""; $chk2 = ""; $chk4 = ""; $chk8 = ""; // vychozi pro seznam (select) $selphp = ""; $seljava = ""; $selcsharp = ""; $selpython = ""; // podobne by bylo pro rozbalovaci seznam (select) // obnoveni hodnot, ktere uzivatel zadal (nastavil) ve strance // priprava promennych, ktere se pouziji pro obnoveni // priprava obnovy pro checkboxes - nevybrane neodesilaji NIC!! // (vybrana (selekovana) hodnota ma atribut checked='checked' // (pro HTML 4 staci checked) if(!empty($_get["devices"])){ $devices = $_GET["devices"]; // cele pole odeslanych hodnot // v cyklu nutno projit cele pole devices - // muze byt vybrano vice polozek foreach($devices as $device){ switch($device){ case "DVD": $chkdvd="checked='checked'"; case "Scanner": $chkscanner="checked='checked'"; case "Printer": $chkprinter="checked='checked'"; case "Monitor": $chkmonitor="checked='checked'"; P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 2/6
// priprava obnovy pro radiobuttons - nevybrane neodesilaji NIC!! // vybrana polozka (jedina) - opet atribut checked if(!empty($_get["ram"])){ // neni nutne, zadana vychozi hodnota $ram = $_GET["RAM"]; switch($ram){ case "1": $chk1 = "checked='checked'"; case "2": $chk2 = "checked='checked'"; case "4": $chk4 = "checked='checked'"; case "8": $chk8="checked='checked'"; // priprava obnovy pro seznam (select) - nevybrane opet NIC!! // vybrana polozka (polozky) - atribut selected='selected' if(!empty($_get["languages"])){ // opet neni nutne $languages = $_GET["languages"]; // opet nutno projit cele pole devices - zase muze byt // vybrano vice polozek foreach($languages as $language){ switch($language){ case "PHP": $selphp="selected='selected'"; case "Java": $seljava="selected='selected'"; case "CSharp": $selcsharp="selected='selected'"; case "Python": $selpython="selected='selected'"; /* Zde jiz neni osetreno rozbalovaci pole (druhy select) - obdobne. V realnem programu by samozrejme osetreni muselo byt!! V nasledujicich input resp. select elementech je pomoci PHP kodu vlozena prave nastavena hodnota prislusnych promennych. Tim je obnoven vyber uzivatelem zvolenych prvku (atributy checked a selected).?> Vsimete si, ze v pripade prvku, umoznujicich vicenasobny vyber (zde radiobuttons a select s atributem multiple) je jako nazev prvku pouzito pole (napr. devices[])!! To umoznuje prochazet v cyklech vsechny prvky. (Neni nezbytne.) */ P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 3/6
<h1>dalsi formular</h1> <form action="formular2.php" method="get"> <!-- checkboxes --> <input type="checkbox" name="devices[]" value="dvd" <?php echo $chkdvd;?>>dvd<br> <input type="checkbox" name="devices[]" value="scanner" <?php echo $chkscanner;?>>scanner<br> <input type="checkbox" name="devices[]" value="printer" <?php echo $chkprinter;?>>printer<br> <input type="checkbox" name="devices[]" value="monitor" <?php echo $chkmonitor;?>>monitor<br><br> <!-- radiobuttons --> <!-- stejne name - skupina, umoznujici vyber jedineho prvku --> <input type="radio" name="ram" value="1" <?php echo $chk1;?>>1gb<br> <input type="radio" name="ram" value="2" <?php echo $chk2;?>>2gb<br> <input type="radio" name="ram" value="4" <?php echo $chk4;?>>4gb<br> <input type="radio" name="ram" value="8" <?php echo $chk8;?>>8gb<br><br> <!-- seznam (select), ktery zobrazuje 3 radky --> <!-- atributy u select urcuji, zde jde o rozbalovaci seznam (combobox) a zda je mozno vybrat najednou vice polozek --> <select name="languages[]" multiple="multiple" size="3"> <option value="php" <?php echo $selphp;?>>php</option> <option value="java" <?php echo $seljava;?>>java</option> <option value="csharp" <?php echo $selcsharp;?>>csharp</option> <option value="python" <?php echo $selpython;?>>python</option> </select><br><br> <!-- rozbalovaci seznam (select) --> <!-- zde jiz neni provedena obnova puvodnich hodnot --> <select name="selram"> <option value="1">1gb</option> <option value="2">2gb</option> <option value="4">4gb</option> <option value="8">8gb</option> </select><br><br> <!-- odesilaci tlacitko --> <input type="submit" name="btnodesli" value="odesli"><br><br> <!-- obrazek, ktery provadi funkci submit + odesila souradnice, na ktere bylo kliknuto. Pokud je pouzit, je NUTNE v PHP kodu testovat (pro zjištěni, zda je stranka nacitana poprve) na empty nejen $_GET["btnOdesli"], ale take $_GET["Obrazek_x"], nebo $_GET["Obrazek_y"]!! --> <input type="image" name="obrazek" src="pes.jpg" alt="zde ma byt obrazek" style="width:100px;height:100px;background-color:cyan;"> <br><br> </form> P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 4/6
<?php // napr. zde muze byt provedeno zpracovani nactenych hodnot // (pro ukazku pouze vypsany nektere hodnoty // bylo odeslano pomoci submit (odeslano uzivatelem), // nebo zobrazeno poprve? // pro zjednoduseni se nebere v uvahu odeslani kliknutim // na obrazek (input typu image) if (!empty($_get["btnodesli"])) { // vypis (nalezeni) zvolenych checkboxu if (!empty($_get["devices"])){ $devices = $_GET["devices"]; echo "Vybrana zarizeni:<br>"; // Prochazeni polem odeslanych hodnot. // Odesilaji se hodnoty POUZE TECH CHECKBOXU, // ktere BYLY ZATRZENY!! foreach ($devices as $device) { echo "$device<br>"; // vypis (nalezeni) zvoleneho radiobutton echo "<br>zvolena velikost RAM:<br>"; // Opet se něco odesila, jen pokud byl nejaky // radiobutton vybran! if(empty($_get["ram"])) echo "Neni zvolena velikost pameti!<br>"; else { $ram = $_GET["RAM"]; switch ($ram){ case "1": echo "1 GB<br>"; case "2": echo "2 GB<br>"; case "4": echo "4 GB<br>"; case "8": echo "8 GB<br>"; default: // pro hackery (podvodne stranky) echo "Chybne zvolena RAM<br>"; echo "<br>"; P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 5/6
// ----- obrazek ve funkci submit button ----- // Bylo odeslano kliknutim do obrazku? Odesila x-ovou a y-ovou // souradnici bodu v obrazku, kam bylo kliknuto!! // PHP prekodovava skutecne odeslane jmeno (napr. Obrazek.x) // na tvar Obrazek_x (znak. je v PHP operator retezeni) if (!empty($_get["obrazek_x"])){ // stejne mozno pouzit Obrazek_y $x = $_GET["Obrazek_x"]; $y = $_GET["Obrazek_y"]; echo "<br>x: $x; Y: $y<br><br>"; // "Zpracovani" souřadnic - zjisteni casti obrazku, // do ktere bylo kliknuto if (($x < 50) && ($y < 50)) $cast = "Severozapad"; elseif (($x < 50) && ($y >= 50)) $cast = "Jihozapad"; elseif (($x >= 50) && ($y < 50)) $cast = "Severovychod"; else $cast = "Jihovychod";?> </body> </html> echo "Vybran $cast<br>"; P. Štěpán, H. Wallenfelsová PHP BI-PHP, cvičení 4 6/6