Elemente de formular
Prezentare generală a elementelor de formular standard.
addText (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput
Adaugă un câmp text pe o singură linie (clasa TextInput). Dacă utilizatorul nu completează
câmpul, returnează un șir gol ''
, sau folosind setNullable()
se poate specifica să returneze
null
.
$form->addText('name', 'Nume:')
->setRequired()
->setNullable();
Validează automat UTF-8, elimină spațiile de la început și sfârșit și elimină sfârșiturile de linie pe care un
atacator le-ar putea trimite. Parametrul $cols
este depreciat și nu este utilizat.
Lungimea maximă poate fi limitată folosind setMaxLength()
. Modificarea valorii introduse de utilizator este
posibilă prin addFilter().
Folosind setHtmlType()
se poate schimba caracterul vizual al câmpului text la tipuri precum search
,
tel
sau url
vezi specificație. Rețineți că schimbarea tipului
este doar vizuală și nu înlocuiește funcția de validare. Pentru tipul url
este recomandat să se adauge o regulă de validare specifică URL.
Pentru alte tipuri de intrări, cum ar fi number
, range
, email
,
date
, datetime-local
, time
și color
, utilizați metode specializate precum addInteger, addFloat, addEmail addDate, addTime, addDateTime și addColor, care asigură validarea pe server. Tipurile month
și week
nu sunt
încă pe deplin suportate în toate browserele.
Elementului i se poate seta așa-numita empty-value, care este ceva asemănător valorii implicite, dar dacă utilizatorul nu
o schimbă, elementul returnează un șir gol sau null
.
$form->addText('phone', 'Telefon:')
->setHtmlType('tel')
->setEmptyValue('+40');
addTextArea (string|int $name, $label=null): TextArea
Adaugă un câmp pentru introducerea textului multilinie (clasa TextArea). Dacă utilizatorul nu completează
câmpul, returnează un șir gol ''
, sau folosind setNullable()
se poate specifica să returneze
null
.
$form->addTextArea('note', 'Notă:')
->addRule($form::MaxLength, 'Nota este prea lungă', 10000);
Validează automat UTF-8 și normalizează separatorii de linie la \n
. Spre deosebire de câmpul de intrare pe
o singură linie, nu are loc nicio eliminare a spațiilor.
Lungimea maximă poate fi limitată folosind setMaxLength()
. Modificarea valorii introduse de utilizator este
posibilă prin addFilter(). Se poate seta așa-numita
empty-value folosind setEmptyValue()
.
addInteger (string|int $name, $label=null): TextInput
Adaugă un câmp pentru introducerea unui număr întreg (clasa TextInput). Returnează fie un integer, fie
null
, dacă utilizatorul nu introduce nimic.
$form->addInteger('year', 'An:')
->addRule($form::Range, 'Anul trebuie să fie în intervalul de la %d la %d.', [1900, 2023]);
Elementul se randează ca <input type="number">
. Folosind metoda setHtmlType()
se poate schimba
tipul la range
pentru afișare sub formă de glisor, sau la text
, dacă preferați un câmp text
standard fără comportamentul special al tipului number
.
addFloat (string|int $name, $label=null): TextInput
Adaugă un câmp pentru introducerea unui număr zecimal (clasa TextInput). Returnează fie un float, fie
null
, dacă utilizatorul nu introduce nimic.
$form->addFloat('level', 'Nivel:')
->setDefaultValue(0)
->addRule($form::Range, 'Nivelul trebuie să fie în intervalul de la %d la %d.', [0, 100]);
Elementul se randează ca <input type="number">
. Folosind metoda setHtmlType()
se poate schimba
tipul la range
pentru afișare sub formă de glisor, sau la text
, dacă preferați un câmp text
standard fără comportamentul special al tipului number
.
Nette și browserul Chrome acceptă atât virgula, cât și punctul ca separator zecimal. Pentru ca această funcționalitate
să fie disponibilă și în Firefox, se recomandă setarea atributului lang
fie pentru elementul respectiv, fie
pentru întreaga pagină, de exemplu <html lang="ro">
.
addEmail (string|int $name, $label=null, int $maxLength=255): TextInput
Adaugă un câmp pentru introducerea unei adrese de e-mail (clasa TextInput). Dacă utilizatorul nu completează
câmpul, returnează un șir gol ''
, sau folosind setNullable()
se poate specifica să returneze
null
.
$form->addEmail('email', 'E-mail:');
Verifică dacă valoarea este o adresă de e-mail validă. Nu se verifică dacă domeniul există efectiv, se verifică doar sintaxa. Validează automat UTF-8, elimină spațiile de la început și sfârșit.
Lungimea maximă poate fi limitată folosind setMaxLength()
. Modificarea valorii introduse de utilizator este
posibilă prin addFilter(). Se poate seta așa-numita
empty-value folosind setEmptyValue()
.
addPassword (string|int $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput
Adaugă un câmp pentru introducerea parolei (clasa TextInput). Parametrul $cols
este
depreciat și nu este utilizat.
$form->addPassword('password', 'Parolă:')
->setRequired()
->addRule($form::MinLength, 'Parola trebuie să aibă cel puțin %d caractere', 8)
->addRule($form::Pattern, 'Trebuie să conțină o cifră', '.*[0-9].*');
La reafișarea formularului, câmpul va fi gol. Validează automat UTF-8, elimină spațiile de la început și sfârșit și elimină sfârșiturile de linie pe care un atacator le-ar putea trimite.
addCheckbox (string|int $name, $caption=null): Checkbox
Adaugă o căsuță de bifat (clasa Checkbox). Returnează valoarea true
sau false
, în funcție de dacă este bifată.
$form->addCheckbox('agree', 'Sunt de acord cu termenii')
->setRequired('Este necesar să fiți de acord cu termenii');
addCheckboxList (string|int $name, $label=null, ?array $items=null): CheckboxList
Adaugă căsuțe de bifat pentru selectarea mai multor elemente (clasa CheckboxList). Returnează un array al
cheilor elementelor selectate. Metoda getSelectedItems()
returnează valorile în loc de chei.
$form->addCheckboxList('colors', 'Culori:', [
'r' => 'roșu',
'g' => 'verde',
'b' => 'albastru',
]);
Array-ul de elemente oferite îl transmitem ca al treilea parametru sau prin metoda setItems()
.
Folosind setDisabled(['r', 'g'])
se pot dezactiva elemente individuale.
Elementul verifică automat că nu a avut loc o falsificare și că elementele selectate sunt într-adevăr unele dintre cele
oferite și nu au fost dezactivate. Prin metoda getRawValue()
se pot obține elementele trimise fără această
verificare importantă.
La setarea elementelor selectate implicit, verifică de asemenea că acestea sunt unele dintre cele oferite, altfel aruncă
o excepție. Această verificare poate fi dezactivată folosind checkDefaultValue(false)
.
Dacă trimiteți formularul prin metoda GET
, puteți alege un mod mai compact de transmitere a datelor, care
economisește dimensiunea query string-ului. Se activează prin setarea atributului HTML al formularului:
$form->setHtmlAttribute('data-nette-compact');
addRadioList (string|int $name, $label=null, ?array $items=null): RadioList
Adaugă butoane radio (clasa RadioList).
Returnează cheia elementului selectat, sau null
, dacă utilizatorul nu a selectat nimic. Metoda
getSelectedItem()
returnează valoarea în loc de cheie.
$sex = [
'm' => 'bărbat',
'f' => 'femeie',
];
$form->addRadioList('gender', 'Sex:', $sex);
Array-ul de elemente oferite îl transmitem ca al treilea parametru sau prin metoda setItems()
.
Folosind setDisabled(['m', 'f'])
se pot dezactiva elemente individuale.
Elementul verifică automat că nu a avut loc o falsificare și că elementul selectat este într-adevăr unul dintre cele
oferite și nu a fost dezactivat. Prin metoda getRawValue()
se poate obține elementul trimis fără această
verificare importantă.
La setarea elementului selectat implicit, verifică de asemenea că acesta este unul dintre cele oferite, altfel aruncă
o excepție. Această verificare poate fi dezactivată folosind checkDefaultValue(false)
.
addSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): SelectBox
Adaugă un select box (clasa SelectBox).
Returnează cheia elementului selectat, sau null
, dacă utilizatorul nu a selectat nimic. Metoda
getSelectedItem()
returnează valoarea în loc de cheie.
$countries = [
'RO' => 'România',
'MD' => 'Moldova',
'GB' => 'Marea Britanie',
];
$form->addSelect('country', 'Țara:', $countries)
->setDefaultValue('RO');
Array-ul de elemente oferite îl transmitem ca al treilea parametru sau prin metoda setItems()
. Elementele pot fi
și un array bidimensional:
$countries = [
'Europe' => [
'RO' => 'România',
'MD' => 'Moldova',
'GB' => 'Marea Britanie',
],
'CA' => 'Canada',
'US' => 'SUA',
'?' => 'altă',
];
La select box-uri, adesea primul element are o semnificație specială, servește ca îndemn la acțiune. Pentru adăugarea
unui astfel de element servește metoda setPrompt()
.
$form->addSelect('country', 'Țara:', $countries)
->setPrompt('Alegeți țara');
Folosind setDisabled(['RO', 'MD'])
se pot dezactiva elemente individuale.
Elementul verifică automat că nu a avut loc o falsificare și că elementul selectat este într-adevăr unul dintre cele
oferite și nu a fost dezactivat. Prin metoda getRawValue()
se poate obține elementul trimis fără această
verificare importantă.
La setarea elementului selectat implicit, verifică de asemenea că acesta este unul dintre cele oferite, altfel aruncă
o excepție. Această verificare poate fi dezactivată folosind checkDefaultValue(false)
.
addMultiSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): MultiSelectBox
Adaugă un select box pentru selectarea mai multor elemente (clasa MultiSelectBox). Returnează un array al
cheilor elementelor selectate. Metoda getSelectedItems()
returnează valorile în loc de chei.
$form->addMultiSelect('countries', 'Țări:', $countries);
Array-ul de elemente oferite îl transmitem ca al treilea parametru sau prin metoda setItems()
. Elementele pot fi
și un array bidimensional.
Folosind setDisabled(['RO', 'MD'])
se pot dezactiva elemente individuale.
Elementul verifică automat că nu a avut loc o falsificare și că elementele selectate sunt într-adevăr unele dintre cele
oferite și nu au fost dezactivate. Prin metoda getRawValue()
se pot obține elementele trimise fără această
verificare importantă.
La setarea elementelor selectate implicit, verifică de asemenea că acestea sunt unele dintre cele oferite, altfel aruncă
o excepție. Această verificare poate fi dezactivată folosind checkDefaultValue(false)
.
addUpload (string|int $name, $label=null): UploadControl
Adaugă un câmp pentru încărcarea fișierului (clasa UploadControl). Returnează un obiect FileUpload, chiar și în cazul în care utilizatorul nu a trimis
niciun fișier, ceea ce se poate verifica prin metoda FileUpload::hasFile()
.
$form->addUpload('avatar', 'Avatar:')
->addRule($form::Image, 'Avatarul trebuie să fie JPEG, PNG, GIF, WebP sau AVIF.')
->addRule($form::MaxFileSize, 'Dimensiunea maximă este 1 MB.', 1024 * 1024);
Dacă fișierul nu reușește să se încarce corect, formularul nu este trimis cu succes și se afișează o eroare. Adică,
la trimiterea cu succes nu este nevoie să se verifice metoda FileUpload::isOk()
.
Nu aveți niciodată încredere în numele original al fișierului returnat de metoda FileUpload::getName()
,
clientul ar fi putut trimite un nume de fișier malițios cu intenția de a deteriora sau hackui aplicația dvs.
Regulile MimeType
și Image
detectează tipul solicitat pe baza semnăturii fișierului și nu
verifică integritatea acestuia. Dacă imaginea nu este deteriorată se poate verifica, de exemplu, prin încercarea de a o încărca.
addMultiUpload (string|int $name, $label=null): UploadControl
Adaugă un câmp pentru încărcarea mai multor fișiere simultan (clasa UploadControl). Returnează un array de
obiecte FileUpload. Metoda FileUpload::hasFile()
pentru fiecare dintre ele va returna true
.
$form->addMultiUpload('files', 'Fișiere:')
->addRule($form::MaxLength, 'Maxim se pot încărca %d fișiere', 10);
Dacă vreun fișier nu reușește să se încarce corect, formularul nu este trimis cu succes și se afișează o eroare.
Adică, la trimiterea cu succes nu este nevoie să se verifice metoda FileUpload::isOk()
.
Nu aveți niciodată încredere în numele originale ale fișiierelor returnate de metoda FileUpload::getName()
,
clientul ar fi putut trimite un nume de fișier malițios cu intenția de a deteriora sau hackui aplicația dvs.
Regulile MimeType
și Image
detectează tipul solicitat pe baza semnăturii fișierului și nu
verifică integritatea acestuia. Dacă imaginea nu este deteriorată se poate verifica, de exemplu, prin încercarea de a o încărca.
addDate (string|int $name, $label=null): DateTimeControl
Adaugă un câmp care permite utilizatorului să introducă ușor o dată formată din an, lună și zi (clasa DateTimeControl).
Ca valoare implicită acceptă fie obiecte care implementează interfața DateTimeInterface
, un șir cu timpul,
fie un număr reprezentând timestamp UNIX. Același lucru este valabil și pentru argumentele regulilor Min
,
Max
sau Range
, care definesc data minimă și maximă permisă.
$form->addDate('date', 'Data:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'Data trebuie să fie cu cel puțin o lună în urmă.', new DateTime('-1 month'));
Standard returnează un obiect DateTimeImmutable
, prin metoda setFormat()
puteți specifica formatul text sau timestamp:
$form->addDate('date', 'Data:')
->setFormat('Y-m-d');
addTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl
Adaugă un câmp care permite utilizatorului să introducă ușor un timp format din ore, minute și opțional secunde (clasa DateTimeControl).
Ca valoare implicită acceptă fie obiecte care implementează interfața DateTimeInterface
, un șir cu timpul,
fie un număr reprezentând timestamp UNIX. Din aceste intrări este utilizată doar informația de timp, data este ignorată.
Același lucru este valabil și pentru argumentele regulilor Min
, Max
sau Range
, care
definesc timpul minim și maxim permis. Dacă valoarea minimă setată este mai mare decât cea maximă, se creează un interval
de timp care depășește miezul nopții.
$form->addTime('time', 'Ora:', withSeconds: true)
->addRule($form::Range, 'Ora trebuie să fie în intervalul de la %d la %d.', ['12:30', '13:30']);
Standard returnează un obiect DateTimeImmutable
(cu data 1 ianuarie anul 1), prin metoda
setFormat()
puteți specifica formatul text:
$form->addTime('time', 'Ora:')
->setFormat('H:i');
addDateTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl
Adaugă un câmp care permite utilizatorului să introducă ușor data și ora formate din an, lună, zi, ore, minute și opțional secunde (clasa DateTimeControl).
Ca valoare implicită acceptă fie obiecte care implementează interfața DateTimeInterface
, un șir cu timpul,
fie un număr reprezentând timestamp UNIX. Același lucru este valabil și pentru argumentele regulilor Min
,
Max
sau Range
, care definesc data minimă și maximă permisă.
$form->addDateTime('datetime', 'Data și ora:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'Data trebuie să fie cu cel puțin o lună în urmă.', new DateTime('-1 month'));
Standard returnează un obiect DateTimeImmutable
, prin metoda setFormat()
puteți specifica formatul text sau timestamp:
$form->addDateTime('datetime')
->setFormat(DateTimeControl::FormatTimestamp);
addColor (string|int $name, $label=null): ColorPicker
Adaugă un câmp pentru selectarea culorii (clasa ColorPicker). Culoarea este un șir în
formatul #rrggbb
. Dacă utilizatorul nu face nicio selecție, se returnează culoarea neagră
#000000
.
$form->addColor('color', 'Culoare:')
->setDefaultValue('#3C8ED7');
addHidden (string|int $name, ?string $default=null): HiddenField
Adaugă un câmp ascuns (clasa HiddenField).
$form->addHidden('userid');
Folosind setNullable()
se poate seta să returneze null
în loc de șir gol. Modificarea valorii
trimise este posibilă prin addFilter().
Deși elementul este ascuns, este important să rețineți că valoarea poate fi totuși modificată sau falsificată de un atacator. Verificați și validați întotdeauna cu atenție toate valorile primite pe partea serverului pentru a preveni riscurile de securitate asociate cu manipularea datelor.
addSubmit (string|int $name, $caption=null): SubmitButton
Adaugă un buton de trimitere (clasa SubmitButton).
$form->addSubmit('submit', 'Trimite');
În formular este posibil să aveți și mai multe butoane de trimitere:
$form->addSubmit('register', 'Înregistrează-te');
$form->addSubmit('cancel', 'Anulează');
Pentru a afla pe care dintre ele s-a făcut clic, utilizați:
if ($form['register']->isSubmittedBy()) {
// ...
}
Dacă nu doriți să validați întregul formular la apăsarea butonului (de exemplu, la butoanele Anulează sau Previzualizare), utilizați setValidationScope().
addButton (string|int $name, $caption): Button
Adaugă un buton (clasa Button), care nu are funcție de trimitere. Poate fi deci utilizat pentru o altă funcție, de ex. apelarea unei funcții JavaScript la clic.
$form->addButton('raise', 'Mărește salariul')
->setHtmlAttribute('onclick', 'raiseSalary()');
addImageButton (string|int $name, ?string $src=null, ?string $alt=null): ImageButton
Adaugă un buton de trimitere sub formă de imagine (clasa ImageButton).
$form->addImageButton('submit', '/path/to/image');
La utilizarea mai multor butoane de trimitere se poate afla pe care s-a făcut clic folosind
$form['submit']->isSubmittedBy()
.
addContainer (string|int $name): Container
Adaugă un subformular (clasa Container), adică un
container, în care se pot adăuga alte elemente în același mod în care le adăugăm în formular. Funcționează și metodele
setDefaults()
sau getValues()
.
$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Numele dvs.:');
$sub1->addEmail('email', 'Email:');
$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Numele dvs.:');
$sub2->addEmail('email', 'Email:');
Datele trimise le returnează apoi ca o structură multidimensională:
[
'first' => [
'name' => /* ... */,
'email' => /* ... */,
],
'second' => [
'name' => /* ... */,
'email' => /* ... */,
],
]
Prezentare generală a setărilor
La toate elementele putem apela următoarele metode (prezentare completă în documentația API):
setDefaultValue($value) |
setează valoarea implicită |
getValue() |
obține valoarea curentă |
setOmitted() |
Omiterea valorii |
setDisabled() |
Dezactivarea elementelor |
Randare:
setCaption($caption) |
schimbă eticheta elementului |
setTranslator($translator) |
setează traducătorul |
setHtmlAttribute($name, $value) |
setează atributul HTML al elementului |
setHtmlId($id) |
setează atributul HTML id |
setHtmlType($type) |
setează atributul HTML type |
setHtmlName($name) |
setează atributul HTML name |
setOption($key, $value) |
opțiuni de randare |
Validare:
setRequired() |
element obligatoriu |
addRule() |
setarea regulii de validare |
addCondition() , addConditionOn() |
setează condiția de validare |
addError($message) |
transmiterea mesajului de eroare |
La elementele addText()
, addPassword()
, addTextArea()
, addEmail()
,
addInteger()
se pot apela următoarele metode:
setNullable() |
setează dacă getValue() va returna null în loc de șir gol |
setEmptyValue($value) |
setează o valoare specială care este considerată șir gol |
setMaxLength($length) |
setează numărul maxim de caractere permise |
addFilter($filter) |
modificarea intrării |
Omiterea valorii
Dacă valoarea completată de utilizator nu ne interesează, o putem omite din rezultatul metodei
$form->getValues()
sau din datele transmise handlerilor folosind setOmitted()
. Acest lucru este util
pentru diverse parole de verificare, elemente antispam etc.
$form->addPassword('passwordVerify', 'Parola pentru verificare:')
->setRequired('Vă rugăm introduceți parola încă o dată pentru verificare')
->addRule($form::Equal, 'Parolele nu se potrivesc', $form['password'])
->setOmitted();
Dezactivarea elementelor
Elementele pot fi dezactivate folosind setDisabled()
. Un astfel de element nu poate fi editat de utilizator.
$form->addText('username', 'Nume utilizator:')
->setDisabled();
Elementele dezactivate nu sunt trimise deloc de browser către server, deci nu le veți găsi nici în datele returnate de
funcția $form->getValues()
. Dacă însă setați setOmitted(false)
, Nette va include în aceste date
valoarea lor implicită.
La apelarea setDisabled()
, din motive de securitate se șterge valoarea elementului. Dacă setați
o valoare implicită, este necesar să o faceți după dezactivarea acestuia:
$form->addText('username', 'Nume utilizator:')
->setDisabled()
->setDefaultValue($userName);
O alternativă la elementele dezactivate sunt elementele cu atributul HTML readonly
, pe care browserul le trimite
la server. Deși elementul este doar pentru citire, este important să rețineți că valoarea sa poate fi totuși
modificată sau falsificată de un atacator.
Elemente personalizate
Pe lângă gama largă de elemente de formular încorporate, puteți adăuga elemente personalizate în formular în acest mod:
$form->addComponent(new DateInput('Data:'), 'date');
// sintaxă alternativă: $form['date'] = new DateInput('Data:');
Formularul este un descendent al clasei Container, iar elementele individuale sunt descendenți ai Component.
Există o modalitate de a defini noi metode ale formularului care servesc la adăugarea elementelor personalizate (de ex.
$form->addZip()
). Este vorba de așa-numitele extension methods. Dezavantajul este că sugestiile din editori nu
vor funcționa pentru ele.
use Nette\Forms\Container;
// adăugăm metoda 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, 'Cel puțin 5 cifre', '[0-9]{5}');
});
// utilizare
$form->addZip('zip', 'Cod poștal:');
Elemente de nivel scăzut
Se pot utiliza și elemente pe care le scriem doar în șablon și nu le adăugăm în formular prin una dintre metodele
$form->addXyz()
. De exemplu, când afișăm înregistrări din baza de date și nu știm dinainte câte vor fi și
ce ID-uri vor avea, și dorim să afișăm la fiecare rând un checkbox sau un radio button, este suficient să îl codăm în
șablon:
{foreach $items as $item}
<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}
Și după trimitere aflăm valoarea:
$data = $form->getHttpData($form::DataText, 'sel[]');
$data = $form->getHttpData($form::DataText | $form::DataKeys, 'sel[]');
unde primul parametru este tipul elementului (DataFile
pentru type=file
, DataLine
pentru
intrări pe o singură linie precum text
, password
, email
etc. și DataText
pentru toate celelalte) iar al doilea parametru sel[]
corespunde atributului HTML name. Tipul elementului îl putem
combina cu valoarea DataKeys
, care păstrează cheile elementelor. Acest lucru este util în special pentru
select
, radioList
și checkboxList
.
Esențial este că getHttpData()
returnează o valoare sanitarizată, în acest caz va fi întotdeauna un array
de șiruri UTF-8 valide, indiferent ce ar încerca un atacator să strecoare serverului. Este o analogie a lucrului direct cu
$_POST
sau $_GET
, dar cu diferența esențială că returnează întotdeauna date curate, așa cum
sunteți obișnuiți la elementele standard ale formularelor Nette.