Nette Documentation Preview

syntax
Элементы управления форм
************************

.[perex]
Обзор встроенных элементов управления формой.


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

Добавляет однострочное текстовое поле (класс [TextInput |api:Nette\Forms\Controls\TextInput]). Если пользователь не заполнил поле, возвращается пустая строка `''`, или используйте `setNullable()` для возврата `null`.

```php
$form->addText('name', 'Имя:')
	->setRequired()
	->setNullable();
```

Этот метод автоматически проверяет UTF-8, обрезает левые и правые пробелы и удаляет переносы строк, которые могут быть отправлены злоумышленником.

Максимальная длина может быть ограничена с помощью `setMaxLength()`. Функция [addFilter()|validation#Modifying-Input-Values] позволяет изменить введенное пользователем значение.

Вы можете изменить визуальный характер текстового поля на такие типы, как `search`, `tel`, или `url` с использованием `setHtmlType()`, как показано в [спецификации |https://developer.mozilla.org/en-US/docs/Learn/Forms/HTML5_input_types]. Помните, что изменение типа является только визуальным и не выполняет функции проверки. Для типа `url` целесообразно добавить специальное [правило URL |validation#Text inputs].

.[note]
Для других типов ввода, таких как `number`, `range`, `email`, `date`, `datetime-local`, `time` и `color`, используйте специализированные методы [addInteger |#addInteger], [addFloat |#addFloat], [addEmail |#addEmail] [addDate |#addDate], [addTime |#addTime], [addDateTime |#addDateTime] и [addColor |#addColor], которые обеспечивают валидацию на стороне сервера. Типы `month` и `week` пока не полностью поддерживаются во всех браузерах.

Для элемента может быть установлено так называемое «пустое значение», которое является чем-то вроде значения по умолчанию, но если пользователь не перезаписывает его, возвращает пустую строку или `null`.

```php
$form->addText('phone', 'Телефон:')
	->setHtmlType('tel')
	->setEmptyValue('+420');
```


addTextArea(string|int $name, $label=null): TextArea .[method]
==============================================================

Добавляет многострочное текстовое поле (класс [TextArea |api:Nette\Forms\Controls\TextArea]). Если пользователь не заполнил поле, возвращается пустая строка `''`, или используйте `setNullable()` для возврата `null`.

```php
$form->addTextArea('note', 'Примечание:')
	->addRule($form::MaxLength, 'Ваша заметка слишком длинная', 10000);
```

Автоматически проверяет UTF-8 и нормализует переносы строк до `\n`. В отличие от однострочного поля ввода, в нем не обрезаются пробельные символы.

Максимальная длина может быть ограничена с помощью `setMaxLength()`. Функция [addFilter()|validation#Modifying-Input-Values] позволяет изменить введенное пользователем значение. Вы можете установить так называемое «пустое значение», используя `setEmptyValue()`.


addInteger(string|int $name, $label=null): TextInput .[method]
==============================================================

Добавляет поле ввода для целого числа (класс [TextInput |api:Nette\Forms\Controls\TextInput]). Возвращает либо целое число, либо `null`, если пользователь ничего не ввел.

```php
$form->addInteger('year', 'Year:')
	->addRule($form::Range, 'Год должен быть в диапазоне от %d до %d.', [1900, 2023 |1900, 2023]);
```

Элемент отображается как `<input type="numeric">`. Используя метод `setHtmlType()`, вы можете изменить тип на `range` для отображения в виде слайдера или на `text`, если вы предпочитаете обычное текстовое поле без специального поведения `numeric`.


addFloat(string|int $name, $label=null): TextInput .[method]{data-version:3.1.12}
=================================================================================

Adds a field for entering a decimal number ([TextInput |api:Nette\Forms\Controls\TextInput] class). Returns either float or `null`, if the user does not specify anything.

```php
$form->addFloat('level', 'Level:')
	->setDefaultValue(0)
->addRule($form::Range, 'Уровень должен находиться в диапазоне от %d до %d.', [0, 100 |0, 100]);
```

Элемент отображается как `<input type="numeric">`. Используя метод `setHtmlType()`, вы можете изменить тип на `range` для отображения в виде слайдера или на `text`, если вы предпочитаете обычное текстовое поле без специального поведения `numeric`.

Nette и браузер Chrome принимают запятую и точку в качестве десятичных разделителей. Чтобы сделать эту функцию доступной в Firefox, рекомендуется установить атрибут `lang` либо для конкретного элемента, либо для всей страницы, например, `<html lang="cs">`.


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

Добавляет поле адреса электронной почты с проверкой достоверности (класс [TextInput |api:Nette\Forms\Controls\TextInput]). Если пользователь не заполнил поле, возвращается пустая строка `''`, или используйте `setNullable()` для возврата `null`.

```php
$form->addEmail('email', 'Имейл:');
```

Проверяет, что значение является действительным адресом электронной почты. Он не проверяет, существует ли домен на самом деле, проверяется только синтаксис. Автоматически проверяет UTF-8, обрезает левые и правые пробелы.

Максимальная длина может быть ограничена с помощью `setMaxLength()`. Функция [addFilter()|validation#Modifying-Input-Values] позволяет изменить введенное пользователем значение. Вы можете установить так называемое «пустое значение», используя `setEmptyValue()`.


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

Добавляет поле пароля (класс [TextInput |api:Nette\Forms\Controls\TextInput]).

```php
$form->addPassword('password', 'Пароль:')
	->setRequired()
	->addRule($form::MinLength, 'Пароль должен быть длиной не менее %d символов', 8)
	->addRule($form::Pattern, 'Пароль должен содержать цифры', '.*[0-9].*');
```

При повторной отправке формы ввод будет пустым. Он автоматически проверяет UTF-8, обрезает левые и правые пробелы и удаляет переносы строк, которые могут быть отправлены злоумышленником.


addCheckbox(string|int $name, $caption=null): Checkbox .[method]
================================================================

Добавляет флажок (класс [Checkbox |api:Nette\Forms\Controls\Checkbox]). Поле возвращает либо `true`, либо `false`, в зависимости от того, проверено ли оно.

```php
$form->addCheckbox('agree', 'Я согласен с условиями')
	->setRequired('Вы должны согласиться с нашими условиями');
```


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

Добавляет список флажков для выбора нескольких элементов (класс [CheckboxList |api:Nette\Forms\Controls\CheckboxList]). Возвращает массив ключей выбранных элементов. Метод `getSelectedItems()` возвращает значения вместо ключей.

```php
$form->addCheckboxList('colors', 'Цвета:', [
	'r' => 'red',
	'g' => 'green',
	'b' => 'blue',
]);
```

Мы передаем массив элементов в качестве третьего параметра или методом `setItems()`.

Вы можете использовать `setDisabled(['r', 'g'])` для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранные элементы действительно являются одними из предложенных и не были отключены. Метод `getRawValue()` может быть использован для получения отправленных элементов без этой важной проверки.

При установке значений по умолчанию также проверяется, что они являются одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью `checkDefaultValue(false)`.

Если вы отправляете форму с помощью метода `GET`, вы можете выбрать более компактный способ передачи данных, который позволяет сэкономить на размере строки запроса. Это активируется установкой атрибута HTML формы:

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


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

Добавляет радиокнопки (класс [RadioList |api:Nette\Forms\Controls\RadioList]). Возвращает ключ выбранного элемента или `null`, если пользователь ничего не выбрал. Метод `getSelectedItem()` возвращает значение вместо ключа.

```php
$sex = [
	'm' => 'male',
	'f' => 'female',
];
$form->addRadioList('gender', 'Пол:', $sex);
```

Мы передаем массив элементов в качестве третьего параметра или методом `setItems()`.

Вы можете использовать `setDisabled(['m'])` для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранный элемент действительно является одним из предложенных и не был отключен. Метод `getRawValue()` может быть использован для получения отправленного элемента без этой важной проверки.

При установке значения по умолчанию проверяется, что оно является одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью `checkDefaultValue(false)`.


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

Добавляет поле выбора (класс [SelectBox |api:Nette\Forms\Controls\SelectBox]). Возвращает ключ выбранного элемента или `null`, если пользователь ничего не выбрал. Метод `getSelectedItem()` возвращает значение вместо ключа.

```php
$countries = [
	'CZ' => 'Чешская республика',
	'SK' => 'Словакия',
	'GB' => 'Великобритания',
];

$form->addSelect('country', 'Страна:', $countries)
	->setDefaultValue('SK');
```

Мы передаем массив элементов в качестве третьего параметра или методом `setItems()`. Массив элементов также может быть двумерным:

```php
$countries = [
	'Europe' => [
		'CZ' => 'Чешская республика',
		'SK' => 'Словакия',
		'GB' => 'Великобритания',
	],
	'CA' => 'Канада',
	'US' => 'США',
	'?'  => 'другая',
];
```

В блоках выбора первый элемент часто имеет особое значение, он служит призывом к действию. Используйте метод `setPrompt()` для добавления такой записи.

```php
$form->addSelect('country', 'Страна:', $countries)
	->setPrompt('Выберите страну');
```

Вы можете использовать `setDisabled(['CZ', 'SK'])` для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранный элемент действительно является одним из предложенных и не был отключен. Метод `getRawValue()` может быть использован для получения отправленного элемента без этой важной проверки.

При установке значения по умолчанию проверяется, что оно является одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью `checkDefaultValue(false)`.


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

Добавляет окно выбора нескольких вариантов (класс [MultiSelectBox |api:Nette\Forms\Controls\MultiSelectBox]). Возвращает массив ключей выбранных элементов. Метод `getSelectedItems()` возвращает значения вместо ключей.

```php
$form->addMultiSelect('countries', 'Страны:', $countries);
```

Мы передаем массив элементов в качестве третьего параметра или методом `setItems()`. Массив элементов также может быть двумерным.

Вы можете использовать `setDisabled(['CZ', 'SK'])` для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранные элементы действительно являются одними из предложенных и не были отключены. Метод `getRawValue()` может быть использован для получения отправленных элементов без этой важной проверки.

При установке значений по умолчанию также проверяется, что они являются одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью `checkDefaultValue(false)`.


addUpload(string|int $name, $label=null): UploadControl .[method]
=================================================================

Добавляет поле загрузки файлов (класс [UploadControl |api:Nette\Forms\Controls\UploadControl]). Возвращает объект [FileUpload |http:request#FileUpload], даже если пользователь не загрузил файл, что можно выяснить с помощью метода `FileUpload::hasFile()`.

```php
$form->addUpload('avatar', 'Аватар:')
	->addRule($form::Image, 'Аватар должен быть в формате JPEG, PNG, GIF или WebP')
	->addRule($form::MaxFileSize, 'Максимальный размер - 1 МБ', 1024 * 1024);
```

Если файл загружен неправильно, форма не была отправлена успешно и отображается ошибка. Т. е. нет необходимости проверять метод `FileUpload::isOk()`.

Не доверяйте оригинальному имени файла, возвращаемому методом `FileUpload::getName()`, клиент может отправить вредоносное имя файла с намерением испортить или взломать ваше приложение.

Правила `MimeType` и `Image` определяют необходимый тип файла или изображения по его сигнатуре. Целостность всего файла не проверяется. Вы можете узнать, не повреждено ли изображение, например, попытавшись [загрузить его|http:request#toImage].


addMultiUpload(string|int $name, $label=null): UploadControl .[method]
======================================================================

Добавляет поле загрузки нескольких файлов (класс [UploadControl |api:Nette\Forms\Controls\UploadControl]). Возвращает массив объектов [FileUpload |http:request#FileUpload]. Метод `FileUpload::hasFile()` вернет `true` для каждого из них.

```php
$form->addMultiUpload('files', 'Файлы:')
	->addRule($form::MaxLength, 'Может быть загружено не более %d файлов', 10);
```

Если один из файлов не загрузится правильно, форма не будет отправлена успешно и отобразится ошибка. Т. е. нет необходимости проверять метод `FileUpload::isOk()`.

Не доверяйте оригинальным именам файлов, возвращаемым методом `FileUpload::getName()`, клиент может отправить вредоносное имя файла с намерением испортить или взломать ваше приложение.

Правила `MimeType` и `Image` определяют необходимый тип файла или изображения по его сигнатуре. Целостность всего файла не проверяется. Вы можете узнать, не повреждено ли изображение, например, попытавшись [загрузить его|http:request#toImage].


addDate(string|int $name, $label=null): DateTimeControl .[method]{data-version:3.1.14}
======================================================================================

Добавляет поле, позволяющее пользователю легко вводить дату, состоящую из года, месяца и дня (класс [DateTimeControl |api:Nette\Forms\Controls\DateTimeControl]).

В качестве значения по умолчанию он принимает либо объекты, реализующие `DateTimeInterface`, либо строку с временем, либо число, представляющее временную метку UNIX. То же самое относится и к аргументам правил `Min`, `Max` или `Range`, которые определяют минимально и максимально допустимую дату.

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

По умолчанию возвращается объект `DateTimeImmutable`. С помощью метода `setFormat()` можно задать [текстовый формат |https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters] или временную метку:

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


addTime(string|int $name, $label=null, bool $withSeconds=false): DateTimeControl .[method]{data-version:3.1.14}
===============================================================================================================

Добавляет поле, позволяющее пользователю легко вводить время, состоящее из часов, минут и, по желанию, секунд (класс [DateTimeControl |api:Nette\Forms\Controls\DateTimeControl]).

В качестве значения по умолчанию оно принимает либо объекты, реализующие `DateTimeInterface`, либо строку с временем, либо число, представляющее временную метку UNIX. Используется только информация о времени из этих входов, дата игнорируется. То же самое относится и к аргументам правил `Min`, `Max` или `Range`, которые определяют минимальное и максимальное допустимое время. Если минимальное значение больше максимального, то создается временной диапазон, охватывающий полночь.

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

По умолчанию он возвращает объект `DateTimeImmutable` (с датой 1 января, год 1). С помощью метода `setFormat()` можно задать [текстовый формат |https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters]:

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


addDateTime(string|int $name, $label=null, bool $withSeconds=false): DateTimeControl .[method]{data-version:3.1.14}
===================================================================================================================

Добавляет поле, позволяющее пользователю легко вводить дату и время, состоящие из года, месяца, дня, часов, минут и, по желанию, секунд (класс [DateTimeControl |api:Nette\Forms\Controls\DateTimeControl]).

В качестве значения по умолчанию он принимает либо объекты, реализующие `DateTimeInterface`, либо строку с временем, либо число, представляющее временную метку UNIX. То же самое относится и к аргументам правил `Min`, `Max` или `Range`, которые определяют минимально и максимально допустимую дату.

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

По умолчанию возвращается объект `DateTimeImmutable`. С помощью метода `setFormat()` можно задать [текстовый формат |https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters] или временную метку:

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


addColor(string|int $name, $label=null): ColorPicker .[method]{data-version:3.1.14}
===================================================================================

Добавляет поле выбора цвета (класс [ColorPicker |api:Nette\Forms\Controls\ColorPicker]). Цвет представляет собой строку в формате `#rrggbb`. Если пользователь не делает выбора, то по умолчанию возвращается черный цвет `#000000`.

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


addHidden(string|int $name, ?string $default=null): HiddenField .[method]
=========================================================================

Добавляет скрытое поле (класс [HiddenField |api:Nette\Forms\Controls\HiddenField]).

```php
$form->addHidden('userid');
```

Используйте `setNullable()`, чтобы изменить его так, чтобы он возвращал `null` вместо пустой строки. Функция [addFilter()|validation#Modifying-Input-Values] позволяет изменить представленное значение.

Хотя элемент скрыт, **важно понимать**, что его значение все равно может быть изменено или подделано злоумышленником. Всегда тщательно проверяйте и проверяйте все полученные значения на стороне сервера, чтобы предотвратить риски безопасности, связанные с манипулированием данными.


addSubmit(string|int $name, $caption=null): SubmitButton .[method]
==================================================================

Добавляет кнопку отправки (класс [SubmitButton |api:Nette\Forms\Controls\SubmitButton]).

```php
$form->addSubmit('submit', 'Зарегистрироваться');
```

В форме можно иметь более одной кнопки отправки:

```php
$form->addSubmit('register', 'Зарегистрироваться');
$form->addSubmit('cancel', 'Отмена');
```

Чтобы узнать, какая из них была нажата, используйте:

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

Если вы не хотите проверять форму при нажатии кнопки отправки (например, кнопки *Отмена* или *Предварительный просмотр*), вы можете отключить её с помощью [setValidationScope()|validation#Disabling-Validation].


addButton(string|int $name, $caption): Button .[method]
=======================================================

Добавляет кнопку (класс [Button |api:Nette\Forms\Controls\Button]) без функции отправки. Это полезно для привязки другой функциональности к id, например, действия JavaScript.

```php
$form->addButton('raise', 'Поднять зарплату')
	->setHtmlAttribute('onclick', 'raiseSalary()');
```


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

Добавляет кнопку отправки в виде изображения (класс [ImageButton |api:Nette\Forms\Controls\ImageButton]).

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

При использовании нескольких кнопок отправки можно узнать, какая из них была нажата с помощью `$form['submit']->isSubmittedBy()`.


addContainer(string|int $name): Container .[method]
===================================================

Добавляет подформу (класс [Container|api:Nette\Forms\Container]), или контейнер, с которым можно обращаться так же, как и с формой. Это означает, что вы можете использовать такие методы, как `setDefaults()` или `getValues()`.

```php
$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Ваше имя:');
$sub1->addEmail('email', 'Имейл:');

$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Ваше имя:');
$sub2->addEmail('email', 'Имейл:');
```

Затем отправленные данные возвращаются в виде многомерной структуры:

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


Обзор настроек .[#toc-overview-of-settings]
===========================================

Для всех элементов мы можем вызывать следующие методы (полный обзор см. в [документации по API|https://api.nette.org/forms/master/Nette/Forms/Controls.html]):

.[table-form-methods language-php]
| `setDefaultValue($value)` | устанавливает значение по умолчанию
| `getValue()` 				| получить текущее значение
| `setOmitted()` 			| [#omitted values]
| `setDisabled()` 			| [#disabling inputs]

Рендеринг:
.[table-form-methods language-php]
| `setCaption()` 			| изменить заголовка элемента
| `setTranslator()` 		| задает [транслятор |rendering#translating]
| `setHtmlAttribute()` 		| задает [HTML атрибут |rendering#HTML attributes] элемента
| `setHtmlId()` 			| задает HTML атрибут `id`
| `setHtmlType()` 			| задает HTML атрибут `type`
| `setHtmlName()` 			| задает HTML атрибут `name`
| `setOption()` 			| задает [рендеринг данных|rendering#Options]

Валидация:
.[table-form-methods language-php]
| `setRequired()` 			| [обязательное поле |validation]
| `addRule()` 				| установить [правило проверки |validation#Rules]
| `addCondition()`, `addConditionOn()` | установить [условие проверки|validation#Conditions]
| `addError()` 				| [передача сообщения об ошибке|validation#Processing-Errors]

Следующие методы могут быть вызваны для элементов `addText()`, `addPassword()`, `addTextArea()`, `addEmail()`, `addInteger()`:

.[table-form-methods language-php]
| `setNullable()`			| устанавливает, возвращает ли getValue() `null` вместо пустой строки
| `setEmptyValue()` 		| устанавливает специальное значение, которое рассматривается как пустая строка
| `setMaxLength()` 			| устанавливает максимальное количество разрешенных символов
| `addFilter()` 			| [изменение входных значений |validation#Modifying-Input-Values]


Опущенные значения .[#toc-omitted-values]
=========================================

Если вас не интересует значение, введенное пользователем, мы можем использовать `setOmitted()`, чтобы опустить его из результата, предоставляемого методом `$form->getValues()` или передаваемого обработчикам. Это подходит для различных паролей для проверки, антиспамовых полей и т. д.

```php
$form->addPassword('passwordVerify', 'Повторите пароль:')
	->setRequired('Введите пароль ещё раз, чтобы проверить опечатку')
	->addRule($form::Equal, 'Несоответствие пароля', $form['password'])
	->setOmitted();
```


Отключение элементов ввода .[#toc-disabling-inputs]
===================================================

Входы можно отключить с помощью `setDisabled()`. Отключенный вход не может быть отредактирован пользователем.

```php
$form->addText('username', 'Имя пользователя:')
	->setDisabled();
```

Отключенные входы не отправляются браузером на сервер, поэтому вы не найдете их в данных, возвращаемых функцией `$form->getValues()`. Однако если вы зададите `setOmitted(false)`, Nette включит их значение по умолчанию в эти данные.

Когда вызывается `setDisabled()`, **значение входных данных стирается** в целях безопасности. Если вы устанавливаете значение по умолчанию, необходимо сделать это после его деактивации:

```php
$form->addText('username', 'Имя пользователя:')
	->setDisabled()
	->setDefaultValue($userName);
```

Альтернативой отключенным входам являются поля с атрибутом HTML `readonly`, которые отправляются на сервер браузером. Хотя это поле можно только читать, **важно понимать**, что его значение все равно может быть изменено или подделано злоумышленником.


Пользовательские элементы управления .[#toc-custom-controls]
============================================================

Помимо широкого спектра встроенных элементов управления формой, вы можете добавить свои элементы следующим образом:

```php
$form->addComponent(new DateInput('Дата:'), 'date');
// альтернативный синтаксис: $form['date'] = new DateInput('Дата:');
```

.[note]
Форма является потомком класса [Container | component-model:#Container], а элементы являются потомками [Component | component-model:#Component].

Существует способ определения новых методов формы для добавления пользовательских элементов (например, '$form->addZip()'). Это так называемые методы расширения. Недостатком является то, что подсказки кода в редакторах не будут работать для них.

```php
use Nette\Forms\Container;

// добавляет метод 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, 'Не менее 5 номеров', '[0-9]{5}');
});

// использование
$form->addZip('zip', 'ZIP-код:');
```


Низкоуровневые поля .[#toc-low-level-fields]
============================================

Чтобы добавить элемент в форму, не нужно вызывать '$form->addXyz()'. Вместо этого элементы формы могут быть введены исключительно в шаблоны. Это полезно, если вам, например, нужно создать динамические элементы:

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

После отправки можно получить значения:

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

В первом параметре вы указываете тип элемента (`DataFile` для `type=file`, `DataLine` для однострочных вводов типа `text`, `password` или `email` и `DataText` для остальных). Второй параметр соответствует HTML-атрибуту `name`. Если вам нужно сохранить ключи, вы можете объединить первый параметр с `DataKeys`. Это полезно для `select`, `radioList` или `checkboxList`.

Функция `getHttpData()` возвращает обработанные данные. В этом случае это всегда будет массив допустимых строк UTF-8, независимо от того, что атакующий отправил через форму. Это альтернатива работе с `$_POST` или `$_GET` напрямую, если вы хотите получать безопасные данные.

Элементы управления форм

Обзор встроенных элементов управления формой.

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

Добавляет однострочное текстовое поле (класс TextInput). Если пользователь не заполнил поле, возвращается пустая строка '', или используйте setNullable() для возврата null.

$form->addText('name', 'Имя:')
	->setRequired()
	->setNullable();

Этот метод автоматически проверяет UTF-8, обрезает левые и правые пробелы и удаляет переносы строк, которые могут быть отправлены злоумышленником.

Максимальная длина может быть ограничена с помощью setMaxLength(). Функция addFilter() позволяет изменить введенное пользователем значение.

Вы можете изменить визуальный характер текстового поля на такие типы, как search, tel, или url с использованием setHtmlType(), как показано в спецификации. Помните, что изменение типа является только визуальным и не выполняет функции проверки. Для типа url целесообразно добавить специальное правило URL.

Для других типов ввода, таких как number, range, email, date, datetime-local, time и color, используйте специализированные методы addInteger, addFloat, addEmail addDate, addTime, addDateTime и addColor, которые обеспечивают валидацию на стороне сервера. Типы month и week пока не полностью поддерживаются во всех браузерах.

Для элемента может быть установлено так называемое «пустое значение», которое является чем-то вроде значения по умолчанию, но если пользователь не перезаписывает его, возвращает пустую строку или null.

$form->addText('phone', 'Телефон:')
	->setHtmlType('tel')
	->setEmptyValue('+420');

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

Добавляет многострочное текстовое поле (класс TextArea). Если пользователь не заполнил поле, возвращается пустая строка '', или используйте setNullable() для возврата null.

$form->addTextArea('note', 'Примечание:')
	->addRule($form::MaxLength, 'Ваша заметка слишком длинная', 10000);

Автоматически проверяет UTF-8 и нормализует переносы строк до \n. В отличие от однострочного поля ввода, в нем не обрезаются пробельные символы.

Максимальная длина может быть ограничена с помощью setMaxLength(). Функция addFilter() позволяет изменить введенное пользователем значение. Вы можете установить так называемое «пустое значение», используя setEmptyValue().

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

Добавляет поле ввода для целого числа (класс TextInput). Возвращает либо целое число, либо null, если пользователь ничего не ввел.

$form->addInteger('year', 'Year:')
	->addRule($form::Range, 'Год должен быть в диапазоне от %d до %d.', [1900, 2023 |1900, 2023]);

Элемент отображается как <input type="numeric">. Используя метод setHtmlType(), вы можете изменить тип на range для отображения в виде слайдера или на text, если вы предпочитаете обычное текстовое поле без специального поведения 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, 'Уровень должен находиться в диапазоне от %d до %d.', [0, 100 |0, 100]);

Элемент отображается как <input type="numeric">. Используя метод setHtmlType(), вы можете изменить тип на range для отображения в виде слайдера или на text, если вы предпочитаете обычное текстовое поле без специального поведения numeric.

Nette и браузер Chrome принимают запятую и точку в качестве десятичных разделителей. Чтобы сделать эту функцию доступной в Firefox, рекомендуется установить атрибут lang либо для конкретного элемента, либо для всей страницы, например, <html lang="cs">.

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

Добавляет поле адреса электронной почты с проверкой достоверности (класс TextInput). Если пользователь не заполнил поле, возвращается пустая строка '', или используйте setNullable() для возврата null.

$form->addEmail('email', 'Имейл:');

Проверяет, что значение является действительным адресом электронной почты. Он не проверяет, существует ли домен на самом деле, проверяется только синтаксис. Автоматически проверяет UTF-8, обрезает левые и правые пробелы.

Максимальная длина может быть ограничена с помощью setMaxLength(). Функция addFilter() позволяет изменить введенное пользователем значение. Вы можете установить так называемое «пустое значение», используя setEmptyValue().

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

Добавляет поле пароля (класс TextInput).

$form->addPassword('password', 'Пароль:')
	->setRequired()
	->addRule($form::MinLength, 'Пароль должен быть длиной не менее %d символов', 8)
	->addRule($form::Pattern, 'Пароль должен содержать цифры', '.*[0-9].*');

При повторной отправке формы ввод будет пустым. Он автоматически проверяет UTF-8, обрезает левые и правые пробелы и удаляет переносы строк, которые могут быть отправлены злоумышленником.

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

Добавляет флажок (класс Checkbox). Поле возвращает либо true, либо false, в зависимости от того, проверено ли оно.

$form->addCheckbox('agree', 'Я согласен с условиями')
	->setRequired('Вы должны согласиться с нашими условиями');

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

Добавляет список флажков для выбора нескольких элементов (класс CheckboxList). Возвращает массив ключей выбранных элементов. Метод getSelectedItems() возвращает значения вместо ключей.

$form->addCheckboxList('colors', 'Цвета:', [
	'r' => 'red',
	'g' => 'green',
	'b' => 'blue',
]);

Мы передаем массив элементов в качестве третьего параметра или методом setItems().

Вы можете использовать setDisabled(['r', 'g']) для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранные элементы действительно являются одними из предложенных и не были отключены. Метод getRawValue() может быть использован для получения отправленных элементов без этой важной проверки.

При установке значений по умолчанию также проверяется, что они являются одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью checkDefaultValue(false).

Если вы отправляете форму с помощью метода GET, вы можете выбрать более компактный способ передачи данных, который позволяет сэкономить на размере строки запроса. Это активируется установкой атрибута HTML формы:

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

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

Добавляет радиокнопки (класс RadioList). Возвращает ключ выбранного элемента или null, если пользователь ничего не выбрал. Метод getSelectedItem() возвращает значение вместо ключа.

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

Мы передаем массив элементов в качестве третьего параметра или методом setItems().

Вы можете использовать setDisabled(['m']) для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранный элемент действительно является одним из предложенных и не был отключен. Метод getRawValue() может быть использован для получения отправленного элемента без этой важной проверки.

При установке значения по умолчанию проверяется, что оно является одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью checkDefaultValue(false).

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

Добавляет поле выбора (класс SelectBox). Возвращает ключ выбранного элемента или null, если пользователь ничего не выбрал. Метод getSelectedItem() возвращает значение вместо ключа.

$countries = [
	'CZ' => 'Чешская республика',
	'SK' => 'Словакия',
	'GB' => 'Великобритания',
];

$form->addSelect('country', 'Страна:', $countries)
	->setDefaultValue('SK');

Мы передаем массив элементов в качестве третьего параметра или методом setItems(). Массив элементов также может быть двумерным:

$countries = [
	'Europe' => [
		'CZ' => 'Чешская республика',
		'SK' => 'Словакия',
		'GB' => 'Великобритания',
	],
	'CA' => 'Канада',
	'US' => 'США',
	'?'  => 'другая',
];

В блоках выбора первый элемент часто имеет особое значение, он служит призывом к действию. Используйте метод setPrompt() для добавления такой записи.

$form->addSelect('country', 'Страна:', $countries)
	->setPrompt('Выберите страну');

Вы можете использовать setDisabled(['CZ', 'SK']) для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранный элемент действительно является одним из предложенных и не был отключен. Метод getRawValue() может быть использован для получения отправленного элемента без этой важной проверки.

При установке значения по умолчанию проверяется, что оно является одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью checkDefaultValue(false).

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

Добавляет окно выбора нескольких вариантов (класс MultiSelectBox). Возвращает массив ключей выбранных элементов. Метод getSelectedItems() возвращает значения вместо ключей.

$form->addMultiSelect('countries', 'Страны:', $countries);

Мы передаем массив элементов в качестве третьего параметра или методом setItems(). Массив элементов также может быть двумерным.

Вы можете использовать setDisabled(['CZ', 'SK']) для отключения отдельных элементов.

Элемент автоматически проверяет, что не было подделки и что выбранные элементы действительно являются одними из предложенных и не были отключены. Метод getRawValue() может быть использован для получения отправленных элементов без этой важной проверки.

При установке значений по умолчанию также проверяется, что они являются одним из предлагаемых элементов, в противном случае возникает исключение. Эта проверка может быть отключена с помощью checkDefaultValue(false).

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

Добавляет поле загрузки файлов (класс UploadControl). Возвращает объект FileUpload, даже если пользователь не загрузил файл, что можно выяснить с помощью метода FileUpload::hasFile().

$form->addUpload('avatar', 'Аватар:')
	->addRule($form::Image, 'Аватар должен быть в формате JPEG, PNG, GIF или WebP')
	->addRule($form::MaxFileSize, 'Максимальный размер - 1 МБ', 1024 * 1024);

Если файл загружен неправильно, форма не была отправлена успешно и отображается ошибка. Т. е. нет необходимости проверять метод FileUpload::isOk().

Не доверяйте оригинальному имени файла, возвращаемому методом FileUpload::getName(), клиент может отправить вредоносное имя файла с намерением испортить или взломать ваше приложение.

Правила MimeType и Image определяют необходимый тип файла или изображения по его сигнатуре. Целостность всего файла не проверяется. Вы можете узнать, не повреждено ли изображение, например, попытавшись загрузить его.

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

Добавляет поле загрузки нескольких файлов (класс UploadControl). Возвращает массив объектов FileUpload. Метод FileUpload::hasFile() вернет true для каждого из них.

$form->addMultiUpload('files', 'Файлы:')
	->addRule($form::MaxLength, 'Может быть загружено не более %d файлов', 10);

Если один из файлов не загрузится правильно, форма не будет отправлена успешно и отобразится ошибка. Т. е. нет необходимости проверять метод FileUpload::isOk().

Не доверяйте оригинальным именам файлов, возвращаемым методом FileUpload::getName(), клиент может отправить вредоносное имя файла с намерением испортить или взломать ваше приложение.

Правила MimeType и Image определяют необходимый тип файла или изображения по его сигнатуре. Целостность всего файла не проверяется. Вы можете узнать, не повреждено ли изображение, например, попытавшись загрузить его.

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

Добавляет поле, позволяющее пользователю легко вводить дату, состоящую из года, месяца и дня (класс DateTimeControl).

В качестве значения по умолчанию он принимает либо объекты, реализующие DateTimeInterface, либо строку с временем, либо число, представляющее временную метку UNIX. То же самое относится и к аргументам правил Min, Max или Range, которые определяют минимально и максимально допустимую дату.

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

По умолчанию возвращается объект DateTimeImmutable. С помощью метода setFormat() можно задать текстовый формат или временную метку:

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

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

Добавляет поле, позволяющее пользователю легко вводить время, состоящее из часов, минут и, по желанию, секунд (класс DateTimeControl).

В качестве значения по умолчанию оно принимает либо объекты, реализующие DateTimeInterface, либо строку с временем, либо число, представляющее временную метку UNIX. Используется только информация о времени из этих входов, дата игнорируется. То же самое относится и к аргументам правил Min, Max или Range, которые определяют минимальное и максимальное допустимое время. Если минимальное значение больше максимального, то создается временной диапазон, охватывающий полночь.

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

По умолчанию он возвращает объект DateTimeImmutable (с датой 1 января, год 1). С помощью метода setFormat() можно задать текстовый формат:

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

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

Добавляет поле, позволяющее пользователю легко вводить дату и время, состоящие из года, месяца, дня, часов, минут и, по желанию, секунд (класс DateTimeControl).

В качестве значения по умолчанию он принимает либо объекты, реализующие DateTimeInterface, либо строку с временем, либо число, представляющее временную метку UNIX. То же самое относится и к аргументам правил Min, Max или Range, которые определяют минимально и максимально допустимую дату.

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

По умолчанию возвращается объект DateTimeImmutable. С помощью метода setFormat() можно задать текстовый формат или временную метку:

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

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

Добавляет поле выбора цвета (класс ColorPicker). Цвет представляет собой строку в формате #rrggbb. Если пользователь не делает выбора, то по умолчанию возвращается черный цвет #000000.

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

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

Добавляет скрытое поле (класс HiddenField).

$form->addHidden('userid');

Используйте setNullable(), чтобы изменить его так, чтобы он возвращал null вместо пустой строки. Функция addFilter() позволяет изменить представленное значение.

Хотя элемент скрыт, важно понимать, что его значение все равно может быть изменено или подделано злоумышленником. Всегда тщательно проверяйте и проверяйте все полученные значения на стороне сервера, чтобы предотвратить риски безопасности, связанные с манипулированием данными.

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

Добавляет кнопку отправки (класс SubmitButton).

$form->addSubmit('submit', 'Зарегистрироваться');

В форме можно иметь более одной кнопки отправки:

$form->addSubmit('register', 'Зарегистрироваться');
$form->addSubmit('cancel', 'Отмена');

Чтобы узнать, какая из них была нажата, используйте:

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

Если вы не хотите проверять форму при нажатии кнопки отправки (например, кнопки Отмена или Предварительный просмотр), вы можете отключить её с помощью setValidationScope().

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

Добавляет кнопку (класс Button) без функции отправки. Это полезно для привязки другой функциональности к id, например, действия JavaScript.

$form->addButton('raise', 'Поднять зарплату')
	->setHtmlAttribute('onclick', 'raiseSalary()');

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

Добавляет кнопку отправки в виде изображения (класс ImageButton).

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

При использовании нескольких кнопок отправки можно узнать, какая из них была нажата с помощью $form['submit']->isSubmittedBy().

addContainer(string|int $name): Container

Добавляет подформу (класс Container), или контейнер, с которым можно обращаться так же, как и с формой. Это означает, что вы можете использовать такие методы, как setDefaults() или getValues().

$sub1 = $form->addContainer('first');
$sub1->addText('name', 'Ваше имя:');
$sub1->addEmail('email', 'Имейл:');

$sub2 = $form->addContainer('second');
$sub2->addText('name', 'Ваше имя:');
$sub2->addEmail('email', 'Имейл:');

Затем отправленные данные возвращаются в виде многомерной структуры:

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

Обзор настроек

Для всех элементов мы можем вызывать следующие методы (полный обзор см. в документации по API):

setDefaultValue($value) устанавливает значение по умолчанию
getValue() получить текущее значение
setOmitted() omitted values
setDisabled() disabling inputs

Рендеринг:

setCaption() изменить заголовка элемента
setTranslator() задает транслятор
setHtmlAttribute() задает HTML атрибут элемента
setHtmlId() задает HTML атрибут id
setHtmlType() задает HTML атрибут type
setHtmlName() задает HTML атрибут name
setOption() задает рендеринг данных

Валидация:

setRequired() обязательное поле
addRule() установить правило проверки
addCondition(), addConditionOn() установить условие проверки
addError() передача сообщения об ошибке

Следующие методы могут быть вызваны для элементов addText(), addPassword(), addTextArea(), addEmail(), addInteger():

setNullable() устанавливает, возвращает ли getValue() null вместо пустой строки
setEmptyValue() устанавливает специальное значение, которое рассматривается как пустая строка
setMaxLength() устанавливает максимальное количество разрешенных символов
addFilter() изменение входных значений

Опущенные значения

Если вас не интересует значение, введенное пользователем, мы можем использовать setOmitted(), чтобы опустить его из результата, предоставляемого методом $form->getValues() или передаваемого обработчикам. Это подходит для различных паролей для проверки, антиспамовых полей и т. д.

$form->addPassword('passwordVerify', 'Повторите пароль:')
	->setRequired('Введите пароль ещё раз, чтобы проверить опечатку')
	->addRule($form::Equal, 'Несоответствие пароля', $form['password'])
	->setOmitted();

Отключение элементов ввода

Входы можно отключить с помощью setDisabled(). Отключенный вход не может быть отредактирован пользователем.

$form->addText('username', 'Имя пользователя:')
	->setDisabled();

Отключенные входы не отправляются браузером на сервер, поэтому вы не найдете их в данных, возвращаемых функцией $form->getValues(). Однако если вы зададите setOmitted(false), Nette включит их значение по умолчанию в эти данные.

Когда вызывается setDisabled(), значение входных данных стирается в целях безопасности. Если вы устанавливаете значение по умолчанию, необходимо сделать это после его деактивации:

$form->addText('username', 'Имя пользователя:')
	->setDisabled()
	->setDefaultValue($userName);

Альтернативой отключенным входам являются поля с атрибутом HTML readonly, которые отправляются на сервер браузером. Хотя это поле можно только читать, важно понимать, что его значение все равно может быть изменено или подделано злоумышленником.

Пользовательские элементы управления

Помимо широкого спектра встроенных элементов управления формой, вы можете добавить свои элементы следующим образом:

$form->addComponent(new DateInput('Дата:'), 'date');
// альтернативный синтаксис: $form['date'] = new DateInput('Дата:');

Форма является потомком класса Container, а элементы являются потомками Component.

Существует способ определения новых методов формы для добавления пользовательских элементов (например, ‚$form->addZip()‘). Это так называемые методы расширения. Недостатком является то, что подсказки кода в редакторах не будут работать для них.

use Nette\Forms\Container;

// добавляет метод 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, 'Не менее 5 номеров', '[0-9]{5}');
});

// использование
$form->addZip('zip', 'ZIP-код:');

Низкоуровневые поля

Чтобы добавить элемент в форму, не нужно вызывать ‚$form->addXyz()‘. Вместо этого элементы формы могут быть введены исключительно в шаблоны. Это полезно, если вам, например, нужно создать динамические элементы:

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

После отправки можно получить значения:

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

В первом параметре вы указываете тип элемента (DataFile для type=file, DataLine для однострочных вводов типа text, password или email и DataText для остальных). Второй параметр соответствует HTML-атрибуту name. Если вам нужно сохранить ключи, вы можете объединить первый параметр с DataKeys. Это полезно для select, radioList или checkboxList.

Функция getHttpData() возвращает обработанные данные. В этом случае это всегда будет массив допустимых строк UTF-8, независимо от того, что атакующий отправил через форму. Это альтернатива работе с $_POST или $_GET напрямую, если вы хотите получать безопасные данные.