Contrôles de formulaires
Aperçu des contrôles de formulaires intégrés.
addText (string|int $name, $label=null, $cols, ?int $maxLength=null): TextInput
Ajoute un champ de texte à une ligne (classe TextInput). Si l'utilisateur ne remplit pas le
champ, il renvoie une chaîne vide ''
, ou utilise setNullable()
pour le modifier et renvoyer
null
.
$form->addText('name', 'Name:')
->setRequired()
->setNullable();
Il valide automatiquement l'UTF-8, coupe les espaces à gauche et à droite et supprime les sauts de ligne qui pourraient être envoyés par un attaquant.
La longueur maximale peut être limitée en utilisant setMaxLength()
. La fonction addFilter() permet de modifier la valeur
saisie par l'utilisateur.
Vous pouvez modifier le caractère visuel d'un champ de texte en utilisant des types tels que search
,
tel
, ou url
en utilisant setHtmlType()
, comme indiqué dans la spécification. N'oubliez pas que le changement
de type n'est que visuel et qu'il n'exécute pas de fonctions de validation. Pour le type url
, il convient d'ajouter
une règle URL spécifique.
Pour les autres types d'entrée tels que number
, range
, email
,
date
, datetime-local
, time
, et color
, utilisez des méthodes spécialisées
telles que addInteger, addFloat, addEmail addDate, addTime, addDateTime, et addColor, qui assurent la validation côté serveur. Les types month
et week
ne
sont pas encore totalement pris en charge par tous les navigateurs.
La valeur dite vide peut être définie pour l'élément, qui ressemble à la valeur par défaut, mais si l'utilisateur ne
l'écrase pas, elle renvoie une chaîne vide ou null
.
$form->addText('phone', 'Phone:')
->setHtmlType('tel')
->setEmptyValue('+420');
addTextArea (string|int $name, $label=null): TextArea
Ajoute un champ de texte multiligne (classe TextArea). Si l'utilisateur ne remplit pas le
champ, il renvoie une chaîne vide ''
, ou utilise setNullable()
pour le modifier et renvoyer
null
.
$form->addTextArea('note', 'Note:')
->addRule($form::MaxLength, 'Your note is way too long', 10000);
Valide automatiquement l'UTF-8 et normalise les sauts de ligne à \n
. Contrairement à un champ de saisie à
ligne unique, il ne coupe pas les espaces blancs.
La longueur maximale peut être limitée en utilisant setMaxLength()
. La fonction addFilter() vous permet de modifier la valeur
saisie par l'utilisateur. Vous pouvez définir la valeur dite vide à l'aide de setEmptyValue()
.
addInteger (string|int $name, $label=null): TextInput
Ajoute un champ de saisie pour un nombre entier (classe TextInput). Renvoie soit un entier, soit
null
si l'utilisateur ne saisit rien.
$form->addInteger('year', 'Year:')
->addRule($form::Range, 'L'année doit être comprise entre %d et %d.', [1900, 2023 |1900, 2023]) ;
L'élément est rendu sous la forme <input type="numeric">
. En utilisant la méthode
setHtmlType()
, vous pouvez changer le type en range
pour l'afficher comme un curseur, ou en
text
si vous préférez un champ de texte standard sans le comportement spécial de numeric
.
addFloat (string|int $name, $label=null): TextInput
Adds a field for entering a decimal number (TextInput class). Returns either float or
null
, if the user does not specify anything.
$form->addFloat('niveau', 'Niveau:')
->setDefaultValue(0)
->addRule($form::Range, 'Le niveau doit être compris entre %d et %d.', [0, 100 |0, 100]) ;
L'élément est rendu sous la forme <input type="numeric">
. En utilisant la méthode
setHtmlType()
, vous pouvez changer le type en range
pour l'afficher comme un curseur, ou en
text
si vous préférez un champ de texte standard sans le comportement spécial de numeric
.
Nette et le navigateur Chrome acceptent à la fois une virgule et un point comme séparateurs décimaux. Pour que cette
fonctionnalité soit disponible dans Firefox, il est recommandé de définir l'attribut lang
soit pour l'élément
spécifique, soit pour la page entière, par exemple, <html lang="cs">
.
addEmail (string|int $name, $label=null, int $maxLength=255): TextInput
Ajoute un champ d'adresse électronique avec contrôle de validité (classe TextInput). Si l'utilisateur ne remplit pas le
champ, il renvoie une chaîne vide ''
, ou utilise setNullable()
pour le modifier et renvoyer
null
.
$form->addEmail('email', 'Email:');
Vérifie que la valeur est une adresse électronique valide. Il ne vérifie pas que le domaine existe réellement, seule la syntaxe est vérifiée. Valide automatiquement l'UTF-8, supprime les espaces à gauche et à droite.
La longueur maximale peut être limitée en utilisant setMaxLength()
. La fonction addFilter() vous permet de modifier la
valeur saisie par l'utilisateur. Vous pouvez définir la valeur dite vide à l'aide de setEmptyValue()
.
addPassword (string|int $name, $label=null, $cols, ?int $maxLength=null): TextInput
Ajoute un champ de mot de passe (classe TextInput).
$form->addPassword('password', 'Password:')
->setRequired()
->addRule($form::MinLength, 'Password has to be at least %d characters long', 8)
->addRule($form::Pattern, 'Password must contain a number', '.*[0-9].*');
Lorsque vous renvoyez le formulaire, l'entrée sera vide. Il valide automatiquement l'UTF-8, coupe les espaces à gauche et à droite et supprime les sauts de ligne qui pourraient être envoyés par un attaquant.
addCheckbox (string|int $name, $caption=null): Checkbox
Ajoute une case à cocher (classe Checkbox). Le champ renvoie soit
true
soit false
, selon qu'il est coché ou non.
$form->addCheckbox('agree', 'I agree with terms')
->setRequired('You must agree with our terms');
addCheckboxList (string|int $name, $label=null, ?array $items=null): CheckboxList
Ajoute une liste de cases à cocher pour sélectionner plusieurs éléments (classe CheckboxList). Renvoie le tableau des clés
des éléments sélectionnés. La méthode getSelectedItems()
renvoie des valeurs au lieu des clés.
$form->addCheckboxList('colors', 'Colors:', [
'r' => 'red',
'g' => 'green',
'b' => 'blue',
]);
Nous passons le tableau d'éléments comme troisième paramètre, ou par la méthode setItems()
.
Vous pouvez utiliser setDisabled(['r', 'g'])
pour 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
des éléments proposés et n'ont pas été désactivés. La méthode getRawValue()
peut être utilisée pour
récupérer les éléments proposés sans cette importante vérification.
Lorsque des valeurs par défaut sont définies, la méthode vérifie également qu'il s'agit de l'un des éléments proposés,
sinon elle lève une exception. Cette vérification peut être désactivée avec checkDefaultValue(false)
.
Si vous soumettez un formulaire à l'aide de la méthode GET
, vous pouvez choisir une méthode de transfert de
données plus compacte qui réduit la taille de la chaîne de requête. Cette option est activée 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
une valeur au lieu d'une clé.
$sex = [
'm' => 'male',
'f' => 'female',
];
$form->addRadioList('gender', 'Gender:', $sex);
Nous passons le tableau d'éléments comme troisième paramètre, ou par la méthode setItems()
.
Vous pouvez utiliser setDisabled(['m'])
pour 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é est bien l'un de ceux
proposés et n'a pas été désactivé. La méthode getRawValue()
peut être utilisée pour récupérer l'élément
soumis sans cette importante vérification.
Lorsque la valeur par défaut est définie, elle vérifie également qu'il s'agit de l'un des éléments proposés, sinon elle
lève une exception. Cette vérification peut être désactivée 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
une valeur au lieu d'une clé.
$countries = [
'CZ' => 'Czech republic',
'SK' => 'Slovakia',
'GB' => 'United Kingdom',
];
$form->addSelect('country', 'Country:', $countries)
->setDefaultValue('SK');
Nous passons le tableau d'éléments comme troisième paramètre, ou par la méthode setItems()
. Le tableau
d'éléments peut également être bidimensionnel :
$countries = [
'Europe' => [
'CZ' => 'Czech republic',
'SK' => 'Slovakia',
'GB' => 'United Kingdom',
],
'CA' => 'Canada',
'US' => 'USA',
'?' => 'other',
];
Pour les boîtes de sélection, le premier élément a souvent une signification particulière, il sert d'appel à l'action.
Utilisez la méthode setPrompt()
pour ajouter une telle entrée.
$form->addSelect('country', 'Country:', $countries)
->setPrompt('Pick a country');
Vous pouvez utiliser setDisabled(['CZ', 'SK'])
pour 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é est bien l'un de ceux
proposés et n'a pas été désactivé. La méthode getRawValue()
peut être utilisée pour récupérer l'élément
soumis sans cette importante vérification.
Lorsque la valeur par défaut est définie, elle vérifie également qu'il s'agit de l'un des éléments proposés, sinon elle
lève une exception. Cette vérification peut être désactivée avec checkDefaultValue(false)
.
addMultiSelect (string|int $name, $label=null, ?array $items=null, ?int $size=null): MultiSelectBox
Ajoute une boîte de sélection multichoix (classe MultiSelectBox). Renvoie le tableau des
clés des éléments sélectionnés. La méthode getSelectedItems()
renvoie des valeurs au lieu des clés.
$form->addMultiSelect('countries', 'Countries:', $countries);
Nous passons le tableau d'éléments comme troisième paramètre, ou par la méthode setItems()
. Le tableau
d'éléments peut également être bidimensionnel.
Vous pouvez utiliser setDisabled(['CZ', 'SK'])
pour 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
des éléments proposés et n'ont pas été désactivés. La méthode getRawValue()
peut être utilisée pour
récupérer les éléments proposés sans cette importante vérification.
Lorsque des valeurs par défaut sont définies, la méthode vérifie également qu'il s'agit de l'un des éléments proposés,
sinon elle lève une exception. Cette vérification peut être désactivée avec checkDefaultValue(false)
.
addUpload (string|int $name, $label=null): UploadControl
Ajoute un champ de téléchargement de fichier (classe UploadControl). Renvoie l'objet FileUpload, même si l'utilisateur n'a pas téléchargé de
fichier, ce qui peut être découvert par la méthode FileUpload::hasFile()
.
$form->addUpload('avatar', 'Avatar:')
->addRule($form::Image, 'Avatar must be JPEG, PNG, GIF or WebP')
->addRule($form::MaxFileSize, 'Maximum size is 1 MB', 1024 * 1024);
Si le fichier n'a pas été téléchargé correctement, le formulaire n'a pas été soumis avec succès et une erreur est
affichée. C'est-à-dire qu'il n'est pas nécessaire de vérifier la méthode FileUpload::isOk()
.
Ne vous fiez pas au nom de fichier original renvoyé par la méthode FileUpload::getName()
, un client pourrait
envoyer un nom de fichier malveillant dans le but de corrompre ou de pirater votre application.
Les règles MimeType
et Image
détectent le type de fichier ou d'image requis par sa signature.
L'intégrité de l'ensemble du fichier n'est pas vérifiée. Vous pouvez savoir si une image n'est pas corrompue, par exemple en
essayant de la charger.
addMultiUpload (string|int $name, $label=null): UploadControl
Ajoute un champ de téléchargement de fichiers multiples (classe UploadControl). Retourne un tableau d'objets
FileUpload. La méthode FileUpload::hasFile()
renverra true
pour chacun d'entre eux.
$form->addMultiUpload('files', 'Files:')
->addRule($form::MaxLength, 'A maximum of %d files can be uploaded', 10);
Si l'un des fichiers ne parvient pas à être téléchargé correctement, le formulaire n'a pas été soumis avec succès et
une erreur est affichée. C'est-à-dire qu'il n'est pas nécessaire de vérifier la méthode FileUpload::isOk()
.
Ne vous fiez pas aux noms de fichiers originaux renvoyés par la méthode FileUpload::getName()
, un client
pourrait envoyer un nom de fichier malveillant dans le but de corrompre ou de pirater votre application.
Les règles MimeType
et Image
détectent le type de fichier ou d'image requis par sa signature.
L'intégrité de l'ensemble du fichier n'est pas vérifiée. Vous pouvez savoir si une image n'est pas corrompue, par exemple en
essayant 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).
Pour la valeur par défaut, il accepte soit des objets implémentant la classe DateTimeInterface
, soit une chaîne
de caractères avec l'heure, soit un nombre représentant un horodatage UNIX. Il en va de même pour les arguments
Min
, Max
ou Range
, qui définissent la date minimale et maximale autorisée.
$form->addDate('date', 'Date:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'The date must be at least a month old.', new DateTime('-1 month'));
Par défaut, elle renvoie un objet DateTimeImmutable
. La méthode setFormat()
permet de spécifier un
format texte ou un
horodatage :
$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 l'heure sous forme d'heures, de minutes et éventuellement de secondes (classe DateTimeControl).
Pour la valeur par défaut, il accepte soit des objets implémentant DateTimeInterface
, soit une chaîne de
caractères avec l'heure, soit un nombre représentant un horodatage UNIX. Seule l'information temporelle de ces entrées est
utilisée ; la date est ignorée. Il en va de même pour les arguments Min
, Max
ou Range
,
qui définissent la durée minimale et maximale autorisée. Si la valeur minimale définie est supérieure à la valeur maximale,
une plage horaire s'étendant jusqu'à minuit est créée.
$form->addTime('time', 'Time:', withSeconds: true)
->addRule($form::Range, 'Time must be between %d and %d.', ['12:30', '13:30']);
Par défaut, elle renvoie un objet DateTimeImmutable
(avec la date du 1er janvier de l'année 1). La méthode
setFormat()
permet de spécifier un format de texte:
$form->addTime('time', 'Time:')
->setFormat('H:i');
addDateTime (string|int $name, $label=null, bool $withSeconds=false): DateTimeControl
Ajoute un champ qui permet à l'utilisateur de saisir facilement la date et l'heure en indiquant l'année, le mois, le jour, les heures, les minutes et, éventuellement, les secondes (classe DateTimeControl).
Pour la valeur par défaut, il accepte soit des objets implémentant la classe DateTimeInterface
, soit une chaîne
de caractères avec l'heure, soit un nombre représentant un horodatage UNIX. Il en va de même pour les arguments
Min
, Max
ou Range
, qui définissent la date minimale et maximale autorisée.
$form->addDateTime('datetime', 'Date and Time:')
->setDefaultValue(new DateTime)
->addRule($form::Min, 'The date must be at least a month old.', new DateTime('-1 month'));
Par défaut, elle renvoie un objet DateTimeImmutable
. La méthode setFormat()
permet de spécifier un
format texte ou un
horodatage :
$form->addDateTime('datetime')
->setFormat(DateTimeControl::FormatTimestamp);
addColor (string|int $name, $label=null): ColorPicker
Ajoute un champ de sélection de couleur (classe ColorPicker). La couleur est une chaîne au
format #rrggbb
. Si l'utilisateur ne fait pas de sélection, la couleur renvoyée par défaut est le noir
#000000
.
$form->addColor('color', 'Color:')
->setDefaultValue('#3C8ED7');
addHidden (string|int $name, ?string $default=null): HiddenField
Ajoute un champ caché (classe HiddenField).
$form->addHidden('userid');
Utilisez setNullable()
pour le modifier afin qu'il renvoie null
au lieu d'une chaîne vide. La fonction addFilter() permet de modifier la valeur
soumise.
Bien que l'élément soit caché, il est important de réaliser que sa valeur peut toujours être modifiée ou usurpée par un attaquant. Il faut toujours vérifier et valider soigneusement toutes les valeurs reçues du côté du serveur pour éviter 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', 'Register');
Il est possible d'avoir plus d'un bouton d'envoi dans le formulaire :
$form->addSubmit('register', 'Register');
$form->addSubmit('cancel', 'Cancel');
Pour savoir lequel d'entre eux a été cliqué, utilisez :
if ($form['register']->isSubmittedBy()) {
// ...
}
Si vous ne voulez pas valider le formulaire lorsqu'un bouton d'envoi est pressé (comme les boutons Annulation ou Aperçu), vous pouvez le désactiver avec setValidationScope().
addButton (string|int $name, $caption): Button
Ajoute un bouton (classe Button) sans fonction de soumission. Il est utile pour lier une autre fonctionnalité à l'id, par exemple une action JavaScript.
$form->addButton('raise', 'Raise salary')
->setHtmlAttribute('onclick', 'raiseSalary()');
addImageButton (string|int $name, ?string $src=null, ?string $alt=null): ImageButton
Ajoute un bouton d'envoi sous la forme d'une image (classe ImageButton).
$form->addImageButton('submit', '/path/to/image');
Lorsque vous utilisez plusieurs boutons d'envoi, vous pouvez savoir lequel a été cliqué avec la commande
$form['submit']->isSubmittedBy()
.
addContainer (string|int $name): Container
Ajoute un sous-formulaire (classe Container), ou un
conteneur, qui peut être traité de la même manière qu'un formulaire. Cela signifie que vous pouvez utiliser des méthodes
comme setDefaults()
ou 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:');
Les données envoyées sont ensuite renvoyées sous la forme d'une 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 (voir la documentation API pour un aperçu complet) :
setDefaultValue($value) |
définit la valeur par défaut |
getValue() |
obtient la valeur actuelle |
setOmitted() |
valeurs omises |
setDisabled() |
désactiver les entrées |
Rendu :
setCaption($caption) |
changer la légende 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) |
définit les données de rendu |
Validation :
setRequired() |
champ obligatoire |
addRule() |
règle de validation |
addCondition() , addConditionOn() |
fixer la condition de validation |
addError($message) |
passer le message d'erreur |
Les méthodes suivantes peuvent être appelées pour les éléments addText()
, addPassword()
,
addTextArea()
, addEmail()
, addInteger()
:
setNullable() |
détermine si getValue() renvoie null au lieu d'une chaîne vide. |
setEmptyValue($value) |
définit la valeur spéciale qui est traitée comme une chaîne vide |
setMaxLength($length) |
définit le nombre maximum de caractères autorisés |
addFilter($filter) |
modifier les valeurs d'entrée |
Valeurs omises
Si la valeur saisie par l'utilisateur ne vous intéresse pas, nous pouvons utiliser setOmitted()
pour l'omettre du
résultat fourni par la méthode $form->getValues()
ou transmis aux gestionnaires. Cela convient pour divers
mots de passe à des fins de vérification, des champs antispam, etc.
$form->addPassword('passwordVerify', 'Password again:')
->setRequired('Fill your password again to check for typo')
->addRule($form::Equal, 'Password mismatch', $form['password'])
->setOmitted();
Désactiver les entrées
Les entrées peuvent être désactivées à l'aide de setDisabled()
. Une entrée désactivée ne peut pas être
modifiée par l'utilisateur.
$form->addText('username', 'User name:')
->setDisabled();
Les entrées désactivées ne sont pas envoyées au serveur par le navigateur, et vous ne les trouverez donc pas dans les
données renvoyées par la fonction $form->getValues()
. Toutefois, si vous définissez
setOmitted(false)
, Nette inclura leur valeur par défaut dans ces données.
Lorsque setDisabled()
est appelé, la valeur de l'entrée est effacée pour des raisons de sécurité. Si
vous définissez une valeur par défaut, il est nécessaire de le faire après sa désactivation :
$form->addText('username', 'User name:')
->setDisabled()
->setDefaultValue($userName);
Une alternative aux entrées désactivées sont les champs avec l'attribut HTML readonly
, qui sont envoyés au
serveur par le navigateur. Bien que le champ ne soit que lisible, il est important de réaliser que sa valeur peut toujours
être modifiée ou usurpée par un attaquant.
Contrôles personnalisés
Outre le large éventail de contrôles de formulaire intégrés, vous pouvez ajouter des contrôles personnalisés au formulaire comme suit :
$form->addComponent(new DateInput('Date:'), 'date');
// syntaxe alternative: $form['date'] = new DateInput('Date:');
Le formulaire est un descendant de la classe Container et les éléments sont des descendants de Component.
Il est possible de définir de nouvelles méthodes de formulaire pour ajouter des éléments personnalisés (par exemple
$form->addZip()
). Il s'agit des méthodes dites d'extension. L'inconvénient est que les astuces de code dans les
éditeurs ne fonctionnent pas pour elles.
use Nette\Forms\Container;
// ajoute 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, 'At least 5 numbers', '[0-9]{5}');
});
// utilisation
$form->addZip('zip', 'ZIP code:');
Champs de bas niveau
Pour ajouter un élément au formulaire, il n'est pas nécessaire d'appeler $form->addXyz()
. Les éléments de
formulaire peuvent être introduits exclusivement dans les modèles. Ceci est utile si vous devez, par exemple, générer des
éléments dynamiques :
{foreach $items as $item}
<p><input type=checkbox name="sel[]" value={$item->id}> {$item->name}</p>
{/foreach}
Après la soumission, vous pouvez récupérer les valeurs :
$data = $form->getHttpData($form::DataText, 'sel[]');
$data = $form->getHttpData($form::DataText | $form::DataKeys, 'sel[]');
Dans le premier paramètre, vous spécifiez le type d'élément (DataFile
pour type=file
,
DataLine
pour les entrées d'une ligne comme text
, password
ou email
et
DataText
pour le reste). Le deuxième paramètre correspond à l'attribut HTML name
. Si vous devez
préserver les clés, vous pouvez combiner le premier paramètre avec DataKeys
. Ceci est utile pour
select
, radioList
ou checkboxList
.
L'adresse getHttpData()
renvoie des données d'entrée nettoyées. Dans ce cas, il s'agira toujours d'un tableau
de chaînes UTF-8 valides, quel que soit l'attaquant envoyé par le formulaire. C'est une alternative au travail avec
$_POST
ou $_GET
directement si vous voulez recevoir des données sûres.