Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Automatické generovanie formulárov z MySQL

Každý kodér sa nevyhnutne musí stretávať s problematikou generovania formulárov. Vstupné formuláre na napĺňanie tabuliek datami sa vyskytujú kdekoľvek. Otravné vypisovanie inputov, textareí a selectov sa však dá riešiť aj inak. Vhodne napísaná trieda to dokáže vyriešiť za vás. Nie je mojím cieľom poskytnúť celú triedu, ale len poradiť, čo môže byť jej základom.

Načítanie dátových typov z tabuľky

V prvom rade je dôležité načítať si z tabuľky, ktorej chceme vygenerovať vstupný formulár, všetky stĺpce.

$q="SELECT * FROM tabulka LIMIT 1";
$result=$b->sqlQuery($q);
 
$i=0;
 
while ($i < mysql_num_fields($result)) {
   $meta = mysql_fetch_field($result, $i);
   if(!in_array($meta->name,$this->excludeColumns)) {
     $fields['name'][] = $meta->name;
     $fields['type'][] = $meta->type;
   }
   $i++;
}

Vyberieme si jeden ľubovoľný záznam z tabuľky, ktorú chceme spracovať. Je možné vybrať buď všetky stĺpce (*) alebo len tie, ktoré potrebujeme. Ja vyberám všetky a v premennej exludeColumns si nadefinujem tie, ktoré spracovať naopak nechcem. Pre mňa je to jednoduchšie, väčšia náročnosť aplikácie nie je v tomto prípade podstatná.

Samotné vygenerovanie formuláru

Vygenerovanie formuláru je potom už veľmi jednoduché.

for ($i=0;$i<sizeof($fields['name']);$i++) {
 
   if ($this->specials[$i] == 'select') {
 
       /*nejaky HTML vystup*/
 
   } else {
 
      //input text
      if ($meta->type == 'string') {
          $h .= '<p><b>'.$inputName.'</b><br/>
          <input class="class_input" value="'.$rows[$meta->name].'" type="text" name="'.$meta->name.'" /></p>';
      }
 
      // textarea
      if ($meta->type == 'blob') {
          $h .= '<p><b>'.$inputName.'</b><br/>
          <textarea class="class_textarea" name="'.$meta->name.'" />'.$rows[$meta->name].'</textarea></p>';
      }
 
      // short input text
      if ($meta->type == 'int') {
          $h .= '<p><b>'.$inputName.'</b><br/>
          <input class="class_input" value="'.$rows[$meta->name].'" type="text" style="width: 60px" name="'.$meta->name.'" /></p>';
      }
 
   }
}

Z kódu je jasné o čo ide.. Pokiaľ je $meta->type (výstup daný funkciou mysql_fetch_field) typu string, zobrazím štandardné textové pole. Ak je blob, viem, že ide o väčší objem dát, tak zobrazím textareu. Pokiaľ je to integer, tak zobrazím buď krátky input text, alebo na základe ďalších podmienok nezobrazujem nič (napríklad, pokiaľ ide o ID záznamu, unix timestamp a podobné integery, ktoré je nežiadúce editovať cez formulár. Pokiaľ neviete čo znamená podmienka if ($this->specials[$i] == ‚select‘), čítajte ďalej.

Čo so select boxami a inými prvkami?

Keďže formuláre okrem input textov a textareí obsahujú aj iné prvky, musí to trieda nejako riešiť. Možností je viacero. V niektorých prípadoch sa hodí použiť v tabuľke dátový typ ENUM, ktorý nie je problém PHPčkom spracovať do podoby selectu. O tom však niekedy inokedy. Pokiaľ chcem niektorý stĺpec z tabuľky vo formuláre prezentovať inak, využívam na to premennú $this->specials. Je to vlastne pole, kde definujem poradie prvkov, ktoré sa majú spracovať špecificky. Vyzerá to asi takto.

$specials[2] = 'select';

Uvedený zápis znamená, že prvok v poradí tretí (číslujeme od nuly) bude zobrazený ako select. Do for cyklu zobrazeného vyššie teda môžem nejakým spôsobom implementovať podmienku:

if ($this->specials[$i] == 'select') { /*nejaky HTML vystup*/ }

Tento select môže byť spracovaný akokoľvek, či už do neho natiahnem data z nejakej inej relačnej tabuľky alebo z ENUMu. Rovnakým spôsobom môžem spracovať ľubovoľné výstupy. V triede sú nadefinované základné a najviac využívané prvky, pričom nie je problém nový druh výstupu pridať.

Toto riešenie isto nie je ideálne, ale rozhodne uľahčí a urýchli prácu s generovaním formulárov. Taktiež nie je problém napojiť vygenerovaný formulár na triedu, ktorá opäť relatívne automatizovane spracuje údaje a vloží ich do tabuľky. Odpadá tym zdĺhavé vypisovanie SQL Insertov.

Tomáš Mašek

Naspäť naspäť Pridať komentár k článku prispieť do diskusie [0]

Vyhľadávanie

v názvoch článkov v textoch článkov

Pridať komentár

Koľko je na ruke prstov?

RSS