Pokud zrovna nejste na Internetu poprvé, pravděpodobně jste se již setkali s formuláři, které se měnily v závislosti na vašich akcích. Třeba mizela nebo se objevovala nějaká pole, nebo se některé ze vstupních polí najednou objevilo vícekrát. Vytvořit formulář s opakujícím se polem není problém, pokud ovládáte alespoň základy JavaScriptu. Problémy nastávají většinou až ve chvíli, kdy z takto automaticky generovaného formuláře musíte převzít a nějakým způsobem zpracovat zadané údaje. Následujících několik řádků článku vám na jednoduchém příkladě ukáže jedno z možných řešení prostřednictvím PHP.

Nejprve potřebujeme nějaký vstupní mechanismus, který nám určí počet opakování vstupního pole. Pro účely našeho jednoduchého příkladu by byl ideální JavaScript, ale protože se zabýváme PHP, použijeme k tomu samozřejmě formulář a PHP skript.

<?php
     echo „Kolik polí?“;
     echo „<form action=’formular.php?action=generuj‘ method=’post‘>“;
     echo „<input name=’XPocetPoli‘ type=’text‘ size=’11‘ maxlength=’3′>“;
     echo „<input type=’submit‘ value=’Zadat‘>“;
     echo „</form>“;
php?>

Tento kousek kódu nedělá nic jiného, než že vytvoří formulář s jedním vstupním polem „XPocetPoli“, do kterého zadáme počet opakování. Formulář pak opět vyvolá svůj mateřský skript, kterému předá hodnotu tohoto pole a zároveň, prostřednictvím parametru „action“ mu určí, co se má se získanou informací provést.

<?php
if ($action == „generuj“):
     echo „<form action=’formular.php?action=vypis‘ method=’post‘><table width=’300′ border=’0′ cellspacing=’0′ cellpadding=’0′>“;
     for ($i=1; $i<=$XPocetPoli; $i++):
          echo „<tr><td>Pole č. „.$i.“:</td><td><input name=’XPole“.$i.“‚ type=’text‘ size=’11‘ maxlength=’25‘></td></tr>“;
     endfor;
     echo „<tr><td> </td><td><br><input name=’XPocetPoli‘ type=’hidden‘ value='“.$XPocetPoli.“‚><input type=’submit‘ value=’Vložit‘></td></tr>“;
     echo „</table></form>“;
else:
     echo „Kolik polí?“;
     echo „<form action=’formular.php?action=generuj‘ method=’post‘>“;
     echo „<input name=’XPocetPoli‘ type=’text‘ size=’11‘ maxlength=’3′>“;
     echo „<input type=’submit‘ value=’Zadat‘>“;
     echo „</form>“;
endif;
php?>

V následujícím kroku jsme rozšířili náš původní skript o podmínku, která nám umožňuje správně reagovat na jeho nové volání. Takže jsme přidali příkaz „if ($action == „generuj“):“, který nám vygeneruje náš kýžený formulář s neomezeným počtem polí, a za „else:“ jsme schovali původní kód s dotazovacím polem. Ten se provede vždy, když skriptu výslovně nenařídíme něco jiného.

Za pozornost stojí, jak byl pro generování formuláře využit cyklus „for“. Nezačíná obvyklým „$i=0“, ale „$i=1“, logicky pak končí ve chvíli, kdy „$i=XPocetPoli“. V příkazu „echo“, který vypisuje HTML kód, je vsuvka, která přidává ke jménu vstupního pole aktuální hodnotu proměnné „$i“ a tím nám zajistí jednoznačnou identifikaci každého políčka formuláře.

Kromě toho je zde ještě jedno skryté pole, opět s názvem „XPocetPoli“. Takto si ukládáme počet automaticky generovaných polí pro další použití. Ve skutečnosti bychom to nemuseli dělat, ale takhle je to nejjednodušší.

Nyní tedy máme teoreticky nekonečně dlouhý formulář s poli pojmenovanými „XPole1“, „XPole2“, „XPole3“ atd. Nastává čas opět rozšířit náš skript o sekci, která se postará o zpracování našich pracně získaných dat. Opět ponecháme původní část skriptu, „if ($action == „generuj“):“ změníme na „elseif ($action == „generuj“):“ a za podmínku „if ($action == „vypis“):“ vložíme novou sadu příkazů.

<?php
if ($action == „vypis“):
     echo „<form action=’formular.php‘ method=’post‘><table width=’300′ border=’0′ cellspacing=’0′ cellpadding=’0′>“;
     for ($i=1; $i<=$XPocetPoli; $i++):
          $pomoc = „XPole“;
          $pomoc .= $i;
          echo „<tr><td>Pole č. „.$i.“:</td><td>“.$$pomoc.“</td></tr>“;
     endfor;
     echo „<tr><td> </td><td><br><input type=’submit‘ value=’Znovu‘></td></tr>“;
     echo „</table></form>“;
elseif ($action == „pole“):
     echo „<form action=’formular.php?action=vypis‘ method=’post‘><table width=’300′ border=’0′ cellspacing=’0′ cellpadding=’0′>“;
     for ($i=1; $i<=$XPocetPoli; $i++):
          echo „<tr><td>Pole č. „.$i.“:</td><td><input name=’XPole“.$i.“‚ type=’text‘ size=’11‘ maxlength=’25‘></td></tr>“;
     endfor;
     echo „<tr><td> </td><td><br><input name=’XPocetPoli‘ type=’hidden‘ value='“.$XPocetPoli.“‚><input type=’submit‘ value=’Vložit‘></td></tr>“;
     echo „</table></form>“;
else:
     echo „Kolik polí?“;
     echo „<form action=’formular.php?action=generuj‘ method=’post‘>“;
     echo „<input name=’XPocetPoli‘ type=’text‘ size=’11‘ maxlength=’3′>“;
     echo „<input type=’submit‘ value=’Zadat‘>“;
     echo „</form>“;
endif;
php?>

Pro práci s jednotlivými hodnotami jsme použili náš oblíbený cyklus „for ($i=1; $i<=$XPocetPoli; $i++):“. Jak ale zajistit, aby postupně procházel skrze všechny vygenerované hodnoty? Tady nám pomůže jedna speciální vlastnost PHP. Na hodnotu proměnné se totiž nemusíme odkazovat pouze jejím jménem, ale také třeba jinou proměnnou, která toto jméno obsahuje. Takže následující sekvence vypíše „Ahoj!“ a nikoli „b“.

     $a = „b“; $b = „Ahoj!“; echo $$a;

Jak to funguje? PHP nejprve vezme jeden znak „$“ a přiřadí jej k „a“, čímž mu vznikne proměnná „$a“ obsahující hodnotu „b“. Jenže je tu ještě jeden „nevyužitý“ znak „$“ a právě ten PHP přiřadí k hodnotě proměnné „$a“, čímž vznikne proměnná „$b“, v níž je uložen pozdrav „Ahoj!“ a ten se nakonec objeví na monitoru.

Ve skriptu máme proměnnou „$pomoc“ s hodnotou „XPole“, což je konstantní část názvu všech našich vstupních polí. Při každém průchodu cyklu se k této hodnotě přidá okamžitá hodnota řídící proměnné „$i“, čímž vznikne pokaždé jiný název vstupního pole „XPole1“, „XPole2“, „XPole3“ atd. Když potom voláme příkaz „echo $$pomoc“, PHP nám spáruje znak „$“ s hodnotou proměnné “$pomoc“ a vytvoří nám novou proměnnou, třeba „$XPole2“ nebo „$XPole3“ a my už se snadno dostaneme k jeho hodnotě.

Pokud jste dočetli až sem, patříte pravděpodobně do jedné ze dvou skupin. Skupina A) jsou čtenáři nedostatečně informovaní. Skupina B) jsou naopak čtenáři informovaní velmi dobře. Skupině A) se omlouvám za rozvláčný příklad, ačkoli si myslím, že právě výše uvedená informace o práci s proměnnými by se jim mohla někdy hodit. Příslušníky skupiny B) bych rád požádal, aby odložili své ostře nabroušené virtuální tužky, lynčování v diskusi se odkládá na neurčito;-).

<?php
if ($action == „vypis“):
     echo „<form action=’formular.php‘ method=’post‘><table width=’300′ border=’0′ cellspacing=’0′ cellpadding=’0′>“;
     for ($i=1; $i<=$XPocetPoli; $i++):
          $y = $i + 1;
          echo „<tr><td>Pole č. „.$y.“:</td><td>“.$XPole[$i].“</td></tr>“;
     endfor;
     echo „<tr><td> </td><td><br><input type=’submit‘ value=’Znovu‘></td></tr>“;
     echo „</table></form>“;
elseif ($action == „pole“):
     echo „<form action=’formular.php?action=vypis‘ method=’post‘><table width=’300′ border=’0′ cellspacing=’0′ cellpadding=’0′>“;
     for ($i=1; $i<=$XPocetPoli; $i++):
          $y = $i + 1;
          echo „<tr><td>Pole č. „.$y.“:</td><td><input name=’XPole[]‘ type=’text‘ size=’11‘ maxlength=’25‘></td></tr>“;
     endfor;
     echo „<tr><td> </td><td><br><input name=’XPocetPoli‘ type=’hidden‘ value='“.$XPocetPoli.“‚><input type=’submit‘ value=’Vložit‘></td></tr>“;
     echo „</table></form>“;
else:
     echo „Kolik polí?“;
     echo „<form action=’formular.php?action=generuj‘ method=’post‘>“;
     echo „<input name=’XPocetPoli‘ type=’text‘ size=’11‘ maxlength=’3′>“;
     echo „<input type=’submit‘ value=’Zadat‘>“;
     echo „</form>“;
endif;
php?>

PHP totiž vychází programátorům inteligentním způsobem vstříc. Pokud pojmenujete některé prvky formuláře stejně a za jméno vstupního prvku přidáte dvojici hranatých závorek „[“ a „]“, poskytne vašemu skriptu data v předpřipraveném poli. Stačí použít správný index a hle, data jsou na světě Tato schopnost je velmi příjemná a pohodlně se s ní pracuje. Podívejte se na náš skript, stačilo jen několik drobných úprav.

Přeji vám hezký den.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět