Éléments de formulaire

Aperçu des éléments de formulaire standard.

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

Ajoute un champ de texte sur une seule ligne (classe TextInput). Si l'utilisateur ne remplit pas le champ, il renvoie une chaîne vide '', ou setNullable() peut être utilisé pour spécifier qu'il renvoie null.

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

Valide automatiquement l'UTF-8, supprime les espaces de début et de fin et supprime les sauts de ligne qu'un attaquant pourrait envoyer.

La longueur maximale peut être limitée à l'aide de setMaxLength(). La modification de la valeur saisie par l'utilisateur est possible avec addFilter().

Avec setHtmlType(), le caractère visuel du champ de texte peut être modifié en types tels que search, tel ou url, voir la spécification. N'oubliez pas que le changement de type est purement visuel et ne remplace pas la fonction de validation. Pour le type url, il est conseillé d'ajouter une règle de validation URL spécifique.

Pour d'autres types d'entrées, tels que number, range, email, date, datetime-local, time et color, utilisez des méthodes spécialisées comme addInteger, addFloat, addEmail addDate, addTime, addDateTime et addColor, qui assurent la validation côté serveur. Les types month et week ne sont pas encore entièrement pris en charge par tous les navigateurs.

Une valeur vide (empty-value) peut être définie pour l'élément, ce qui est similaire à une valeur par défaut, mais si l'utilisateur ne la modifie pas, l'élément renvoie une chaîne vide ou null.

$form->addText('phone', 'Téléphone :')
	->setHtmlType('tel')
	->setEmptyValue('+33');

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

Ajoute un champ pour la saisie de texte multiligne (classe TextArea). Si l'utilisateur ne remplit pas le champ, il renvoie une chaîne vide '', ou setNullable() peut être utilisé pour spécifier qu'il renvoie null.

$form->addTextArea('note', 'Note :')
	->addRule($form::MaxLength, 'La note est trop longue', 10000);

Valide automatiquement l'UTF-8 et normalise les séparateurs de ligne en \n. Contrairement au champ de saisie sur une seule ligne, aucun découpage des espaces n'est effectué.

La longueur maximale peut être limitée à l'aide de setMaxLength(). La modification de la valeur saisie par l'utilisateur est possible avec addFilter(). Une valeur vide peut être définie à l'aide de setEmptyValue().

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

Ajoute un champ pour la saisie d'un nombre entier (classe TextInput). Renvoie soit un entier, soit null si l'utilisateur ne saisit rien.

$form->addInteger('year', 'Année :')
	->addRule($form::Range, 'L\'année doit être comprise entre %d et %d.', [1900, 2023]);

L'élément est rendu comme <input type="number">. En utilisant la méthode setHtmlType(), le type peut être changé en range pour un affichage sous forme de curseur, ou en text si vous préférez un champ de texte standard sans le comportement spécial du type number.

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

Ajoute un champ pour la saisie d'un nombre décimal (classe TextInput). Renvoie soit un float, soit null si l'utilisateur ne saisit rien.

$form->addFloat('level', 'Niveau :')
	->setDefaultValue(0)
	->addRule($form::Range, 'Le niveau doit être compris entre %d et %d.', [0, 100]);

L'élément est rendu comme <input type="number">. En utilisant la méthode setHtmlType(), le type peut être changé en range pour un affichage sous forme de curseur, ou en text si vous préférez un champ de texte standard sans le comportement spécial du type number.

Nette et le navigateur Chrome acceptent à la fois la virgule et le point comme séparateurs décimaux. Pour que cette fonctionnalité soit également disponible dans Firefox, il est recommandé de définir l'attribut lang soit pour l'élément concerné, soit pour la page entière, par exemple <html lang="fr">.

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

Ajoute un champ pour la saisie d'une adresse e-mail (classe TextInput). Si l'utilisateur ne remplit pas le champ, il renvoie une chaîne vide '', ou setNullable() peut être utilisé pour spécifier qu'il renvoie null.

$form->addEmail('email', 'E-mail :');

Vérifie si la valeur est une adresse e-mail valide. Ne vérifie pas si le domaine existe réellement, vérifie uniquement la syntaxe. Valide automatiquement l'UTF-8, supprime les espaces de début et de fin.

La longueur maximale peut être limitée à l'aide de setMaxLength(). La modification de la valeur saisie par l'utilisateur est possible avec addFilter(). Une valeur vide peut être définie à l'aide de setEmptyValue().

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

Ajoute un champ pour la saisie d'un mot de passe (classe TextInput).

$form->addPassword('password', 'Mot de passe :')
	->setRequired()
	->addRule($form::MinLength, 'Le mot de passe doit comporter au moins %d caractères', 8)
	->addRule($form::Pattern, 'Doit contenir un chiffre', '.*[0-9].*');

Lors du réaffichage du formulaire, le champ sera vide. Valide automatiquement l'UTF-8, supprime les espaces de début et de fin et supprime les sauts de ligne qu'un attaquant pourrait envoyer.

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

Ajoute une case à cocher (classe Checkbox). Renvoie la valeur true ou false, selon qu'elle est cochée ou non.

$form->addCheckbox('agree', 'J\'accepte les conditions')
	->setRequired('Il est nécessaire d\'accepter les conditions');

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

Ajoute des cases à cocher pour sélectionner plusieurs éléments (classe CheckboxList). Renvoie un tableau des clés des éléments sélectionnés. La méthode getSelectedItems() renvoie les valeurs au lieu des clés.

$form->addCheckboxList('colors', 'Couleurs :', [
	'r' => 'rouge',
	'g' => 'vert',
	'b' => 'bleu',
]);

Le tableau des éléments proposés est passé comme troisième paramètre ou via la méthode setItems().

Avec setDisabled(['r', 'g']), il est possible de désactiver des éléments individuels.

L'élément vérifie automatiquement qu'il n'y a pas eu de falsification et que les éléments sélectionnés font bien partie de ceux proposés et n'ont pas été désactivés. La méthode getRawValue() permet d'obtenir les éléments envoyés sans ce contrôle important.

Lors de la définition des éléments sélectionnés par défaut, il vérifie également qu'il s'agit bien de l'un des éléments proposés, sinon il lève une exception. Ce contrôle peut être désactivé avec checkDefaultValue(false).

Si vous soumettez le formulaire avec la méthode GET, vous pouvez choisir un mode de transmission des données plus compact, ce qui économise la taille de la chaîne de requête. Il est activé en définissant l'attribut HTML du formulaire :

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

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

Ajoute des boutons radio (classe RadioList). Renvoie la clé de l'élément sélectionné, ou null si l'utilisateur n'a rien sélectionné. La méthode getSelectedItem() renvoie la valeur au lieu de la clé.

$sex = [
	'm' => 'homme',
	'f' => 'femme',
];
$form->addRadioList('gender', 'Sexe :', $sex);

Le tableau des éléments proposés est passé comme troisième paramètre ou via la méthode setItems().

Avec setDisabled(['m', 'f']), il est possible de désactiver des éléments individuels.

L'élément vérifie automatiquement qu'il n'y a pas eu de falsification et que l'élément sélectionné fait bien partie de ceux proposés et n'a pas été désactivé. La méthode getRawValue() permet d'obtenir l'élément envoyé sans ce contrôle important.

Lors de la définition de l'élément sélectionné par défaut, il vérifie également qu'il s'agit bien de l'un des éléments proposés, sinon il lève une exception. Ce contrôle peut être désactivé avec checkDefaultValue(false).

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

Ajoute une boîte de sélection (classe SelectBox). Renvoie la clé de l'élément sélectionné, ou null si l'utilisateur n'a rien sélectionné. La méthode getSelectedItem() renvoie la valeur au lieu de la clé.

$countries = [
	'FR' => 'France',
	'BE' => 'Belgique',
	'CH' => 'Suisse',
];

$form->addSelect('country', 'Pays :', $countries)
	->setDefaultValue('BE');

Le tableau des éléments proposés est passé comme troisième paramètre ou via la méthode setItems(). Les éléments peuvent également être un tableau à deux dimensions :

$countries = [
	'Europe' => [
		'FR' => 'France',
		'BE' => 'Belgique',
		'CH' => 'Suisse',
	],
	'CA' => 'Canada',
	'US' => 'USA',
	'?'  => 'autre',
];

Pour les boîtes de sélection, le premier élément a souvent une signification spéciale, servant d'invite à l'action. La méthode setPrompt() est utilisée pour ajouter un tel élément.

$form->addSelect('country', 'Pays :', $countries)
	->setPrompt('Choisissez un pays');

Avec setDisabled(['FR', 'BE']), il est possible de désactiver des éléments individuels.

L'élément vérifie automatiquement qu'il n'y a pas eu de falsification et que l'élément sélectionné fait bien partie de ceux proposés et n'a pas été désactivé. La méthode getRawValue() permet d'obtenir l'élément envoyé sans ce contrôle important.

Lors de la définition de l'élément sélectionné par défaut, il vérifie également qu'il s'agit bien de l'un des éléments proposés, sinon il lève une exception. Ce contrôle peut être désactivé avec checkDefaultValue(false).

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

Ajoute une boîte de sélection pour choisir plusieurs éléments (classe MultiSelectBox). Renvoie un tableau des clés des éléments sélectionnés. La méthode getSelectedItems() renvoie les valeurs au lieu des clés.

$form->addMultiSelect('countries', 'Pays :', $countries);

Le tableau des éléments proposés est passé comme troisième paramètre ou via la méthode setItems(). Les éléments peuvent également être un tableau à deux dimensions.

Avec setDisabled(['FR', 'BE']), il est possible de désactiver des éléments individuels.

L'élément vérifie automatiquement qu'il n'y a pas eu de falsification et que les éléments sélectionnés font bien partie de ceux proposés et n'ont pas été désactivés. La méthode getRawValue() permet d'obtenir les éléments envoyés sans ce contrôle important.

Lors de la définition des éléments sélectionnés par défaut, il vérifie également qu'il s'agit bien de l'un des éléments proposés, sinon il lève une exception. Ce contrôle peut être désactivé avec checkDefaultValue(false).

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

Ajoute un champ pour le téléchargement de fichier (classe UploadControl). Renvoie un objet FileUpload, même si l'utilisateur n'a envoyé aucun fichier, ce qui peut être vérifié avec la méthode FileUpload::hasFile().

$form->addUpload('avatar', 'Avatar :')
	->addRule($form::Image, 'L\'avatar doit être au format JPEG, PNG, GIF, WebP ou AVIF.')
	->addRule($form::MaxFileSize, 'La taille maximale est de 1 Mo.', 1024 * 1024);

Si le fichier ne parvient pas à être téléchargé correctement, le formulaire n'est pas soumis avec succès et une erreur s'affiche. C'est-à-dire qu'en cas de soumission réussie, il n'est pas nécessaire de vérifier la méthode FileUpload::isOk().

Ne faites jamais confiance au nom de fichier original renvoyé par la méthode FileUpload::getName(), le client pourrait avoir envoyé un nom de fichier malveillant dans le but d'endommager ou de pirater votre application.

Les règles MimeType et Image détectent le type requis en fonction de la signature du fichier et ne vérifient pas son intégrité. Pour savoir si une image n'est pas endommagée, on peut par exemple essayer de la charger.

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

Ajoute un champ pour le téléchargement de plusieurs fichiers à la fois (classe UploadControl). Renvoie un tableau d'objets FileUpload. La méthode FileUpload::hasFile() pour chacun d'eux renverra true.

$form->addMultiUpload('files', 'Fichiers :')
	->addRule($form::MaxLength, 'Vous pouvez télécharger au maximum %d fichiers', 10);

Si l'un des fichiers ne parvient pas à être téléchargé correctement, le formulaire n'est pas soumis avec succès et une erreur s'affiche. C'est-à-dire qu'en cas de soumission réussie, il n'est pas nécessaire de vérifier la méthode FileUpload::isOk().

Ne faites jamais confiance aux noms de fichiers originaux renvoyés par la méthode FileUpload::getName(), le client pourrait avoir envoyé un nom de fichier malveillant dans le but d'endommager ou de pirater votre application.

Les règles MimeType et Image détectent le type requis en fonction de la signature du fichier et ne vérifient pas son intégrité. Pour savoir si une image n'est pas endommagée, on peut par exemple essayer de la charger.

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

Ajoute un champ qui permet à l'utilisateur de saisir facilement une date composée de l'année, du mois et du jour (classe DateTimeControl).

Comme valeur par défaut, il accepte soit des objets implémentant l'interface DateTimeInterface, une chaîne de caractères avec l'heure, ou un nombre représentant un timestamp UNIX. Il en va de même pour les arguments des règles Min, Max ou Range, qui définissent la date minimale et maximale autorisée.

$form->addDate('date', 'Date :')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'La date doit dater d\'au moins un mois.', new DateTime('-1 month'));

Par défaut, il renvoie un objet DateTimeImmutable, avec la méthode setFormat(), vous pouvez spécifier un format texte ou un timestamp :

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

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

Ajoute un champ qui permet à l'utilisateur de saisir facilement une heure composée des heures, des minutes et éventuellement des secondes (classe DateTimeControl).

Comme valeur par défaut, il accepte soit des objets implémentant l'interface DateTimeInterface, une chaîne de caractères avec l'heure, ou un nombre représentant un timestamp UNIX. De ces entrées, seule l'information temporelle est utilisée, la date est ignorée. Il en va de même pour les arguments des règles Min, Max ou Range, qui définissent l'heure minimale et maximale autorisée. Si la valeur minimale définie est supérieure à la valeur maximale, une plage horaire dépassant minuit est créée.

$form->addTime('time', 'Heure :', withSeconds: true)
	->addRule($form::Range, 'L\'heure doit être comprise entre %d et %d.', ['12:30', '13:30']);

Par défaut, il renvoie un objet DateTimeImmutable (avec la date du 1er janvier de l'an 1), avec la méthode setFormat(), vous pouvez spécifier un format texte :

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

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

Ajoute un champ qui permet à l'utilisateur de saisir facilement une date et une heure composées de l'année, du mois, du jour, des heures, des minutes et éventuellement des secondes (classe DateTimeControl).

Comme valeur par défaut, il accepte soit des objets implémentant l'interface DateTimeInterface, une chaîne de caractères avec l'heure, ou un nombre représentant un timestamp UNIX. Il en va de même pour les arguments des règles Min, Max ou Range, qui définissent la date minimale et maximale autorisée.

$form->addDateTime('datetime', 'Date et heure :')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'La date doit dater d\'au moins un mois.', new DateTime('-1 month'));

Par défaut, il renvoie un objet DateTimeImmutable, avec la méthode setFormat(), vous pouvez spécifier un format texte ou un timestamp :

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

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

Ajoute un champ pour choisir une couleur (classe ColorPicker). La couleur est une chaîne de caractères au format #rrggbb. Si l'utilisateur ne fait pas de choix, la couleur noire #000000 est renvoyée.

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

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

Ajoute un champ caché (classe HiddenField).

$form->addHidden('userid');

Avec setNullable(), il est possible de définir qu'il renvoie null au lieu d'une chaîne vide. La modification de la valeur envoyée est possible avec addFilter().

Bien que l'élément soit caché, il est important de noter que la valeur peut toujours être modifiée ou falsifiée par un attaquant. Vérifiez et validez toujours soigneusement toutes les valeurs reçues côté serveur pour prévenir les risques de sécurité liés à la manipulation des données.

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

Ajoute un bouton de soumission (classe SubmitButton).

$form->addSubmit('submit', 'Envoyer');

Il est possible d'avoir plusieurs boutons de soumission dans un formulaire :

$form->addSubmit('register', 'S\'inscrire');
$form->addSubmit('cancel', 'Annuler');

Pour savoir sur lequel on a cliqué, utilisez :

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

Si vous ne souhaitez pas valider l'ensemble du formulaire lors de l'appui sur un bouton (par exemple, pour les boutons Annuler ou Aperçu), utilisez setValidationScope().

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

Ajoute un bouton (classe Button) qui n'a pas de fonction de soumission. Il peut donc être utilisé pour une autre fonction, par exemple appeler une fonction JavaScript lors d'un clic.

$form->addButton('raise', 'Augmenter le salaire')
	->setHtmlAttribute('onclick', 'raiseSalary()');

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

Ajoute un bouton de soumission sous forme d'image (classe ImageButton).

$form->addImageButton('submit', '/chemin/vers/image');

En utilisant plusieurs boutons de soumission, on peut savoir sur lequel on a cliqué à l'aide de $form['submit']->isSubmittedBy().

addContainer (string|int $name): Container

Ajoute un sous-formulaire (classe Container), ou conteneur, auquel on peut ajouter d'autres éléments de la même manière qu'on les ajoute au formulaire. Les méthodes setDefaults() ou getValues() fonctionnent également.

$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Votre nom :');
$sub1->addEmail('email', 'Email :');

$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Votre nom :');
$sub2->addEmail('email', 'Email :');

Les données envoyées sont alors renvoyées sous forme de structure multidimensionnelle :

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

Aperçu des paramètres

Pour tous les éléments, nous pouvons appeler les méthodes suivantes (aperçu complet dans la documentation API) :

setDefaultValue($value) définit la valeur par défaut
getValue() obtient la valeur actuelle
setOmitted() omission de valeur
setDisabled() désactivation des éléments

Rendu :

setCaption($caption) modifie l'étiquette de l'élément
setTranslator($translator) définit le traducteur
setHtmlAttribute($name, $value) définit l'attribut HTML de l'élément
setHtmlId($id) définit l'attribut HTML id
setHtmlType($type) définit l'attribut HTML type
setHtmlName($name) définit l'attribut HTML name
setOption($key, $value) options de rendu

Validation :

setRequired() élément requis
addRule() définit une règle de validation
addCondition(), addConditionOn() définit une condition de validation
addError($message) transmission du message d'erreur

Pour les éléments addText(), addPassword(), addTextArea(), addEmail(), addInteger(), les méthodes suivantes peuvent être appelées :

setNullable() définit si getValue() renvoie null au lieu d'une chaîne vide
setEmptyValue($value) définit une valeur spéciale considérée comme une chaîne vide
setMaxLength($length) définit le nombre maximal de caractères autorisés
addFilter($filter) modification de l'entrée

Omission de valeur

Si la valeur remplie par l'utilisateur ne nous intéresse pas, nous pouvons l'omettre du résultat de la méthode $form->getValues() ou des données transmises aux handlers à l'aide de setOmitted(). Ceci est utile pour divers mots de passe de contrôle, éléments anti-spam, etc.

$form->addPassword('passwordVerify', 'Mot de passe pour vérification :')
	->setRequired('Veuillez saisir à nouveau le mot de passe pour vérification')
	->addRule($form::Equal, 'Les mots de passe ne correspondent pas', $form['password'])
	->setOmitted();

Désactivation des éléments

Les éléments peuvent être désactivés à l'aide de setDisabled(). Un tel élément ne peut pas être modifié par l'utilisateur.

$form->addText('username', 'Nom d\'utilisateur :')
	->setDisabled();

Les éléments désactivés ne sont pas du tout envoyés par le navigateur au serveur, vous ne les trouverez donc pas dans les données renvoyées par la fonction $form->getValues(). Cependant, si vous définissez setOmitted(false), Nette inclura leur valeur par défaut dans ces données.

Lors de l'appel de setDisabled(), la valeur de l'élément est effacée pour des raisons de sécurité. Si vous définissez une valeur par défaut, il est donc nécessaire de le faire après sa désactivation :

$form->addText('username', 'Nom d\'utilisateur :')
	->setDisabled()
	->setDefaultValue($userName);

Une alternative aux éléments désactivés sont les éléments avec l'attribut HTML readonly, que le navigateur envoie au serveur. Bien que l'élément soit en lecture seule, il est important de noter que sa valeur peut toujours être modifiée ou falsifiée par un attaquant.

Éléments personnalisés

En plus de la large gamme d'éléments de formulaire intégrés, vous pouvez ajouter vos propres éléments personnalisés au formulaire de cette manière :

$form->addComponent(new DateInput('Date :'), 'date');
// syntaxe alternative : $form['date'] = new DateInput('Date :');

Le formulaire est un enfant de la classe Container et les éléments individuels sont des enfants de Component.

Il existe une manière de définir de nouvelles méthodes de formulaire servant à ajouter des éléments personnalisés (par ex. $form->addZip()). Il s'agit de ce qu'on appelle les méthodes d'extension. L'inconvénient est que l'autocomplétion dans les éditeurs ne fonctionnera pas pour elles.

use Nette\Forms\Container;

// ajoutons la méthode 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, 'Au moins 5 chiffres', '[0-9]{5}');
});

// utilisation
$form->addZip('zip', 'Code postal :');

Éléments de bas niveau

Il est également possible d'utiliser des éléments que nous écrivons uniquement dans le template et que nous n'ajoutons pas au formulaire avec l'une des méthodes $form->addXyz(). Par exemple, lorsque nous affichons des enregistrements d'une base de données et que nous ne savons pas à l'avance combien il y en aura ni quels seront leurs ID, et que nous voulons afficher une case à cocher ou un bouton radio pour chaque ligne, il suffit de le coder dans le template :

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

Et après soumission, nous obtenons la valeur :

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

où le premier paramètre est le type d'élément (DataFile pour type=file, DataLine pour les entrées sur une seule ligne comme text, password, email, etc. et DataText pour tous les autres) et le deuxième paramètre sel[] correspond à l'attribut HTML name. Nous pouvons combiner le type d'élément avec la valeur DataKeys, qui préserve les clés des éléments. Ceci est particulièrement utile pour select, radioList et checkboxList.

L'essentiel est que getHttpData() renvoie une valeur assainie, dans ce cas, ce sera toujours un tableau de chaînes UTF-8 valides, quoi que l'attaquant ait tenté de soumettre au serveur. C'est analogue au travail direct avec $_POST ou $_GET, mais avec la différence essentielle qu'il renvoie toujours des données propres, comme vous en avez l'habitude avec les éléments standard des formulaires Nette.

version: 4.0