73.8.7. Formulář s tabulkou

Jedním z běžných problémů, se kterým se potkávám, je zobrazený dat v tabulkové formě. Například z databáze. Každý řáádek tabulky reprezentuje jeden řádek v databázové tabulce.

V kódu zobrazíme tabulku podle vzoru:

<form>
  <table>
    <caption></caption>
    <thead>
      <tr>…</tr>
    </thead>
    <tfoot>
      <tr>…</tr>
    </tfoot>
    <tbody>
      <tr>…</tr>
    </tbody>
    </table>
</form>

Část textu tabulky bude zakoódována přímo v programu, ale části, zejména ta s daty v tělě, budeme určitě vytvářet programově. Myšlenka práce s tabulkou je taková, že v tabulce rozmístníme vstupní pole a tlačítka, podlo toho co chcem uživateli nabídnout za akce. Většinou to dělám tak, že poslední, úplně pravý, sloupec vyhradím pro příkazy a dávám do něj tlačítka pro jednotlivé akce které se týkají řádku tabulky. Na konec tabulky, ve vzoru je to část <tfoot>, vložím pole pro zadávání hodnoty a v poslední buňce, která je vlastně ve sloupečku pro příkazy dám tlačítko „Zapsat“. Tolik tedy na úvod a nyní se začneme zabývat jednotlivými částmi.

První věc je samotný formulář. Jak je vidět na ukázce, tabulka je ve formuláři celá, a všechny prvky které budeme dávat do tabulky budou tedy v jednom formuláři. Formulář může obsahovat ve svém otevíracím tagu několik atributů. Zmíním zde jen url a method. Attribut url obsahuje adresu na kterou se data z formuláře odešlou při stisknutí odesílacího, nebo některého z více odesílacích tlačítek. Pokud nebude vyplněn, odešlou se data na tu samou stránku ve které je formulář. Z našeho pohledu to znamená že data z formuláře bude zpracovávat ta samá .kl1 stránka. Atribut method pak určuje jakým způsobem se budou data odesílat. V mém případě jsem použil tuto kombinaci:

<form method="post">
    …
</form>

Tedy data fe formuláři se pošlou ke zpracování té samé stránce (.kl1), která formulář zobrazuje a k odeslání se použije metoda POST.

Dále do formuláře/tabulky rozmístníme jednotlivá pole. Uvedu jako příklad pole v posledním řádku tabulky pro zadání hodnot k vytvoření nového řádku.

<tfoot><tr>
    <td><input type="text" id="dny" size="3" maxlength="3" /></td>
    <td><input type="text" id="limit" size="3" maxlength="3" /></td>
    <td><button name="tlacitko" value="new">Zapsat</button></td>
</tr></tfoot>

V této ukázce jsou dve políčka pro zadání hodnoty a ve sloupci s příkazy je tlačítko jenž má nápis „Zapsat“. Políčka jsou vytvářena html tagem <input type="text"> a můžeme a zajisté vaužijeme také ostatních variant tagu input které nám HTML nabízí. Můžeme také použít tag select pro vytvoření komboboxu s výběrem hondot. Zvláštností je odesílací tlačítko které generuji, v tomto případě možná zbytečne, tagem <button>. Běžne se používá kód

<td><input type="submit" value="Zapsat" /></td>

V tomto případě si mohu vybrat, který způsob použiji. V příkazových tlačítcích jenž jsou na každém řádku ovšem jde použít jen varianta s tagem <button>.

A co že je tedy v těch řádcích, tam generuji html kód jako tento:

<td>
  <button name="remove" value="klíč-řádku">Odstranit</button>
  <button name="edit"   value="klíč-řádku">Upravit</button>
</td>

Klíč-řádku je hodnota, která jednoznačně identifikuje data na řádku. Může to být například id pole z databáze, nebo jen číslo řádku tabulky. Atribut name pak identifikuje operaci kterou s daným řádkem chceme provést. Tím máme popsána vstupní pole formuláře a tlačítka, a zbývá nám zajistit zpracování dat z odeslaného formuláře.

if (request_get_arg(request, "new")) {
    …  Uživatel stiskl tlačítko „Zapsat“ na poslendím řádku tabulky.Vybereme tedy z request pole dny a limit a zapíšeme například do databáze.
} else if (key=request_get_arg(request, "remove")) {
    …  Uživatel stisk tlačítko odstranit na řádku s daty jehož identifikace je v key.Odstraníme tento řádek z databáze.
} else if (key=request_get_arg(request, "edit")) {
    …  Uživatel stisk tlačítko „edit“ na řádku s daty jehož identifikace je v key.Zajistíme tedy zobrazení formuláře s daty jednoho řádku.
}