| Rubrika Php / mysql
Pridať komentár
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.

naspäť
