Elementi obrazca

Pregled standardnih elementov obrazca.

addText (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput

Doda enovrstično besedilno polje (razred TextInput). Če uporabnik polja ne izpolni, vrne prazen niz '', ali pa s pomočjo setNullable() lahko določite, da vrne null.

$form->addText('name', 'Ime:')
	->setRequired()
	->setNullable();

Samodejno validira UTF-8, obreže leve in desne presledke ter odstrani prelome vrstic, ki bi jih lahko poslal napadalec.

Maksimalno dolžino lahko omejite s pomočjo setMaxLength(). Spreminjanje vrednosti, ki jo vnese uporabnik, omogoča addFilter().

S pomočjo setHtmlType() lahko spremenite vizualni značaj besedilnega polja na tipe, kot so search, tel ali url, glej specifikacijo. Ne pozabite, da je sprememba tipa le vizualna in ne nadomešča funkcije validacije. Za tip url je priporočljivo dodati specifično validacijsko pravilo URL.

Za druge tipe vnosov, kot so number, range, email, date, datetime-local, time in color, uporabite specializirane metode, kot so addInteger, addFloat, addEmail addDate, addTime, addDateTime in addColor, ki zagotavljajo strežniško validacijo. Tipi month in week še niso popolnoma podprti v vseh brskalnikih.

Elementu lahko nastavite t.i. empty-value, kar je nekaj podobnega privzeti vrednosti, a če je uporabnik ne spremeni, element vrne prazen niz ali null.

$form->addText('phone', 'Telefon:')
	->setHtmlType('tel')
	->setEmptyValue('+386');

addTextArea (string|int $name, $label=null): TextArea

Doda polje za vnos večvrstičnega besedila (razred TextArea). Če uporabnik polja ne izpolni, vrne prazen niz '', ali pa s pomočjo setNullable() lahko določite, da vrne null.

$form->addTextArea('note', 'Opomba:')
	->addRule($form::MaxLength, 'Opomba je predolga', 10000);

Samodejno validira UTF-8 in normalizira ločila vrstic na \n. V nasprotju z enovrstičnim vnosnim poljem ne pride do obrezovanja presledkov.

Maksimalno dolžino lahko omejite s pomočjo setMaxLength(). Spreminjanje vrednosti, ki jo vnese uporabnik, omogoča addFilter(). Lahko nastavite t.i. empty-value s pomočjo setEmptyValue().

addInteger (string|int $name, $label=null): TextInput

Doda polje za vnos celega števila (razred TextInput). Vrne bodisi integer ali null, če uporabnik ničesar ne vnese.

$form->addInteger('year', 'Leto:')
	->addRule($form::Range, 'Leto mora biti v obsegu od %d do %d.', [1900, 2023]);

Element se izriše kot <input type="number">. Z uporabo metode setHtmlType() lahko spremenite tip na range za prikaz v obliki drsnika ali na text, če preferirate standardno besedilno polje brez posebnega obnašanja tipa number.

addFloat (string|int $name, $label=null): TextInput

Doda polje za vnos decimalnega števila (razred TextInput). Vrne bodisi float ali null, če uporabnik ničesar ne vnese.

$form->addFloat('level', 'Raven:')
	->setDefaultValue(0)
	->addRule($form::Range, 'Raven mora biti v obsegu od %d do %d.', [0, 100]);

Element se izriše kot <input type="number">. Z uporabo metode setHtmlType() lahko spremenite tip na range za prikaz v obliki drsnika ali na text, če preferirate standardno besedilno polje brez posebnega obnašanja tipa number.

Nette in brskalnik Chrome sprejemata kot ločilo decimalnih mest tako vejico kot piko. Da bi bila ta funkcionalnost na voljo tudi v Firefoxu, je priporočljivo nastaviti atribut lang bodisi za dani element ali za celotno stran, na primer <html lang="sl">.

addEmail (string|int $name, $label=null, int $maxLength=255): TextInput

Doda polje za vnos e-poštnega naslova (razred TextInput). Če uporabnik polja ne izpolni, vrne prazen niz '', ali pa s pomočjo setNullable() lahko določite, da vrne null.

$form->addEmail('email', 'E-pošta:');

Preveri, ali je vrednost veljaven e-poštni naslov. Ne preverja se, ali domena dejansko obstaja, preverja se le sintaksa. Samodejno validira UTF-8, obreže leve in desne presledke.

Maksimalno dolžino lahko omejite s pomočjo setMaxLength(). Spreminjanje vrednosti, ki jo vnese uporabnik, omogoča addFilter(). Lahko nastavite t.i. empty-value s pomočjo setEmptyValue().

addPassword (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput

Doda polje za vnos gesla (razred TextInput).

$form->addPassword('password', 'Geslo:')
	->setRequired()
	->addRule($form::MinLength, 'Geslo mora imeti vsaj %d znakov', 8)
	->addRule($form::Pattern, 'Mora vsebovati števko', '.*[0-9].*');

Pri ponovnem prikazu obrazca bo polje prazno. Samodejno validira UTF-8, obreže leve in desne presledke ter odstrani prelome vrstic, ki bi jih lahko poslal napadalec.

addCheckbox (string|int $name, $caption=null): Checkbox

Doda potrditveno polje (razred Checkbox). Vrne vrednost bodisi true ali false, glede na to, ali je označeno.

$form->addCheckbox('agree', 'Strinjam se s pogoji')
	->setRequired('Potrebno je strinjanje s pogoji');

addCheckboxList (string|int $name, $label=null, ?array $items=null): CheckboxList

Doda potrditvena polja za izbiro več postavk (razred CheckboxList). Vrne polje ključev izbranih postavk. Metoda getSelectedItems() vrne vrednosti namesto ključev.

$form->addCheckboxList('colors', 'Barve:', [
	'r' => 'rdeča',
	'g' => 'zelena',
	'b' => 'modra',
]);

Polje ponujenih postavk predamo kot tretji parameter ali z metodo setItems().

S pomočjo setDisabled(['r', 'g']) lahko deaktivirate posamezne postavke.

Element samodejno preverja, da ni prišlo do ponarejanja in da so izbrane postavke dejansko ene izmed ponujenih in niso bile deaktivirane. Z metodo getRawValue() lahko pridobite poslane postavke brez tega pomembnega preverjanja.

Pri nastavitvi privzetih izbranih postavk tudi preverja, da gre za ene izmed ponujenih, sicer vrže izjemo. To preverjanje lahko izklopite s pomočjo checkDefaultValue(false).

Če pošiljate obrazec z metodo GET, lahko izberete kompaktnejši način prenosa podatkov, ki prihrani velikost poizvedbenega niza (query string). Aktivira se z nastavitvijo HTML atributa obrazca:

$form->setHtmlAttribute('data-nette-compact');

addRadioList (string|int $name, $label=null, ?array $items=null): RadioList

Doda izbirne gumbe (radio buttons) (razred RadioList). Vrne ključ izbrane postavke ali null, če uporabnik ničesar ni izbral. Metoda getSelectedItem() vrne vrednost namesto ključa.

$sex = [
	'm' => 'moški',
	'f' => 'ženska',
];
$form->addRadioList('gender', 'Spol:', $sex);

Polje ponujenih postavk predamo kot tretji parameter ali z metodo setItems().

S pomočjo setDisabled(['m', 'f']) lahko deaktivirate posamezne postavke.

Element samodejno preverja, da ni prišlo do ponarejanja in da je izbrana postavka dejansko ena izmed ponujenih in ni bila deaktivirana. Z metodo getRawValue() lahko pridobite poslano postavko brez tega pomembnega preverjanja.

Pri nastavitvi privzete izbrane postavke tudi preverja, da gre za eno izmed ponujenih, sicer vrže izjemo. To preverjanje lahko izklopite s pomočjo checkDefaultValue(false).

addSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): SelectBox

Doda izbirno polje (select box) (razred SelectBox). Vrne ključ izbrane postavke ali null, če uporabnik ničesar ni izbral. Metoda getSelectedItem() vrne vrednost namesto ključa.

$countries = [
	'CZ' => 'Češka Republika',
	'SK' => 'Slovaška',
	'GB' => 'Velika Britanija',
];

$form->addSelect('country', 'Država:', $countries)
	->setDefaultValue('SK');

Polje ponujenih postavk predamo kot tretji parameter ali z metodo setItems(). Postavke so lahko tudi dvodimenzionalno polje:

$countries = [
	'Europe' => [
		'CZ' => 'Češka Republika',
		'SK' => 'Slovaška',
		'GB' => 'Velika Britanija',
	],
	'CA' => 'Kanada',
	'US' => 'ZDA',
	'?'  => 'druga',
];

Pri izbirnih poljih ima pogosto prva postavka poseben pomen, služi kot poziv k akciji. Za dodajanje takšne postavke služi metoda setPrompt().

$form->addSelect('country', 'Država:', $countries)
	->setPrompt('Izberite državo');

S pomočjo setDisabled(['CZ', 'SK']) lahko deaktivirate posamezne postavke.

Element samodejno preverja, da ni prišlo do ponarejanja in da je izbrana postavka dejansko ena izmed ponujenih in ni bila deaktivirana. Z metodo getRawValue() lahko pridobite poslano postavko brez tega pomembnega preverjanja.

Pri nastavitvi privzete izbrane postavke tudi preverja, da gre za eno izmed ponujenih, sicer vrže izjemo. To preverjanje lahko izklopite s pomočjo checkDefaultValue(false).

addMultiSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): MultiSelectBox

Doda izbirno polje za izbiro več postavk (razred MultiSelectBox). Vrne polje ključev izbranih postavk. Metoda getSelectedItems() vrne vrednosti namesto ključev.

$form->addMultiSelect('countries', 'Države:', $countries);

Polje ponujenih postavk predamo kot tretji parameter ali z metodo setItems(). Postavke so lahko tudi dvodimenzionalno polje.

S pomočjo setDisabled(['CZ', 'SK']) lahko deaktivirate posamezne postavke.

Element samodejno preverja, da ni prišlo do ponarejanja in da so izbrane postavke dejansko ene izmed ponujenih in niso bile deaktivirane. Z metodo getRawValue() lahko pridobite poslane postavke brez tega pomembnega preverjanja.

Pri nastavitvi privzetih izbranih postavk tudi preverja, da gre za ene izmed ponujenih, sicer vrže izjemo. To preverjanje lahko izklopite s pomočjo checkDefaultValue(false).

addUpload (string|int $name, $label=null): UploadControl

Doda polje za nalaganje datoteke (razred UploadControl). Vrne objekt FileUpload, in to tudi v primeru, da uporabnik nobene datoteke ni poslal, kar lahko ugotovite z metodo FileUpload::hasFile().

$form->addUpload('avatar', 'Avatar:')
	->addRule($form::Image, 'Avatar mora biti JPEG, PNG, GIF, WebP ali AVIF.')
	->addRule($form::MaxFileSize, 'Maksimalna velikost je 1 MB.', 1024 * 1024);

Če se datoteka ne uspe pravilno naložiti, obrazec ni uspešno poslan in prikaže se napaka. Tj. pri uspešni oddaji ni treba preverjati metode FileUpload::isOk().

Nikoli ne zaupajte originalnemu imenu datoteke, vrnjenemu z metodo FileUpload::getName(), klient bi lahko poslal škodljivo ime datoteke z namenom poškodovati ali vdreti v vašo aplikacijo.

Pravili MimeType in Image zaznata zahtevani tip na podlagi signature datoteke in ne preverjata njene integritete. Ali slika ni poškodovana, lahko ugotovite na primer s poskusom njenega nalaganja.

addMultiUpload (string|int $name, $label=null): UploadControl

Doda polje za nalaganje več datotek hkrati (razred UploadControl). Vrne polje objektov FileUpload. Metoda FileUpload::hasFile() pri vsakem od njih bo vračala true.

$form->addMultiUpload('files', 'Datoteke:')
	->addRule($form::MaxLength, 'Maksimalno lahko naložite %d datotek', 10);

Če se katera koli datoteka ne uspe pravilno naložiti, obrazec ni uspešno poslan in prikaže se napaka. Tj. pri uspešni oddaji ni treba preverjati metode FileUpload::isOk().

Nikoli ne zaupajte originalnim imenom datotek, vrnjenim z metodo FileUpload::getName(), klient bi lahko poslal škodljivo ime datoteke z namenom poškodovati ali vdreti v vašo aplikacijo.

Pravili MimeType in Image zaznata zahtevani tip na podlagi signature datoteke in ne preverjata njene integritete. Ali slika ni poškodovana, lahko ugotovite na primer s poskusom njenega nalaganja.

addDate (string|int $name, $label=null): DateTimeControl

Doda polje, ki uporabniku omogoča enostaven vnos datuma, sestavljenega iz leta, meseca in dneva (razred DateTimeControl).

Kot privzeto vrednost sprejema bodisi objekte, ki implementirajo vmesnik DateTimeInterface, niz s časom ali število, ki predstavlja UNIX časovni žig. Enako velja za argumente pravil Min, Max ali Range, ki definirajo minimalni in maksimalni dovoljeni datum.

$form->addDate('date', 'Datum:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'Datum mora biti vsaj en mesec star.', new DateTime('-1 month'));

Standardno vrne objekt DateTimeImmutable, z metodo setFormat() lahko specificirate besedilni format ali časovni žig:

$form->addDate('date', 'Datum:')
	->setFormat('Y-m-d');

addTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl

Doda polje, ki uporabniku omogoča enostaven vnos časa, sestavljenega iz ur, minut in opcijsko tudi sekund (razred DateTimeControl).

Kot privzeto vrednost sprejema bodisi objekte, ki implementirajo vmesnik DateTimeInterface, niz s časom ali število, ki predstavlja UNIX časovni žig. Iz teh vnosov je uporabljena le časovna informacija, datum je ignoriran. Enako velja za argumente pravil Min, Max ali Range, ki definirajo minimalni in maksimalni dovoljeni čas. Če je nastavljena minimalna vrednost višja od maksimalne, se ustvari časovni obseg, ki presega polnoč.

$form->addTime('time', 'Čas:', withSeconds: true)
	->addRule($form::Range, 'Čas mora biti v obsegu od %d do %d.', ['12:30', '13:30']);

Standardno vrne objekt DateTimeImmutable (z datumom 1. januarja leta 1), z metodo setFormat() lahko specificirate besedilni format:

$form->addTime('time', 'Čas:')
	->setFormat('H:i');

addDateTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl

Doda polje, ki uporabniku omogoča enostaven vnos datuma in časa, sestavljenega iz leta, meseca, dneva, ur, minut in opcijsko tudi sekund (razred DateTimeControl).

Kot privzeto vrednost sprejema bodisi objekte, ki implementirajo vmesnik DateTimeInterface, niz s časom ali število, ki predstavlja UNIX časovni žig. Enako velja za argumente pravil Min, Max ali Range, ki definirajo minimalni in maksimalni dovoljeni datum.

$form->addDateTime('datetime', 'Datum in čas:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'Datum mora biti vsaj en mesec star.', new DateTime('-1 month'));

Standardno vrne objekt DateTimeImmutable, z metodo setFormat() lahko specificirate besedilni format ali časovni žig:

$form->addDateTime('datetime')
	->setFormat(DateTimeControl::FormatTimestamp);

addColor (string|int $name, $label=null): ColorPicker

Doda polje za izbiro barve (razred ColorPicker). Barva je niz v obliki #rrggbb. Če uporabnik izbire ne opravi, se vrne črna barva #000000.

$form->addColor('color', 'Barva:')
	->setDefaultValue('#3C8ED7');

addHidden (string|int $name, ?string $default=null): HiddenField

Doda skrito polje (razred HiddenField).

$form->addHidden('userid');

S pomočjo setNullable() lahko nastavite, da vrne null namesto praznega niza. Spreminjanje poslane vrednosti omogoča addFilter().

Čeprav je element skrit, je pomembno se zavedati, da lahko vrednost še vedno spremeni ali ponaredi napadalec. Vedno temeljito preverjajte in validirajte vse prejete vrednosti na strežniški strani, da preprečite varnostna tveganja, povezana z manipulacijo podatkov.

addSubmit (string|int $name, $caption=null): SubmitButton

Doda gumb za oddajo (razred SubmitButton).

$form->addSubmit('submit', 'Pošlji');

V obrazcu je mogoče imeti tudi več gumbov za oddajo:

$form->addSubmit('register', 'Registriraj');
$form->addSubmit('cancel', 'Prekliči');

Za ugotovitev, na katerega od njih je bilo kliknjeno, uporabite:

if ($form['register']->isSubmittedBy()) {
  // ...
}

Če ne želite validirati celotnega obrazca ob pritisku na gumb (na primer pri gumbih Prekliči ali Predogled), uporabite setValidationScope().

addButton (string|int $name, $caption)Button

Doda gumb (razred Button), ki nima funkcije oddaje. Lahko ga torej uporabite za kakšno drugo funkcijo, npr. klic JavaScript funkcije ob kliku.

$form->addButton('raise', 'Zvišaj plačo')
	->setHtmlAttribute('onclick', 'raiseSalary()');

addImageButton (string|int $name, ?string $src=null, ?string $alt=null): ImageButton

Doda gumb za oddajo v obliki slike (razred ImageButton).

$form->addImageButton('submit', '/pot/do/slike');

Pri uporabi več gumbov za oddajo lahko ugotovite, na katerega je bilo kliknjeno, s pomočjo $form['submit']->isSubmittedBy().

addContainer (string|int $name): Container

Doda podobrazec (razred Container), ali vsebnik, v katerega lahko dodajate druge elemente na enak način, kot jih dodajamo v obrazec. Delujejo tudi metode setDefaults() ali getValues().

$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Vaše ime:');
$sub1->addEmail('email', 'E-pošta:');

$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Vaše ime:');
$sub2->addEmail('email', 'E-pošta:');

Poslani podatki se nato vrnejo kot večdimenzionalna struktura:

[
	'first' => [
		'name' => /* ... */,
		'email' => /* ... */,
	],
	'second' => [
		'name' => /* ... */,
		'email' => /* ... */,
	],
]

Pregled nastavitev

Pri vseh elementih lahko kličemo naslednje metode (popoln pregled v API dokumentaciji):

setDefaultValue($value) nastavi privzeto vrednost
getValue() pridobi trenutno vrednost
setOmitted() Izpustitev vrednosti
setDisabled() Deaktivacija elementov

Izrisovanje:

setCaption($caption) spremeni oznako elementa
setTranslator($translator) nastavi prevajalnik
setHtmlAttribute($name, $value) nastavi HTML atribut elementa
setHtmlId($id) nastavi HTML atribut id
setHtmlType($type) nastavi HTML atribut type
setHtmlName($name) nastavi HTML atribut name
setOption($key, $value) nastavitve za izrisovanje

Validacija:

setRequired() obvezni element
addRule() nastavitev validacijsko pravilo
addCondition(), addConditionOn() nastavi validacijski pogoj
addError($message) predaja sporočila o napaki

Pri elementih addText(), addPassword(), addTextArea(), addEmail(), addInteger() lahko kličemo naslednje metode:

setNullable() nastavi, ali getValue() vrne null namesto praznega niza
setEmptyValue($value) nastavi posebno vrednost, ki se šteje za prazen niz
setMaxLength($length) nastavi maksimalno število dovoljenih znakov
addFilter($filter) prilagoditev vnosa

Izpustitev vrednosti

Če nas vrednost, ki jo je vnesel uporabnik, ne zanima, jo lahko s pomočjo setOmitted() izpustimo iz rezultata metode $form->getValues() ali iz podatkov, predanih handlerjem. To je koristno za različna gesla za preverjanje, antispam elemente itd.

$form->addPassword('passwordVerify', 'Geslo za preverjanje:')
	->setRequired('Prosimo, vnesite geslo še enkrat za preverjanje')
	->addRule($form::Equal, 'Gesli se ne ujemata', $form['password'])
	->setOmitted();

Deaktivacija elementov

Elemente lahko deaktivirate s pomočjo setDisabled(). Takšnega elementa uporabnik ne more urejati.

$form->addText('username', 'Uporabniško ime:')
	->setDisabled();

Onemogočeni elementi brskalnik sploh ne pošilja na strežnik, torej jih niti ne najdete v podatkih, vrnjenih s funkcijo $form->getValues(). Če pa nastavite setOmitted(false), Nette v te podatke vključi njihovo privzeto vrednost.

Pri klicu setDisabled() se iz varnostnih razlogov izbriše vrednost elementa. Če nastavljate privzeto vrednost, je to treba storiti šele po njegovi deaktivaciji:

$form->addText('username', 'Uporabniško ime:')
	->setDisabled()
	->setDefaultValue($userName);

Alternativa onemogočenim elementom so elementi s HTML atributom readonly, ki jih brskalnik pošilja na strežnik. Čeprav je element samo za branje, je pomembno se zavedati, da lahko njegovo vrednost še vedno spremeni ali ponaredi napadalec.

Lastni elementi

Poleg široke palete vgrajenih elementov obrazca lahko v obrazec dodajate lastne elemente na ta način:

$form->addComponent(new DateInput('Datum:'), 'date');
// alternativna sintaksa: $form['date'] = new DateInput('Datum:');

Obrazec je potomec razreda Container in posamezni elementi so potomci Component.

Obstaja način, kako definirati nove metode obrazca, ki služijo za dodajanje lastnih elementov (npr. $form->addZip()). Gre za t.i. extension methods. Slabost je, da zanje ne bo delovalo predlaganje v urejevalnikih.

use Nette\Forms\Container;

// dodamo metodo addZip(string $name, ?string $label = null)
Container::extensionMethod('addZip', function (Container $form, string $name, ?string $label = null) {
	return $form->addText($name, $label)
		->addRule($form::Pattern, 'Vsaj 5 številk', '[0-9]{5}');
});

// uporaba
$form->addZip('zip', 'Poštna številka:');

Nizkonivojski elementi

Lahko uporabljamo tudi elemente, ki jih zapišemo samo v predlogi in jih ne dodamo v obrazec z nobeno od metod $form->addXyz(). Ko na primer izpisujemo zapise iz podatkovne baze in vnaprej ne vemo, koliko jih bo in kakšne ID-je bodo imeli, in želimo pri vsaki vrstici prikazati potrditveno polje ali izbirni gumb, ga zadostuje kodirati v predlogi:

{foreach $items as $item}
	<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}

In po oddaji vrednost ugotovimo:

$data = $form->getHttpData($form::DataText, 'sel[]');
$data = $form->getHttpData($form::DataText | $form::DataKeys, 'sel[]');

kjer prvi parameter je tip elementa (DataFile za type=file, DataLine za enovrstične vnose kot text, password, email ipd. in DataText za vse ostale) in drugi parameter sel[] ustreza HTML atributu name. Tip elementa lahko kombiniramo z vrednostjo DataKeys, ki ohrani ključe elementov. To je koristno zlasti za select, radioList in checkboxList.

Bistveno je, da getHttpData() vrne sanirano vrednost, v tem primeru bo to vedno polje veljavnih UTF-8 nizov, ne glede na to, kaj bi poskušal napadalec podtakniti strežniku. Gre za analogijo neposrednega dela z $_POST ali $_GET, vendar s to bistveno razliko, da vedno vrne čiste podatke, tako kot ste navajeni pri standardnih elementih Nette obrazcev.

različica: 4.0