Formulářové prvky
Přehled standardních formulářových prvků.
addText(string|int $name, $label=null): TextInput
Přidá jednořádkové textové políčko (třída TextInput). Pokud uživatel pole nevyplní, vrací
prázdný řetězec ''
, nebo pomocí setNullable()
lze určit, aby vracel null
.
$form->addText('name', 'Jméno:')
->setRequired()
->setNullable();
Automaticky validuje UTF-8, ořezává levo- a pravostranné mezery a odstraňuje odřádkování, které by mohl odeslat útočník.
Maximální délku lze omezit pomocí setMaxLength()
. Pozměnit uživatelem vloženou hodnotu umožňuje addFilter().
Pomocí setHtmlType()
lze změnit charakter vstupního prvku na
search
, tel
, url
, range
, date
, datetime-local
,
month
, time
, week
, color
. Místo typů number
a
email
doporučujeme použít addInteger a addEmail, které
disponují validací na straně serveru.
$form->addText('color', 'Vyberte barvu:')
->setHtmlType('color')
->addRule($form::PATTERN, 'invalid value', '[0-9a-f]{6}');
Prvku lze nastavit tzv. empty-value, což je něco jako výchozí hodnota, ale pokud ji uživatel nezmění, vrátí prvek
prázdný řetězec či null
.
$form->addText('phone', 'Telefon:')
->setHtmlType('tel')
->setEmptyValue('+420');
addTextArea(string|int $name, $label=null): TextArea
Přidá pole pro zadání víceřádkového textu (třída TextArea). Pokud uživatel pole nevyplní, vrací
prázdný řetězec ''
, nebo pomocí setNullable()
lze určit, aby vracel null
.
$form->addTextArea('note', 'Poznámka:')
->addRule($form::MAX_LENGTH, 'Poznámka je příliš dlouhá', 10000);
Automaticky validuje UTF-8 a normalizuje oddělovače řádků na \n
. Na rozdíl od jednořádkového vstupního
políčka k žádnému ořezávání mezer nedochází.
Maximální délku lze omezit pomocí setMaxLength()
. Pozměnit uživatelem vloženou hodnotu umožňuje addFilter(). Lze nastavit tzv. empty-value pomocí setEmptyValue()
.
addInteger(string|int $name, $label=null): TextInput
Přidá políčko pro zadání celočíselného čísla (třída TextInput). Vrací buď integer, nebo
null
, pokud uživatel nic nezadá.
$form->addInteger('level', 'Úroveň:')
->setDefaultValue(0)
->addRule($form::RANGE, 'Úroveň musí být v rozsahu mezi %d a %d.', [0, 100]);
addEmail(string|int $name, $label=null): TextInput
Přidá políčko pro zadání e-mailové adresy (třída TextInput). Pokud uživatel pole nevyplní, vrací
prázdný řetězec ''
, nebo pomocí setNullable()
lze určit, aby vracel null
.
$form->addEmail('email', 'E-mail:');
Ověří, zda je hodnota platná e-mailová adresa. Neověřuje se, zda doména skutečně existuje, ověřuje se pouze syntaxe. Automaticky validuje UTF-8, ořezává levo- a pravostranné mezery.
Maximální délku lze omezit pomocí setMaxLength()
. Pozměnit uživatelem vloženou hodnotu umožňuje addFilter(). Lze nastavit tzv. empty-value pomocí setEmptyValue()
.
addPassword(string|int $name, $label=null): TextInput
Přidá políčko pro zadání hesla (třída TextInput).
$form->addPassword('password', 'Heslo:')
->setRequired()
->addRule($form::MIN_LENGTH, 'Heslo musí mít alespoň %d znaků', 8)
->addRule($form::PATTERN, 'Musí obsahovat číslici', '.*[0-9].*');
Při znovuzobrazení formuláře bude políčko prázdné. Automaticky validuje UTF-8, ořezává levo- a pravostranné mezery a odstraňuje odřádkování, které by mohl odeslat útočník.
addCheckbox(string|int $name, $caption=null): Checkbox
Přidá zaškrtávací políčko (třída Checkbox). Vrací hodnotu buď true
nebo false
, podle toho, zda je zaškrtnuté.
$form->addCheckbox('agree', 'Souhlasím s podmínkami')
->setRequired('Je potřeba souhlasit s podmínkami');
addCheckboxList(string|int $name, $label=null, ?array $items=null): CheckboxList
Přidá zaškrtávací políčka pro výběr více položek (třída CheckboxList). Vrací pole klíčů vybraných
položek. Metoda getSelectedItems()
vrací hodnoty místo klíčů.
$form->addCheckboxList('colors', 'Barvy:', [
'r' => 'červená',
'g' => 'zelená',
'b' => 'modrá',
]);
Pole nabízených položek předáme jako třetí parametr nebo metodou setItems()
.
Pomocí setDisabled(['r', 'g'])
lze deaktivovat jednotlivé položky.
Prvek automaticky kontroluje, že nedošlo k podvržení a že vybrané položky jsou skutečně jedněmi z nabízených a
nebyly deaktivovaná. Metodou getRawValue()
lze získat odeslané položky bez této důležité kontroly.
Při nastavení výchozích vybraných položek také kontroluje, že jde o jedny z nabízených, jinak vyhodí výjimku.
Tuto kontrolu lze vypnout pomocí checkDefaultValue(false)
.
addRadioList(string|int $name, $label=null, ?array $items=null): RadioList
Přidá přepínací tlačítka (třída RadioList). Vrací klíč vybrané položky, nebo
null
, pokud uživatel nic nevybral. Metoda getSelectedItem()
vrací hodnotu místo klíče.
$sex = [
'm' => 'muž',
'f' => 'žena',
];
$form->addRadioList('gender', 'Pohlaví:', $sex);
Pole nabízených položek předáme jako třetí parametr nebo metodou setItems()
.
Pomocí setDisabled(['m', 'f'])
lze deaktivovat jednotlivé položky.
Prvek automaticky kontroluje, že nedošlo k podvržení a že vybraná položka je skutečně jednou z nabízených a nebyla
deaktivovaná. Metodou getRawValue()
lze získat odeslanou položku bez této důležité kontroly.
Při nastavení výchozí vybrané položky také kontroluje, že jde o jednou z nabízených, jinak vyhodí výjimku. Tuto
kontrolu lze vypnout pomocí checkDefaultValue(false)
.
addSelect(string|int $name, $label=null, ?array $items=null): SelectBox
Přidá select box (třída SelectBox).
Vrací klíč vybrané položky, nebo null
, pokud uživatel nic nevybral. Metoda getSelectedItem()
vrací hodnotu místo klíče.
$countries = [
'CZ' => 'Česká Republika',
'SK' => 'Slovensko',
'GB' => 'Velká Británie',
];
$form->addSelect('country', 'Země:', $countries)
->setDefaultValue('SK');
Pole nabízených položek předáme jako třetí parametr nebo metodou setItems()
. Položky mohou být
i dvourozměrné pole:
$countries = [
'Europe' => [
'CZ' => 'Česká Republika',
'SK' => 'Slovensko',
'GB' => 'Velká Británie',
],
'CA' => 'Kanada',
'US' => 'USA',
'?' => 'jiná',
];
U select boxů má často první položka speciální význam, slouží jako výzva k akci. K přidání takové položky
slouží metoda setPrompt()
.
$form->addSelect('country', 'Země:', $countries)
->setPrompt('Zvolte zemi');
Pomocí setDisabled(['CZ', 'SK'])
lze deaktivovat jednotlivé položky.
Prvek automaticky kontroluje, že nedošlo k podvržení a že vybraná položka je skutečně jednou z nabízených a nebyla
deaktivovaná. Metodou getRawValue()
lze získat odeslanou položku bez této důležité kontroly.
Při nastavení výchozí vybrané položky také kontroluje, že jde o jednou z nabízených, jinak vyhodí výjimku. Tuto
kontrolu lze vypnout pomocí checkDefaultValue(false)
.
addMultiSelect(string|int $name, $label=null, ?array $items=null): MultiSelectBox
Přidá select box pro výběr více položek (třída MultiSelectBox). Vrací pole klíčů
vybraných položek. Metoda getSelectedItems()
vrací hodnoty místo klíčů.
$form->addMultiSelect('countries', 'Země:', $countries);
Pole nabízených položek předáme jako třetí parametr nebo metodou setItems()
. Položky mohou být
i dvourozměrné pole.
Pomocí setDisabled(['CZ', 'SK'])
lze deaktivovat jednotlivé položky.
Prvek automaticky kontroluje, že nedošlo k podvržení a že vybrané položky jsou skutečně jedněmi z nabízených a
nebyly deaktivovaná. Metodou getRawValue()
lze získat odeslané položky bez této důležité kontroly.
Při nastavení výchozích vybraných položek také kontroluje, že jde o jedny z nabízených, jinak vyhodí výjimku.
Tuto kontrolu lze vypnout pomocí checkDefaultValue(false)
.
addUpload(string|int $name, $label=null): UploadControl
Přidá políčko pro upload souboru (třída UploadControl). Vrací objekt FileUpload a to i v případě, že uživatel žádný soubor neodeslal, což lze zjistit
metodou FileUpload::hasFile()
.
$form->addUpload('avatar', 'Avatar:')
->setRequired(false) // nepovinný
->addRule($form::IMAGE, 'Avatar musí být JPEG, PNG or GIF.')
->addRule($form::MAX_FILE_SIZE, 'Maximální velikost je 1 MB.', 1024 * 1024);
Pokud se soubor nepodaří korektně nahrát, formulář není úspěšně odeslaný a zobrazí se chyba. Tj. při úspěšném
odeslání není potřeba ověřovat metodu FileUpload::isOk()
.
Nikdy nevěřte originálnímu názvu souboru vráceného metodou FileUpload::getName()
, klient mohl odeslat
škodlivý název souboru s úmyslem poškodit nebo hacknout vaši aplikaci.
Pravidla MIME_TYPE
a IMAGE
detekují požadovaný typ na základě signatury souboru a neověřují
jeho integritu. Zda není obrázek poškozený lze zjistit například pokusem o jeho načtení.
addMultiUpload(string|int $name, $label=null): UploadControl
Přidá políčko pro upload více souboru najednou (třída UploadControl). Vrací pole objektů FileUpload. Metoda FileUpload::hasFile()
u každého z nich bude vracet
true
.
$form->addMultiUpload('files', 'Soubory:')
->addRule($form::MAX_LENGTH, 'Maximálně lze nahrát %d souborů', 10);
Pokud se některý soubor nepodaří korektně nahrát, formulář není úspěšně odeslaný a zobrazí se chyba. Tj. při
úspěšném odeslání není potřeba ověřovat metodu FileUpload::isOk()
.
Nikdy nevěřte originálním názvům souborů vráceným metodou FileUpload::getName()
, klient mohl odeslat
škodlivý název souboru s úmyslem poškodit nebo hacknout vaši aplikaci.
Pravidla MIME_TYPE
a IMAGE
detekují požadovaný typ na základě signatury souboru a neověřují
jeho integritu. Zda není obrázek poškozený lze zjistit například pokusem o jeho načtení.
addHidden(string|int $name, ?string $default=null): HiddenField
Přidá skryté pole (třída HiddenField).
$form->addHidden('userid');
Pomocí setNullable()
lze nastavit, aby vracel null
místo prázdného řetězce. Pozměnit odeslanou
hodnotu umožňuje addFilter().
addSubmit(string|int $name, $caption=null): SubmitButton
Přidá odesílací tlačítko (třída SubmitButton).
$form->addSubmit('submit', 'Odeslat');
Ve formuláři je možné mít i více odesílacích tlačítek:
$form->addSubmit('register', 'Register');
$form->addSubmit('cancel', 'Cancel');
Ke zjištění, na které z nich bylo kliknuto, použijte:
if ($form['register']->isSubmittedBy()) {
// ...
}
Pokud nechcete validovat celý formulář při stisknutí tlačítka (například u tlačítek Zrušit nebo Náhled), použijte setValidationScope().
addButton(string|int $name, $caption): Button
Přidá tlačítko (třída Button), které nemá odesílací funkci. Lze ho tedy využít na nějakou jinou funkci, např. zavolání JavaScriptové funkce při kliknutí.
$form->addButton('raise', 'Zvýšit plat')
->setHtmlAttribute('onclick', 'raiseSalary()');
addImage(string|int $name, ?string $src=null, ?string $alt=null): ImageButton
Přidá odesílací tlačítko v podobě obrázku (třída ImageButton).
$form->addImage('submit', '/path/to/image');
Při použití více odeslacích tlačítek lze zjistit, na které bylo kliknuto, pomocí
$form['submit']->isSubmittedBy()
.
addContainer(string|int $name): Container
Přidá podformulář (třída Container), nebo-li
kontejner, do kterého lze přidávat další prvky stejným způsobem, jako je přidáváme do formuláře. Fungují i metody
setDefaults()
nebo getValues()
.
$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Your name:');
$sub1->addEmail('email', 'Email:');
$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Your name:');
$sub2->addEmail('email', 'Email:');
Odeslaná data pak vrací jako vícerozměrnou strukturu:
[
'first' => [
'name' => /* ... */,
'email' => /* ... */,
],
'second' => [
'name' => /* ... */,
'email' => /* ... */,
],
]
Další nastavení
Všem formulářovým prvkům lze nastavit výchozí hodnotu pomocí setDefaultValue()
a získat aktuální
hodnotu pomocí getValue()
.
Popisku lze měnit pomocí setCaption(string|object $caption)
.
Můžete měnit přímo jednotlivé atributy HTML elementu pomocí
setHtmlAttribute()
. Pro atributy id
a name
jsou k dispozici navíc metody
setHtmlId($id)
, getHtmlId()
a getHtmlName()
.
Jednotlivým formulářovým prvkům je možné nastavit překladač pomocí setTranslator()
.
Prvkům lze přiřadit také uživatelské data pomocí setOption($key, $value)
a číst je pomocí
getOption($key)
. Můžete tak například prvkům předat informace, které využijete při vykreslování.
Dále lze nastavovat validační pravidla pomocí metod addRule()
,
addCondition()
a dalších.
Vynechané hodnoty
Pokud nás uživatelem vyplněná hodnota nezajímá, můžeme ji pomocí setOmitted()
vynechat z výsledku
metody $form->getValues()
nebo z dat předávaných do handlerů. To se hodí pro různá hesla pro kontrolu,
antispamové prvky atd.
$form->addPassword('passwordVerify', 'Heslo pro kontrolu:')
->setRequired('Zadejte prosím heslo ještě jednou pro kontrolu')
->addRule($form::EQUAL, 'Hesla se neshodují', $form['password'])
->setOmitted();
Deaktivace prvků
Prvky lze deaktivovat pomocí setDisabled()
. Takový prvek nemůže uživatel editovat.
$form->addText('username', 'Uživatelské jméno:')
->setDisabled();
Upozorňujeme, že disablované prvky prohlížeč vůbec neodesílá na server, tedy je ani nenajdete v datech vrácených
funkcí $form->getValues()
.
Pokud prvku nastavujete výchozí hodnotu, je tak nutné učinit až po jeho deaktivaci:
$form->addText('username', 'Uživatelské jméno:')
->setDisabled()
->setDefaultValue($userName);
Vlastní prvky
Vedle široké škály vestavěných formulářových prvků můžete do formuláře přidávat vlastní prvky tímto způsobem:
$form->addComponent(new DateInput('Datum:'), 'date');
// alternativní syntax: $form['date'] = new DateInput('Datum:');
Existuje způsob, jak definovat nové metody formuláře sloužící k přidávání vlastních prvků (např.
$form->addZip()
). Jde o tzv. extension methods. Nevýhoda je, že pro ně nebude fungovat napovídání
v editorech.
use Nette\Forms\Container;
// přidáme metodu addZip(string $name, string $label = null)
Container::extensionMethod('addZip', function (Container $form, $name, $label = null) {
return $form->addText($name, $label)
->setRequired(false)
->addRule($form::PATTERN, 'Alespoň 5 čísel', '[0-9]{5}');
});
// použití
$form->addZip('zip', 'ZIP code:');
Low-level prvky
Lze používat i prvky, které zapíšeme pouze v šabloně a nepřidáme je do formuláře některou z metod
$form->addXyz()
. Když například vypisujeme záznamy z databáze a dopředu nevíme, kolik jich bude a jaké
budou mít ID, a chceme u každého řádku zobrazit checkbox nebo radio button, stačí jej nakódovat v šabloně:
{foreach $items as $item}
<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}
A po odeslání hodnotu zjistíme:
$data = $form->getHttpData($form::DATA_TEXT, 'sel[]');
$data = $form->getHttpData($form::DATA_TEXT | $form::DATA_KEYS, 'sel[]');
kde první parametr je typ elementu (DATA_FILE
pro type=file
, DATA_LINE
pro
jednořádkové vstupy jako text
, password
, email
apod. a DATA_TEXT
pro
všechny ostatní) a druhý parametr sel[]
odpovídá HTML atributu name. Typ elementu můžeme kombinovat
s hodnotou DATA_KEYS
, která zachová klíče prvků. To se hodí zejména pro select
,
radioList
a checkboxList
.
Podstatné je, že getHttpData()
vrací sanitizovanou hodnotu, v tomto případě to bude vždy pole validních
UTF-8 řetězců, ať už by se pokusil útočník serveru podstrčit cokoliv. Jde o obdobu přímé práce s
$_POST
nebo $_GET
avšak s tím podstatným rozdílem, že vždy vrací čistá data, tak, jak jste
zvyklí u standardních prvků Nette formulářů.