Controlli del modulo

Panoramica dei controlli di modulo incorporati.

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

Aggiunge un campo di testo a riga singola (classe TextInput). Se l'utente non compila il campo, restituisce una stringa vuota '', oppure si può usare setNullable() per modificarlo e restituire null.

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

Convalida automaticamente UTF-8, taglia gli spazi bianchi a destra e a sinistra e rimuove le interruzioni di riga che potrebbero essere inviate da un utente malintenzionato.

La lunghezza massima può essere limitata utilizzando setMaxLength(). Il metodo addFilter() consente di modificare il valore inserito dall'utente.

È possibile cambiare il carattere visivo di un campo di testo in tipi come search, tel, o url usando setHtmlType(), come si vede nelle specifiche. Ricordare che la modifica del tipo è solo visiva e non svolge funzioni di validazione. Per il tipo url, è opportuno aggiungere una regola URL specifica.

Per altri tipi di input, come number, range, email, date, datetime-local, time e color, utilizzare metodi specializzati come addInteger, addFloat, addEmail addDate, addTime, addDateTime e addColor, che garantiscono la validazione lato server. I tipi month e week non sono ancora pienamente supportati da tutti i browser.

È possibile impostare il cosiddetto valore vuoto per l'elemento, che è qualcosa di simile al valore predefinito, ma se l'utente non lo sovrascrive, restituisce una stringa vuota o null.

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

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

Aggiunge un campo di testo multilinea (classe TextArea). Se l'utente non compila il campo, restituisce una stringa vuota '', oppure si può usare setNullable() per modificarlo e restituire null.

$form->addTextArea('note', 'Note:')
	->addRule($form::MaxLength, 'Your note is way too long', 10000);

Convalida automaticamente UTF-8 e normalizza le interruzioni di riga a \n. A differenza di un campo di input a una riga, non taglia gli spazi bianchi.

La lunghezza massima può essere limitata utilizzando setMaxLength(). Il metodo addFilter() consente di modificare il valore immesso dall'utente. È possibile impostare il cosiddetto valore vuoto utilizzando setEmptyValue().

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

Aggiunge un campo di input per numeri interi (classe TextInput). Restituisce un intero o null se l'utente non inserisce nulla.

$form->addInteger('anno', 'Anno:')
	->addRule($form::Range, 'L'anno deve essere compreso tra %d e %d.', [1900, 2023 |1900, 2023]);

L'elemento viene reso come <input type="numeric">. Utilizzando il metodo setHtmlType(), si può cambiare il tipo in range per la visualizzazione come cursore, oppure in text se si preferisce un campo di testo standard senza il comportamento speciale di 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('level', 'Level:')
	->setDefaultValue(0)
->addRule($form::Range, 'Il livello deve essere compreso tra %d e %d', [0, 100 |0, 100]);

L'elemento viene reso come <input type="numeric">. Utilizzando il metodo setHtmlType(), si può cambiare il tipo in range per la visualizzazione come cursore, oppure in text se si preferisce un campo di testo standard senza il comportamento speciale di numeric.

Nette e il browser Chrome accettano sia una virgola che un punto come separatori decimali. Per rendere disponibile questa funzionalità in Firefox, si consiglia di impostare l'attributo lang per un elemento specifico o per l'intera pagina, ad esempio, <html lang="cs">.

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

Aggiunge un campo per l'indirizzo e-mail con controllo di validità (classe TextInput). Se l'utente non compila il campo, restituisce una stringa vuota '', oppure si può usare setNullable() per modificarlo e restituire null.

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

Verifica che il valore sia un indirizzo e-mail valido. Non verifica l'effettiva esistenza del dominio, ma solo la sintassi. Convalida automaticamente UTF-8, taglia gli spazi bianchi a destra e a sinistra.

La lunghezza massima può essere limitata utilizzando setMaxLength(). Il metodo addFilter() consente di modificare il valore inserito dall'utente. È possibile impostare il cosiddetto valore vuoto utilizzando setEmptyValue().

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

Aggiunge il campo password (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].*');

Quando si invia nuovamente il modulo, l'input sarà vuoto. Convalida automaticamente UTF-8, taglia gli spazi bianchi a destra e a sinistra e rimuove le interruzioni di riga che potrebbero essere inviate da un utente malintenzionato.

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

Aggiunge una casella di controllo (classe Checkbox). Il campo restituisce true o false, a seconda che sia selezionato o meno.

$form->addCheckbox('agree', 'I agree with terms')
	->setRequired('You must agree with our terms');

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

Aggiunge un elenco di caselle di controllo per la selezione di più elementi (classe CheckboxList). Restituisce l'array di chiavi degli elementi selezionati. Il metodo getSelectedItems() restituisce i valori invece delle chiavi.

$form->addCheckboxList('colors', 'Colors:', [
	'r' => 'red',
	'g' => 'green',
	'b' => 'blue',
]);

Si passa l'array di elementi come terzo parametro o con il metodo setItems().

È possibile utilizzare setDisabled(['r', 'g']) per disabilitare singoli elementi.

L'elemento controlla automaticamente che non ci siano state contraffazioni e che gli elementi selezionati siano effettivamente tra quelli proposti e non siano stati disabilitati. Il metodo getRawValue() può essere utilizzato per recuperare gli elementi inviati senza questo importante controllo.

Quando sono impostati dei valori predefiniti, controlla anche che siano uno degli elementi offerti, altrimenti lancia un'eccezione. Questo controllo può essere disattivato con checkDefaultValue(false).

Se si invia un modulo con il metodo GET, è possibile scegliere un metodo di trasferimento dei dati più compatto, che consente di risparmiare sulle dimensioni della stringa di query. Questo metodo si attiva impostando l'attributo HTML del modulo:

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

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

Aggiunge pulsanti di opzione (classe RadioList). Restituisce la chiave dell'elemento selezionato o null se l'utente non ha selezionato nulla. Il metodo getSelectedItem() restituisce un valore invece di una chiave.

$sex = [
	'm' => 'male',
	'f' => 'female',
];
$form->addRadioList('gender', 'Gender:', $sex);

Si passa l'array di elementi come terzo parametro o con il metodo setItems().

È possibile utilizzare setDisabled(['m']) per disabilitare singoli elementi.

L'elemento controlla automaticamente che non ci siano state contraffazioni e che l'elemento selezionato sia effettivamente uno di quelli proposti e non sia stato disabilitato. Il metodo getRawValue() può essere utilizzato per recuperare l'elemento inviato senza questo importante controllo.

Quando il valore predefinito è impostato, controlla anche che sia uno degli elementi offerti, altrimenti lancia un'eccezione. Questo controllo può essere disattivato con checkDefaultValue(false).

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

Aggiunge una casella di selezione (classe SelectBox). Restituisce la chiave dell'elemento selezionato o null se l'utente non ha selezionato nulla. Il metodo getSelectedItem() restituisce un valore invece di una chiave.

$countries = [
	'CZ' => 'Czech republic',
	'SK' => 'Slovakia',
	'GB' => 'United Kingdom',
];

$form->addSelect('country', 'Country:', $countries)
	->setDefaultValue('SK');

Si passa l'array di elementi come terzo parametro o con il metodo setItems(). L'array di elementi può anche essere bidimensionale:

$countries = [
	'Europe' => [
		'CZ' => 'Czech republic',
		'SK' => 'Slovakia',
		'GB' => 'United Kingdom',
	],
	'CA' => 'Canada',
	'US' => 'USA',
	'?'  => 'other',
];

Per le caselle di selezione, il primo elemento ha spesso un significato speciale, in quanto funge da invito all'azione. Utilizzare il metodo setPrompt() per aggiungere una voce di questo tipo.

$form->addSelect('country', 'Country:', $countries)
	->setPrompt('Pick a country');

È possibile utilizzare setDisabled(['CZ', 'SK']) per disabilitare singole voci.

L'elemento controlla automaticamente che non ci siano state contraffazioni e che l'elemento selezionato sia effettivamente uno di quelli proposti e non sia stato disabilitato. Il metodo getRawValue() può essere utilizzato per recuperare l'elemento inviato senza questo importante controllo.

Quando il valore predefinito è impostato, controlla anche che sia uno degli elementi offerti, altrimenti lancia un'eccezione. Questo controllo può essere disattivato con checkDefaultValue(false).

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

Aggiunge una casella di selezione a scelta multipla (classe MultiSelectBox). Restituisce l'array di chiavi degli elementi selezionati. Il metodo getSelectedItems() restituisce i valori invece delle chiavi.

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

La matrice di elementi viene passata come terzo parametro o con il metodo setItems(). L'array di elementi può anche essere bidimensionale.

È possibile utilizzare setDisabled(['CZ', 'SK']) per disabilitare singoli elementi.

L'elemento controlla automaticamente che non ci siano state contraffazioni e che gli elementi selezionati siano effettivamente tra quelli proposti e non siano stati disabilitati. Il metodo getRawValue() può essere utilizzato per recuperare gli elementi inviati senza questo importante controllo.

Quando sono impostati dei valori predefiniti, controlla anche che siano uno degli elementi offerti, altrimenti lancia un'eccezione. Questo controllo può essere disattivato con checkDefaultValue(false).

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

Aggiunge il campo di caricamento dei file (classe UploadControl). Restituisce l'oggetto FileUpload, anche se l'utente non ha caricato un file, cosa che può essere scoperta con il metodo 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);

Se il file non è stato caricato correttamente, il modulo non è stato inviato con successo e viene visualizzato un errore. Non è quindi necessario controllare il metodo FileUpload::isOk().

Non fidatevi del nome originale del file restituito dal metodo FileUpload::getName(), un client potrebbe inviare un nome di file dannoso con l'intenzione di corrompere o hackerare l'applicazione.

Le regole MimeType e Image rilevano il tipo di file o immagine richiesto in base alla sua firma. L'integrità dell'intero file non viene controllata. È possibile scoprire se un'immagine non è danneggiata, ad esempio provando a caricarla.

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

Aggiunge un campo per il caricamento di più file (classe UploadControl). Restituisce un array di oggetti FileUpload. Il metodo FileUpload::hasFile() restituirà true per ciascuno di essi.

$form->addMultiUpload('files', 'Files:')
	->addRule($form::MaxLength, 'A maximum of %d files can be uploaded', 10);

Se uno dei file non viene caricato correttamente, il modulo non è stato inviato correttamente e viene visualizzato un errore. Non è quindi necessario controllare il metodo FileUpload::isOk().

Non fidatevi dei nomi originali dei file restituiti dal metodo FileUpload::getName(), un client potrebbe inviare un nome di file dannoso con l'intenzione di corrompere o hackerare l'applicazione.

Le regole MimeType e Image rilevano il tipo di file o immagine richiesto in base alla sua firma. L'integrità dell'intero file non viene controllata. È possibile scoprire se un'immagine non è danneggiata, ad esempio provando a caricarla.

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

Aggiunge un campo che consente all'utente di inserire facilmente una data composta da anno, mese e giorno (classe DateTimeControl).

Per il valore predefinito, accetta o oggetti che implementano la regola DateTimeInterface, una stringa con l'ora o un numero che rappresenta un timestamp UNIX. Lo stesso vale per gli argomenti delle regole Min, Max, o Range, che definiscono la data minima e massima consentita.

$form->addDate('date', 'Date:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, 'The date must be at least a month old.', new DateTime('-1 month'));

Per impostazione predefinita, restituisce un oggetto DateTimeImmutable. Utilizzando il metodo setFormat(), è possibile specificare un formato di testo o un timestamp:

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

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

Aggiunge un campo che consente all'utente di inserire facilmente il tempo composto da ore, minuti e, facoltativamente, secondi (classe DateTimeControl).

Per il valore predefinito, accetta oggetti che implementano DateTimeInterface, una stringa con l'ora o un numero che rappresenta un timestamp UNIX. Solo le informazioni sull'ora di questi input vengono utilizzate; la data viene ignorata. Lo stesso vale per gli argomenti delle regole Min, Max, o Range, che definiscono il tempo minimo e massimo consentito. Se il valore minimo impostato è superiore a quello massimo, viene creato un intervallo di tempo che copre la mezzanotte.

$form->addTime('time', 'Time:', withSeconds: true)
	->addRule($form::Range, 'Time must be between %d and %d.', ['12:30', '13:30']);

Per impostazione predefinita, restituisce un oggetto DateTimeImmutable (con data 1 gennaio, anno 1). Utilizzando il metodo setFormat(), è possibile specificare un formato di testo:

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

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

Aggiunge un campo che consente all'utente di inserire facilmente sia la data che l'ora, composta da anno, mese, giorno, ore, minuti e, facoltativamente, secondi (classe DateTimeControl).

Per il valore predefinito, accetta sia oggetti che implementano DateTimeInterface, sia una stringa con l'ora, sia un numero che rappresenta un timestamp UNIX. Lo stesso vale per gli argomenti delle regole Min, Max, o Range, che definiscono la data minima e massima consentita.

$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'));

Per impostazione predefinita, restituisce un oggetto DateTimeImmutable. Utilizzando il metodo setFormat(), è possibile specificare un formato di testo o un timestamp:

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

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

Aggiunge un campo di selezione del colore (classe ColorPicker). Il colore è una stringa nel formato #rrggbb. Se l'utente non effettua alcuna selezione, il colore predefinito restituito è il nero #000000.

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

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

Aggiunge un campo nascosto (classe HiddenField).

$form->addHidden('userid');

Utilizzare setNullable() per modificarlo in modo che restituisca null invece di una stringa vuota. Il metodo addFilter() consente di modificare il valore inviato.

Sebbene l'elemento sia nascosto, è importante rendersi conto che il suo valore può comunque essere modificato o falsificato da un utente malintenzionato. Verificare e convalidare sempre accuratamente tutti i valori ricevuti sul lato server per evitare rischi di sicurezza associati alla manipolazione dei dati.

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

Aggiunge il pulsante di invio (classe SubmitButton).

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

È possibile avere più di un pulsante di invio nel modulo:

$form->addSubmit('register', 'Register');
$form->addSubmit('cancel', 'Cancel');

Per sapere quale di essi è stato cliccato, utilizzare:

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

Se non si desidera convalidare il modulo quando viene premuto un pulsante di invio (come i pulsanti CancelPreview), è possibile disattivarlo con setValidationScope().

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

Aggiunge un pulsante (classe Button) senza funzione di invio. È utile per legare altre funzionalità all'id, ad esempio un'azione JavaScript.

$form->addButton('raise', 'Raise salary')
	->setHtmlAttribute('onclick', 'raiseSalary()');

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

Aggiunge un pulsante di invio sotto forma di immagine (classe ImageButton).

$form->addImageButton('submit', '/path/to/image');

Quando si usano più pulsanti di invio, si può sapere quale è stato cliccato con $form['submit']->isSubmittedBy().

addContainer (string|int $name): Container

Aggiunge un sub-form (classe Container), o un contenitore, che può essere trattato come un form. Ciò significa che si possono usare metodi come setDefaults() o 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:');

I dati inviati vengono restituiti come struttura multidimensionale:

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

Panoramica delle impostazioni

Per tutti gli elementi si possono richiamare i seguenti metodi (si veda la documentazione dell'API per una panoramica completa):

setDefaultValue($value) imposta il valore predefinito
getValue() ottiene il valore corrente
setOmitted() omettere i valori
setDisabled() disabilitare gli ingressi

Rendering:

setCaption($caption) modifica la didascalia dell'elemento
setTranslator($translator) imposta il traduttore
setHtmlAttribute($name, $value) imposta l'attributo HTML dell'elemento
setHtmlId($id) imposta l'attributo HTML id
setHtmlType($type) imposta l'attributo HTML type
setHtmlName($name) imposta l'attributo HTML name
setOption($key, $value) imposta i dati di rendering

Convalida:

setRequired() campo obbligatorio
addRule() imposta regola di validazione
addCondition(), addConditionOn() impostare condizione di validazione
addError($message) passaggio del messaggio di errore

I seguenti metodi possono essere richiamati per gli elementi addText(), addPassword(), addTextArea(), addEmail(), addInteger():

setNullable() imposta se getValue() restituisce null invece della stringa vuota
setEmptyValue($value) imposta il valore speciale che viene trattato come stringa vuota
setMaxLength($length) imposta il numero massimo di caratteri consentiti
addFilter($filter) modificare i valori di input

Valori omessi

Se non si è interessati al valore inserito dall'utente, si può usare setOmitted() per ometterlo dal risultato fornito dal metodo $form->getValues​() o passato ai gestori. Questo è adatto per varie password di verifica, campi antispam, ecc.

$form->addPassword('passwordVerify', 'Password again:')
	->setRequired('Fill your password again to check for typo')
	->addRule($form::Equal, 'Password mismatch', $form['password'])
	->setOmitted();

Disabilitazione degli ingressi

Gli ingressi possono essere disabilitati utilizzando setDisabled(). Un ingresso disabilitato non può essere modificato dall'utente.

$form->addText('username', 'User name:')
	->setDisabled();

Gli input disabilitati non vengono inviati al server dal browser, quindi non li troverete nei dati restituiti dalla funzione $form->getValues(). Tuttavia, se si imposta setOmitted(false), Nette includerà il loro valore predefinito in questi dati.

Quando viene richiamato setDisabled(), il valore dell'input viene cancellato per motivi di sicurezza. Se si imposta un valore predefinito, è necessario farlo dopo la sua disattivazione:

$form->addText('username', 'User name:')
	->setDisabled()
	->setDefaultValue($userName);

Un'alternativa agli input disabilitati sono i campi con l'attributo HTML readonly, che vengono inviati al server dal browser. Sebbene il campo sia solo leggibile, è importante rendersi conto che il suo valore può comunque essere modificato o falsificato da un utente malintenzionato.

Controlli personalizzati

Oltre all'ampia gamma di controlli incorporati nel modulo, è possibile aggiungere controlli personalizzati al modulo come segue:

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

Il modulo è un discendente della classe Container e gli elementi sono discendenti di Component.

Esiste un modo per definire nuovi metodi del modulo per aggiungere elementi personalizzati (ad esempio $form->addZip()). Questi sono i cosiddetti metodi di estensione. Lo svantaggio è che i suggerimenti di codice negli editor non funzionano per questi metodi.

use Nette\Forms\Container;

// aggiunge il metodo addZip(string $nome, ?string $etichetta = null)
Container::extensionMethod('addZip', function (Container $form, string $name, ?string $label = null) {
	return $form->addText($name, $label)
		->addRule($form::Pattern, 'Almeno 5 numeri', '[0-9]{5}');
});

// utilizzo
$form->addZip('zip', 'Codice postale:');

Campi di basso livello

Per aggiungere un elemento al form, non è necessario chiamare $form->addXyz(). Gli elementi del modulo possono essere introdotti esclusivamente nei modelli. Questo è utile se, ad esempio, si ha la necessità di generare elementi dinamici:

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

Dopo l'invio, è possibile recuperare i valori:

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

Nel primo parametro si specifica il tipo di elemento (DataFile per type=file, DataLine per gli input a una riga come text, password o email e DataText per gli altri). Il secondo parametro corrisponde all'attributo HTML name. Se è necessario preservare le chiavi, si può combinare il primo parametro con DataKeys. Questo è utile per select, radioList o checkboxList.

getHttpData() restituisce un input sanificato. In questo caso, sarà sempre un array di stringhe UTF-8 valide, indipendentemente dall'attaccante inviato dal modulo. È un'alternativa al lavoro diretto con $_POST o $_GET, se si vogliono ricevere dati sicuri.

versione: 4.0