Formularelemente
Übersicht der Standard-Formularelemente.
addText(string $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput
Fügt ein einzeiliges Textfeld hinzu (Klasse TextInput). Füllt der Benutzer das Feld nicht aus,
gibt es einen leeren String '' zurück; mit setNullable() sorgen Sie dafür, dass es stattdessen
null zurückgibt.
$form->addText('name', 'Name:')
->setRequired()
->setNullable();
Es validiert automatisch UTF-8, schneidet Leerraum am Anfang und Ende ab und entfernt Zeilenumbrüche, die ein Angreifer senden könnte.
Die maximale Länge lässt sich mit setMaxLength() begrenzen. Die Methode addFilter() erlaubt es, den vom Benutzer eingegebenen Wert zu verändern.
Mit setHtmlType() können Sie das optische Erscheinungsbild des Textfelds auf Typen wie search,
tel oder url ändern, wie sie die Spezifikation festlegt. Denken Sie daran, dass
die Änderung des Typs rein optisch ist und die Validierung nicht ersetzt. Beim Typ url empfiehlt es sich, eine
passende Validierungsregel für URLs zu ergänzen.
Für andere Typen von Eingabefeldern wie number, range, email,
date, datetime-local, time und color verwenden Sie die spezialisierten
Methoden addInteger(), addFloat(), addEmail(), addDate(), addTime(), addDateTime() und addColor(), die eine Validierung auf der Serverseite
mitbringen. Die Typen month und week unterstützen noch nicht alle Browser vollständig.
Für das Element lässt sich ein „leerer Wert“ setzen. Er verhält sich ein wenig wie ein Standardwert, aber wenn der
Benutzer ihn nicht ändert, gibt das Element einen leeren String oder null zurück.
$form->addText('phone', 'Telefon:')
->setHtmlType('tel')
->setEmptyValue('+420');
addTextArea(string $name, $label=null): TextArea
Fügt ein mehrzeiliges Textfeld hinzu (Klasse TextArea). Füllt der Benutzer das Feld nicht aus,
gibt es einen leeren String '' zurück; mit setNullable() sorgen Sie dafür, dass es stattdessen
null zurückgibt.
$form->addTextArea('note', 'Notiz:')
->addRule($form::MaxLength, 'Ihre Notiz ist viel zu lang', 10000);
Es validiert automatisch UTF-8 und vereinheitlicht die Zeilenenden zu \n. Anders als beim einzeiligen Feld wird
kein Leerraum abgeschnitten.
Die maximale Länge lässt sich mit setMaxLength() begrenzen. Die Methode addFilter() erlaubt es, den vom Benutzer eingegebenen Wert zu verändern. Einen
leeren Wert setzen Sie über setEmptyValue().
addInteger(string $name, $label=null): TextInput
Fügt ein Feld zur Eingabe einer ganzen Zahl hinzu (Klasse TextInput). Gibt entweder eine ganze Zahl zurück
oder null, wenn der Benutzer nichts eingibt.
$form->addInteger('year', 'Jahr:')
->addRule($form::Range, 'Das Jahr muss zwischen %d und %d liegen.', [1900, 2023]);
Das Element wird als <input type="number"> gerendert. Über die Methode setHtmlType() können
Sie den Typ auf range ändern, um es als Schieberegler darzustellen, oder auf text, wenn Sie ein
gewöhnliches Textfeld ohne das besondere Verhalten des Typs number vorziehen.
addFloat(string $name, $label=null): TextInput
Fügt ein Feld zur Eingabe einer Fließkommazahl hinzu (Klasse TextInput). Gibt entweder eine Fließkommazahl
zurück oder null, wenn der Benutzer nichts eingibt.
$form->addFloat('level', 'Stufe:')
->setDefaultValue(0)
->addRule($form::Range, 'Die Stufe muss zwischen %d und %d liegen.', [0, 100]);
Das Element wird als <input type="number"> gerendert. Über die Methode setHtmlType() können
Sie den Typ auf range ändern, um es als Schieberegler darzustellen, oder auf text, wenn Sie ein
gewöhnliches Textfeld ohne das besondere Verhalten des Typs number vorziehen.
Nette und der Browser Chrome akzeptieren als Dezimaltrennzeichen sowohl das Komma als auch den Punkt. Damit das auch in Firefox
funktioniert, empfiehlt es sich, das Attribut lang entweder für das jeweilige Element oder für die ganze Seite zu
setzen, zum Beispiel <html lang="de">.
addEmail(string $name, $label=null, int $maxLength=255): TextInput
Fügt ein Feld zur Eingabe einer E-Mail-Adresse hinzu (Klasse TextInput). Füllt der Benutzer das Feld nicht aus,
gibt es einen leeren String '' zurück; mit setNullable() sorgen Sie dafür, dass es stattdessen
null zurückgibt.
$form->addEmail('email', 'E-Mail:');
Es prüft, ob der Wert eine gültige E-Mail-Adresse ist. Ob die Domain tatsächlich existiert, wird nicht geprüft, sondern nur die Syntax. Es validiert automatisch UTF-8 und schneidet Leerraum am Anfang und Ende ab.
Die maximale Länge lässt sich mit setMaxLength() begrenzen. Die Methode addFilter() erlaubt es, den vom Benutzer eingegebenen Wert zu verändern. Einen
leeren Wert setzen Sie über setEmptyValue().
addPassword(string $name, $label=null, ?int $cols=null, ?int $maxLength=null): TextInput
Fügt ein Feld zur Eingabe eines Passworts hinzu (Klasse TextInput).
$form->addPassword('password', 'Passwort:')
->setRequired()
->addRule($form::MinLength, 'Das Passwort muss mindestens %d Zeichen lang sein', 8)
->addRule($form::Pattern, 'Das Passwort muss eine Ziffer enthalten', '.*[0-9].*');
Wird das Formular erneut angezeigt, ist das Feld leer. Es validiert automatisch UTF-8, schneidet Leerraum am Anfang und Ende ab und entfernt Zeilenumbrüche, die ein Angreifer senden könnte.
addCheckbox(string $name, $caption=null): Checkbox
Fügt eine Checkbox hinzu (Klasse Checkbox).
Gibt true oder false zurück, je nachdem, ob sie angehakt ist.
$form->addCheckbox('agree', 'Ich stimme den Bedingungen zu')
->setRequired('Sie müssen unseren Bedingungen zustimmen');
addCheckboxList(string $name, $label=null, ?array $items=null): CheckboxList
Fügt eine Liste von Checkboxen zur Auswahl mehrerer Elemente hinzu (Klasse CheckboxList). Gibt ein Array der Schlüssel der
ausgewählten Elemente zurück. Die Methode getSelectedItems() gibt die ausgewählten Elemente als
Schlüssel-Wert-Paare zurück.
$form->addCheckboxList('colors', 'Farben:', [
'r' => 'rot',
'g' => 'grün',
'b' => 'blau',
]);
Das Array der angebotenen Elemente übergeben Sie als dritten Parameter oder über die Methode setItems().
Übergeben Sie setItems() als zweites Argument false, werden die Werte zugleich als Schlüssel
verwendet.
Mit setDisabled(['r', 'g']) deaktivieren Sie einzelne Elemente.
Das Element prüft automatisch, dass keine Fälschung stattgefunden hat und dass die ausgewählten Elemente tatsächlich zu den
angebotenen gehören und nicht deaktiviert waren. Über die Methode getRawValue() lassen sich die gesendeten Elemente
ohne diese wichtige Prüfung holen.
Beim Setzen der standardmäßig ausgewählten Elemente wird ebenfalls geprüft, dass sie zu den angebotenen gehören, sonst
wirft es eine Exception. Diese Prüfung lässt sich mit checkDefaultValue(false) abschalten.
Wenn Sie das Formular mit der Methode GET absenden, können Sie eine kompaktere Art der Datenübertragung wählen,
die Platz im Query-String spart. Sie aktivieren sie, indem Sie am Formular ein HTML-Attribut setzen:
$form->setHtmlAttribute('data-nette-compact');
addRadioList(string $name, $label=null, ?array $items=null): RadioList
Fügt Radiobuttons hinzu (Klasse RadioList).
Gibt den Schlüssel des ausgewählten Elements zurück oder null, wenn der Benutzer nichts ausgewählt hat. Die
Methode getSelectedItem() gibt statt des Schlüssels den Wert zurück.
$sex = [
'm' => 'männlich',
'f' => 'weiblich',
'o' => 'anderes',
];
$form->addRadioList('gender', 'Geschlecht:', $sex);
Das Array der angebotenen Elemente übergeben Sie als dritten Parameter oder über die Methode setItems().
Mit setDisabled(['m']) deaktivieren Sie einzelne Elemente.
Das Element prüft automatisch, dass keine Fälschung stattgefunden hat und dass das ausgewählte Element tatsächlich zu den
angebotenen gehört und nicht deaktiviert war. Über die Methode getRawValue() lässt sich das gesendete Element ohne
diese wichtige Prüfung holen.
Beim Setzen des standardmäßig ausgewählten Elements wird ebenfalls geprüft, dass es zu den angebotenen gehört, sonst wirft
es eine Exception. Diese Prüfung lässt sich mit checkDefaultValue(false) abschalten.
addSelect(string $name, $label=null, ?array $items=null, ?int $size=null): SelectBox
Fügt eine Select-Box hinzu (Klasse SelectBox). Gibt den Schlüssel des ausgewählten
Elements zurück oder null, wenn der Benutzer nichts ausgewählt hat. Die Methode getSelectedItem() gibt
statt des Schlüssels den Wert zurück.
$countries = [
'CZ' => 'Tschechien',
'SK' => 'Slowakei',
'GB' => 'Großbritannien',
];
$form->addSelect('country', 'Land:', $countries)
->setDefaultValue('SK');
Das Array der angebotenen Elemente übergeben Sie als dritten Parameter oder über die Methode setItems(). Die
Elemente können auch ein zweidimensionales Array sein (das Optgroups darstellt):
$countries = [
'Europe' => [
'CZ' => 'Tschechien',
'SK' => 'Slowakei',
'GB' => 'Großbritannien',
],
'CA' => 'Kanada',
'US' => 'USA',
'?' => 'anderes',
];
In Select-Boxen hat das erste Element oft eine besondere Bedeutung und dient als Aufforderung zum Handeln. Über die Methode
setPrompt() fügen Sie ein solches Element hinzu.
$form->addSelect('country', 'Land:', $countries)
->setPrompt('Wählen Sie ein Land');
Mit setDisabled(['CZ', 'SK']) deaktivieren Sie einzelne Elemente.
Das Element prüft automatisch, dass keine Fälschung stattgefunden hat und dass das ausgewählte Element tatsächlich zu den
angebotenen gehört und nicht deaktiviert war. Über die Methode getRawValue() lässt sich das gesendete Element ohne
diese wichtige Prüfung holen.
Beim Setzen des standardmäßig ausgewählten Elements wird ebenfalls geprüft, dass es zu den angebotenen gehört, sonst wirft
es eine Exception. Diese Prüfung lässt sich mit checkDefaultValue(false) abschalten.
addMultiSelect(string $name, $label=null, ?array $items=null, ?int $size=null): MultiSelectBox
Fügt eine Select-Box zur Auswahl mehrerer Elemente hinzu (Klasse MultiSelectBox). Gibt ein Array der Schlüssel
der ausgewählten Elemente zurück. Die Methode getSelectedItems() gibt die ausgewählten Elemente als
Schlüssel-Wert-Paare zurück.
$form->addMultiSelect('countries', 'Länder:', $countries);
Das Array der angebotenen Elemente übergeben Sie als dritten Parameter oder über die Methode setItems(). Die
Elemente können auch ein zweidimensionales Array sein.
Mit setDisabled(['CZ', 'SK']) deaktivieren Sie einzelne Elemente.
Das Element prüft automatisch, dass keine Fälschung stattgefunden hat und dass die ausgewählten Elemente tatsächlich zu den
angebotenen gehören und nicht deaktiviert waren. Über die Methode getRawValue() lassen sich die gesendeten Elemente
ohne diese wichtige Prüfung holen.
Beim Setzen der standardmäßig ausgewählten Elemente wird ebenfalls geprüft, dass sie zu den angebotenen gehören, sonst
wirft es eine Exception. Diese Prüfung lässt sich mit checkDefaultValue(false) abschalten.
addUpload(string $name, $label=null): UploadControl
Fügt ein Feld zum Hochladen einer Datei hinzu (Klasse UploadControl). Gibt ein Objekt FileUpload zurück, auch wenn der Benutzer keine Datei hochgeladen hat, was sich über die
Methode FileUpload::hasFile() prüfen lässt. Mit setNullable() sorgen Sie dafür, dass das Element
null statt eines FileUpload-Objekts zurückgibt, wenn keine Datei hochgeladen wurde.
$form->addUpload('avatar', 'Avatar:')
->addRule($form::Image, 'Der Avatar muss JPEG, PNG, GIF, WebP oder AVIF sein.')
->addRule($form::MaxFileSize, 'Die maximale Größe beträgt 1 MB.', 1024 * 1024);
Lässt sich die Datei nicht korrekt hochladen, wird das Formular nicht erfolgreich abgesendet und ein Fehler angezeigt. Nach
erfolgreichem Absenden muss die Methode FileUpload::isOk() also nicht geprüft werden.
Vertrauen Sie niemals dem ursprünglichen Dateinamen, den die Methode FileUpload::getName() zurückgibt; der
Client könnte einen bösartigen Dateinamen gesendet haben, um Ihre Anwendung zu beschädigen oder zu kapern.
Die Regeln MimeType und Image erkennen den verlangten Typ anhand der Signatur der Datei und prüfen
ihre Unversehrtheit nicht. Ob ein Bild beschädigt ist, lässt sich zum Beispiel durch den Versuch feststellen, es zu laden.
addMultiUpload(string $name, $label=null): UploadControl
Fügt ein Feld zum Hochladen mehrerer Dateien auf einmal hinzu (Klasse UploadControl). Gibt ein Array von FileUpload-Objekten zurück. Die Methode FileUpload::hasFile() gibt für jedes von
ihnen true zurück.
$form->addMultiUpload('files', 'Dateien:')
->addRule($form::MaxLength, 'Es lassen sich höchstens %d Dateien hochladen.', 10);
Lässt sich eine der Dateien nicht korrekt hochladen, wird das Formular nicht erfolgreich abgesendet und ein Fehler angezeigt.
Nach erfolgreichem Absenden muss die Methode FileUpload::isOk() also nicht für jede Datei geprüft werden.
Vertrauen Sie niemals den ursprünglichen Dateinamen, die die Methode FileUpload::getName() zurückgibt; der
Client könnte bösartige Dateinamen gesendet haben, um Ihre Anwendung zu beschädigen oder zu kapern.
Die Regeln MimeType und Image erkennen den verlangten Typ anhand der Signatur der Datei und prüfen
ihre Unversehrtheit nicht. Ob ein Bild beschädigt ist, lässt sich zum Beispiel durch den Versuch feststellen, es zu laden.
addDate(string $name, $label=null): DateTimeControl
Fügt ein Feld hinzu, in dem der Benutzer bequem ein Datum aus Jahr, Monat und Tag eingeben kann (Klasse DateTimeControl).
Als Standardwert akzeptiert es Objekte, die DateTimeInterface implementieren, einen String mit einer Zeitangabe
oder eine Zahl, die einen UNIX-Timestamp darstellt. Dasselbe gilt für die Argumente der Regeln Min, Max
und Range, die das früheste und späteste erlaubte Datum festlegen.
$form->addDate('date', 'Datum:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'Das Datum muss mindestens einen Monat alt sein.', new DateTime('-1 month'));
Standardmäßig gibt es ein DateTimeImmutable-Objekt zurück. Über die Methode setFormat() können
Sie ein Textformat oder einen
Timestamp angeben:
$form->addDate('date', 'Datum:')
->setFormat('Y-m-d');
addTime(string $name, $label=null, bool $withSeconds=false): DateTimeControl
Fügt ein Feld hinzu, in dem der Benutzer bequem eine Zeit aus Stunden, Minuten und wahlweise Sekunden eingeben kann (Klasse DateTimeControl).
Als Standardwert akzeptiert es Objekte, die DateTimeInterface implementieren, einen String mit einer Zeitangabe
oder eine Zahl, die einen UNIX-Timestamp darstellt. Aus diesen Eingaben wird nur die Zeitangabe verwendet, das Datum wird
ignoriert. Dasselbe gilt für die Argumente der Regeln Min, Max und Range, die die
früheste und späteste erlaubte Zeit festlegen. Ist der gesetzte Mindestwert höher als der Höchstwert, entsteht ein Zeitbereich
über Mitternacht hinweg.
$form->addTime('time', 'Zeit:', withSeconds: true)
->addRule($form::Range, 'Die Zeit muss zwischen %d und %d liegen.', ['12:30', '13:30']);
Standardmäßig gibt es ein DateTimeImmutable-Objekt zurück (mit dem Datum 1. Januar des Jahres 1). Über die
Methode setFormat() können Sie ein Textformat angeben:
$form->addTime('time', 'Zeit:')
->setFormat('H:i');
addDateTime(string $name, $label=null, bool $withSeconds=false): DateTimeControl
Fügt ein Feld hinzu, in dem der Benutzer bequem Datum und Zeit zugleich eingeben kann, also Jahr, Monat, Tag, Stunden, Minuten und wahlweise Sekunden (Klasse DateTimeControl).
Als Standardwert akzeptiert es Objekte, die DateTimeInterface implementieren, einen String mit einer Zeitangabe
oder eine Zahl, die einen UNIX-Timestamp darstellt. Dasselbe gilt für die Argumente der Regeln Min, Max
und Range, die das früheste und späteste erlaubte Datum samt Zeit festlegen.
$form->addDateTime('datetime', 'Datum und Zeit:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'Das Datum muss mindestens einen Monat alt sein.', new DateTime('-1 month'));
Standardmäßig gibt es ein DateTimeImmutable-Objekt zurück. Über die Methode setFormat() können
Sie ein Textformat oder einen
Timestamp angeben:
$form->addDateTime('datetime')
->setFormat(DateTimeControl::FormatTimestamp);
addColor(string $name, $label=null): ColorPicker
Fügt ein Feld zur Auswahl einer Farbe hinzu (Klasse ColorPicker). Die Farbe wird als String im Format
#rrggbb zurückgegeben. Trifft der Benutzer keine Auswahl, gibt es Schwarz #000000 zurück.
$form->addColor('color', 'Farbe:')
->setDefaultValue('#3C8ED7');
addHidden(string $name, mixed $default=null): HiddenField
Fügt ein verstecktes Feld hinzu (Klasse HiddenField).
$form->addHidden('userid');
Mit setNullable() sorgen Sie dafür, dass es null statt eines leeren Strings zurückgibt. Die Methode
addFilter() erlaubt es, den gesendeten Wert zu verändern.
Auch wenn das Element versteckt ist, muss Ihnen klar sein, dass sich sein Wert von einem Angreifer trotzdem verändern oder fälschen lässt. Prüfen und validieren Sie alle empfangenen Werte auf der Serverseite immer gründlich, um Sicherheitsrisiken durch Manipulation der Daten zu vermeiden.
addSubmit(string $name, $caption=null): SubmitButton
Fügt einen Absende-Button hinzu (Klasse SubmitButton).
$form->addSubmit('submit', 'Absenden');
Den Handler können Sie dem Button als dritten Parameter $onSubmit direkt übergeben, statt
ihn an das Event onClick zu hängen:
$form->addSubmit('submit', 'Absenden', function (SubmitButton $button, $data): void {
// ...
});
Ein Formular kann mehr als einen Absende-Button haben:
$form->addSubmit('register', 'Registrieren');
$form->addSubmit('cancel', 'Abbrechen');
Um festzustellen, welcher davon gedrückt wurde, verwenden Sie:
if ($form['register']->isSubmittedBy()) {
// ...
}
Wenn Sie beim Drücken eines Buttons nicht das gesamte Formular validieren wollen (etwa bei den Buttons Abbrechen oder Vorschau), verwenden Sie setValidationScope().
addButton(string $name, $caption=null): Button
Fügt einen Button hinzu (Klasse Button), der keine Absendefunktion hat. Er lässt sich daher für andere Aufgaben nutzen, etwa um beim Klick eine JavaScript-Funktion aufzurufen.
$form->addButton('raise', 'Gehalt erhöhen')
->setHtmlAttribute('onclick', 'raiseSalary()');
addImageButton(string $name, ?string $src=null, ?string $alt=null): ImageButton
Fügt einen Absende-Button in Form eines Bildes hinzu (Klasse ImageButton).
$form->addImageButton('submit', '/path/to/image.png', 'Absenden');
Verwenden Sie mehrere Absende-Buttons, stellen Sie über $form['submit']->isSubmittedBy() fest, welcher davon
gedrückt wurde.
addContainer(string|int $name): Container
Fügt ein Unterformular hinzu (Klasse Container), also
einen Container, dem sich weitere Elemente auf dieselbe Weise hinzufügen lassen wie dem Formular. Methoden wie
setDefaults() oder getValues() funktionieren ebenfalls.
$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Ihr Name:');
$sub1->addEmail('email', 'E-Mail:');
$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Ihr Name:');
$sub2->addEmail('email', 'E-Mail:');
Die gesendeten Daten werden dann als mehrdimensionale Struktur zurückgegeben:
[
'first' => [
'name' => /* ... */,
'email' => /* ... */,
],
'second' => [
'name' => /* ... */,
'email' => /* ... */,
],
]
Übersicht der Einstellungen
Für alle Elemente können wir die folgenden Methoden aufrufen (eine vollständige Übersicht bietet die API-Dokumentation):
setDefaultValue($value) |
setzt den Standardwert |
getValue() |
holt den aktuellen Wert |
setOmitted() |
Ausgelassene Werte |
setDisabled() |
Elemente deaktivieren |
Rendering:
setCaption($caption) |
ändert das Label des Elements |
setTranslator($translator) |
setzt den Übersetzer |
setHtmlAttribute($name, $value) |
setzt ein HTML-Attribut des Elements |
setHtmlId($id) |
setzt das HTML-Attribut id |
setOption($key, $value) |
setzt die Optionen für das Rendering |
Validierung:
setRequired() |
macht das Element zum Pflichtfeld |
addRule() |
fügt eine Validierungsregel hinzu |
addCondition(), addConditionOn() |
setzt eine Validierungsbedingung |
addError($message) |
fügt eine Fehlermeldung hinzu |
Für die Elemente addText(), addPassword(), addTextArea(), addEmail(),
addInteger(), addFloat() lassen sich die folgenden Methoden aufrufen:
setNullable() |
legt fest, ob getValue() statt eines leeren Strings null zurückgibt |
setEmptyValue($value) |
setzt einen besonderen Wert, der als leerer String gilt |
setMaxLength($length) |
setzt die maximal erlaubte Anzahl von Zeichen |
addFilter($filter) |
verändert die Eingabe |
Ausgelassene Werte
Wenn uns der vom Benutzer eingegebene Wert nicht interessiert, können wir ihn mit setOmitted() aus dem Ergebnis
der Methode $form->getValues() und aus den Daten für die Handler ausschließen. Das ist bei Feldern zur
Bestätigung eines Passworts, bei Anti-Spam-Elementen und Ähnlichem nützlich.
$form->addPassword('passwordVerify', 'Passwort erneut:')
->setRequired('Geben Sie das Passwort zur Kontrolle erneut ein')
->addRule($form::Equal, 'Die Passwörter stimmen nicht überein', $form['password'])
->setOmitted();
Elemente deaktivieren
Elemente lassen sich mit setDisabled() deaktivieren. Ein deaktiviertes Element kann der Benutzer nicht
bearbeiten.
$form->addText('username', 'Benutzername:')
->setDisabled();
Deaktivierte Elemente sendet der Browser gar nicht erst an den Server, Sie finden sie also nicht in den Daten, die die Funktion
$form->getValues() zurückgibt. Setzen Sie jedoch setOmitted(false), nimmt Nette ihren Standardwert
in diese Daten auf.
Beim Aufruf von setDisabled() wird der Wert des Elements aus Sicherheitsgründen gelöscht. Wenn Sie einen
Standardwert setzen, müssen Sie das also nach dem Deaktivieren tun:
$form->addText('username', 'Benutzername:')
->setDisabled()
->setDefaultValue($userName);
Eine Alternative zu deaktivierten Elementen sind Elemente mit dem HTML-Attribut readonly, die der Browser an den
Server sendet. Auch wenn das Element nur lesbar ist, muss Ihnen klar sein, dass sich sein Wert von einem Angreifer trotzdem
verändern oder fälschen lässt.
Eigene Elemente
Neben der breiten Palette eingebauter Formularelemente können Sie dem Formular eigene Elemente hinzufügen:
$form->addComponent(new DateInput('Datum:'), 'date');
// alternative Schreibweise: $form['date'] = new DateInput('Datum:');
Wie sich ein solches Element schreiben lässt, samt Einlesen der gesendeten Daten, Validierung und Rendering, beschreibt ein eigenes Kapitel. Dort erfahren Sie auch etwas über Extension-Methoden, mit denen Sie sich eine
eigene Methode zum Hinzufügen wie $form->addZip() schreiben können.
Low-Level-Elemente
Sie können auch Elemente verwenden, die nur im Template stehen und dem Formular über keine der Methoden
$form->addXyz() hinzugefügt wurden. Wenn wir zum Beispiel Datensätze aus einer Datenbank auflisten und vorher
nicht wissen, wie viele es sein werden und welche IDs sie haben, und für jede Zeile eine Checkbox oder einen Radiobutton anzeigen
wollen, schreiben wir das einfach ins Template:
{foreach $items as $item}
<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}
Und nach dem Absenden holen wir den Wert:
$data = $form->getHttpData($form::DataText, 'sel[]');
$data = $form->getHttpData($form::DataText | $form::DataKeys, 'sel[]');
Der erste Parameter ist dabei der Typ des Elements (DataFile für type=file, DataLine
für einzeilige Eingaben wie text, password, email und so weiter, und DataText
für alle übrigen), der zweite Parameter sel[] entspricht dem HTML-Attribut name. Den Typ des Elements können wir
mit dem Wert DataKeys kombinieren, der die Schlüssel der Elemente erhält. Besonders nützlich ist das bei
select, radioList und checkboxList.
Entscheidend ist, dass getHttpData() einen bereinigten Wert zurückgibt. In diesem Fall wird es immer ein Array
gültiger UTF-8-Strings sein, ganz gleich, was ein Angreifer an den Server zu senden versucht. Das ist analog zur direkten Arbeit
mit $_POST oder $_GET, mit dem wesentlichen Unterschied, dass es immer saubere Daten zurückgibt, so wie
Sie es von den Standard-Formularelementen von Nette gewohnt sind.