Nette Documentation Preview

syntax
フォームの要素
*******

.[perex]
標準のフォームの要素の一覧です。


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

1 行のテキストの入力欄を足します(クラス [TextInput |api:Nette\Forms\Controls\TextInput])。利用者がその項目を埋めなければ空の文字列 `''` を返します。`setNullable()` を使えば代わりに `null` を返させられます。

```php
$form->addText('name', '名前:')
	->setRequired()
	->setNullable();
```

UTF-8 を自動的に検証し、前後の空白を取り除き、攻撃者が送るかもしれない改行を取り除きます。

長さの上限は `setMaxLength()` で決められます。[addFilter() |validation#入力された値を変える]メソッドで、利用者が入力した値を変えられます。

`setHtmlType()` を使うと、テキストの項目の見た目を [仕様|https://developer.mozilla.org/en-US/docs/Learn/Forms/HTML5_input_types]で定められた `search`、`tel`、`url` などの種類に変えられます。種類を変えるのは純粋に見た目の話で、検証の働きの代わりにはならないことを覚えておいてください。`url` の種類には、専用の [URL の検証の規則 |validation#テキストの入力]を足すとよいでしょう。

.[note]
`number`、`range`、`email`、`date`、`datetime-local`、`time`、`color` といったほかの入力の種類には、サーバー側の検証も備えた [#addInteger()]、[#addFloat()]、[#addEmail()]、[#addDate()]、[#addTime()]、[#addDateTime()]、[#addColor()]といった専用のメソッドを使ってください。`month` と `week` の種類は、まだすべてのブラウザが十分に対応していません。

要素には「空の値」を設定できます。これは既定値のように振る舞いますが、利用者がそれを変えなければ、要素は空の文字列か `null` を返します。

```php
$form->addText('phone', '電話:')
	->setHtmlType('tel')
	->setEmptyValue('+420');
```


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

複数行のテキストの入力欄を足します(クラス [TextArea |api:Nette\Forms\Controls\TextArea])。利用者がその項目を埋めなければ空の文字列 `''` を返します。`setNullable()` を使えば代わりに `null` を返させられます。

```php
$form->addTextArea('note', 'メモ:')
	->addRule($form::MaxLength, 'メモが長すぎます', 10000);
```

UTF-8 を自動的に検証し、改行を `\n` にそろえます。1 行の入力欄と違って、空白の切り詰めは起きません。

長さの上限は `setMaxLength()` で決められます。[addFilter() |validation#入力された値を変える]メソッドで、利用者が入力した値を変えられます。空の値は `setEmptyValue()` で設定できます。


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

整数を入力する欄を足します(クラス [TextInput |api:Nette\Forms\Controls\TextInput])。整数を返すか、利用者が何も入力しなければ `null` を返します。

```php
$form->addInteger('year', '年:')
	->addRule($form::Range, '年は %d から %d のあいだでなければなりません。', [1900, 2023]);
```

この要素は `<input type="number">` として描かれます。`setHtmlType()` メソッドで、種類を `range` にしてスライダーとして表示させたり、`number` の種類の特別な振る舞いのないふつうのテキストの項目がよければ `text` にしたりできます。


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

浮動小数点数を入力する欄を足します(クラス [TextInput |api:Nette\Forms\Controls\TextInput])。float を返すか、利用者が何も入力しなければ `null` を返します。

```php
$form->addFloat('level', 'レベル:')
	->setDefaultValue(0)
	->addRule($form::Range, 'レベルは %d から %d のあいだでなければなりません。', [0, 100]);
```

この要素は `<input type="number">` として描かれます。`setHtmlType()` メソッドで、種類を `range` にしてスライダーとして表示させたり、`number` の種類の特別な振る舞いのないふつうのテキストの項目がよければ `text` にしたりできます。

Nette と Chrome のブラウザは、小数点としてコンマもドットも受け付けます。Firefox でもこれを働かせるには、その要素かページ全体に `lang` 属性を設定するとよいでしょう。たとえば `<html lang="en">` です。


addEmail(string $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#入力された値を変える]メソッドで、利用者が入力した値を変えられます。空の値は `setEmptyValue()` で設定できます。


addPassword(string $name, $label=null, ?int $cols=null, ?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 $name, $caption=null): Checkbox .[method]
============================================================

チェックボックスを足します(クラス [Checkbox |api:Nette\Forms\Controls\Checkbox])。入っているかどうかに応じて `true` か `false` を返します。

```php
$form->addCheckbox('agree', '利用条件に同意します')
	->setRequired('利用条件に同意していただく必要があります');
```


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

複数の項目を選ぶためのチェックボックスの一覧を足します(クラス [CheckboxList |api:Nette\Forms\Controls\CheckboxList])。選ばれた項目のキーの配列を返します。`getSelectedItems()` メソッドは、選ばれた項目をキーと値の組として返します。

```php
$form->addCheckboxList('colors', '色:', [
	'r' => '赤',
	'g' => '緑',
	'b' => '青',
]);
```

提示する項目の配列は第 3 パラメータで渡すか、`setItems()` メソッドで渡します。`setItems()` の第 2 引数に `false` を渡すと、値がキーとしても使われます。

個々の項目を無効にするには `setDisabled(['r', 'g'])` を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら `getRawValue()` メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は `checkDefaultValue(false)` で切れます。

フォームを `GET` メソッドで送信しているなら、クエリ文字列の大きさを節約する、もっとこぢんまりしたデータの送り方を選べます。フォームに HTML の属性を設定して有効にします。

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


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

ラジオボタンを足します(クラス [RadioList |api:Nette\Forms\Controls\RadioList])。選ばれた項目のキーを返し、利用者が何も選ばなければ `null` を返します。`getSelectedItem()` メソッドはキーではなく値を返します。

```php
$sex = [
	'm' => '男性',
	'f' => '女性',
	'o' => 'その他',
];
$form->addRadioList('gender', '性別:', $sex);
```

提示する項目の配列は第 3 パラメータで渡すか、`setItems()` メソッドで渡します。

個々の項目を無効にするには `setDisabled(['m'])` を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら `getRawValue()` メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は `checkDefaultValue(false)` で切れます。


addSelect(string $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');
```

提示する項目の配列は第 3 パラメータで渡すか、`setItems()` メソッドで渡します。項目は 2 次元の配列にもできます(optgroup を表します)。

```php
$countries = [
	'ヨーロッパ' => [
		'CZ' => 'チェコ共和国',
		'SK' => 'スロバキア',
		'GB' => 'イギリス',
	],
	'CA' => 'カナダ',
	'US' => 'アメリカ',
	'?'  => 'その他',
];
```

セレクトボックスでは、最初の項目が特別な意味を持ち、操作を促す役目を果たすことがよくあります。そうした項目を足すには `setPrompt()` メソッドを使います。

```php
$form->addSelect('country', '国:', $countries)
	->setPrompt('国を選んでください');
```

個々の項目を無効にするには `setDisabled(['CZ', 'SK'])` を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら `getRawValue()` メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は `checkDefaultValue(false)` で切れます。


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

複数の項目を選ぶためのセレクトボックスを足します(クラス [MultiSelectBox |api:Nette\Forms\Controls\MultiSelectBox])。選ばれた項目のキーの配列を返します。`getSelectedItems()` メソッドは、選ばれた項目をキーと値の組として返します。

```php
$form->addMultiSelect('countries', '国:', $countries);
```

提示する項目の配列は第 3 パラメータで渡すか、`setItems()` メソッドで渡します。項目は 2 次元の配列にもできます。

個々の項目を無効にするには `setDisabled(['CZ', 'SK'])` を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら `getRawValue()` メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は `checkDefaultValue(false)` で切れます。


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

ファイルのアップロードの項目を足します(クラス [UploadControl |api:Nette\Forms\Controls\UploadControl])。利用者がファイルをアップロードしなかった場合も [FileUpload |http:request#FileUpload]オブジェクトを返します。それは `FileUpload::hasFile()` メソッドで確かめられます。`setNullable()` を使うと、ファイルがアップロードされなかったときに `FileUpload` オブジェクトではなく `null` を返させられます。

```php
$form->addUpload('avatar', 'アバター:')
	->addRule($form::Image, 'アバターは JPEG、PNG、GIF、WebP、AVIF でなければなりません。')
	->addRule($form::MaxFileSize, '大きさの上限は 1 MB です。', 1024 * 1024);
```

ファイルが正しくアップロードされなければ、フォームの送信は成功せず、エラーが表示されます。つまり送信が成功したなら、`FileUpload::isOk()` メソッドを確かめる必要はありません。

`FileUpload::getName()` メソッドが返すもとのファイル名は決して信じないでください。クライアントは、あなたのアプリケーションを壊したり乗っ取ったりするつもりで、悪意のあるファイル名を送っているかもしれません。

`MimeType` と `Image` の規則は、求める種類をファイルの署名から見分けるもので、その健全さは確かめません。画像が壊れているかどうかは、たとえば[読み込んでみる |http:request#toImage()]ことで判断できます。


addMultiUpload(string $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 $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', '日付:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, '日付は少なくとも 1 か月前でなければなりません。', new DateTime('-1 month'));
```

既定では `DateTimeImmutable` オブジェクトを返します。`setFormat()` メソッドで、[テキストの書式|https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters]やタイムスタンプを指定できます。

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


addTime(string $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', '時刻:', withSeconds: true)
	->addRule($form::Range, '時刻は %d から %d のあいだでなければなりません。', ['12:30', '13:30']);
```

既定では `DateTimeImmutable` オブジェクトを返します(日付は 1 年 1 月 1 日になります)。`setFormat()` メソッドで[テキストの書式|https://www.php.net/manual/en/datetime.format.php#refsect1-datetime.format-parameters]を指定できます。

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


addDateTime(string $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', '日付と時刻:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, '日付は少なくとも 1 か月前でなければなりません。', 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 $name, $label=null): ColorPicker .[method]{data-version:3.1.14}
===============================================================================

色を選ぶ項目を足します(クラス [ColorPicker |api:Nette\Forms\Controls\ColorPicker])。色は `#rrggbb` の書式の文字列として返されます。利用者が何も選ばなければ、黒 `#000000` を返します。

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


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

隠しの項目を足します(クラス [HiddenField |api:Nette\Forms\Controls\HiddenField])。

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

`setNullable()` を使うと、空の文字列ではなく `null` を返させられます。[addFilter() |validation#入力された値を変える]メソッドで、送信された値を変えられます。

この要素は隠れていますが、**その値は攻撃者に書き換えられたり偽られたりしうる**ことを忘れないでください。データの改ざんにまつわるセキュリティリスクを防ぐために、受け取ったすべての値をサーバー側でいつも入念に確かめ、検証してください。


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

送信ボタンを足します(クラス [SubmitButton |api:Nette\Forms\Controls\SubmitButton])。

```php
$form->addSubmit('submit', '送信');
```

.{data-version:3.3.0}
ハンドラは `onClick` イベントに結び付ける代わりに、第 3 パラメータ `$onSubmit` としてボタンに直接渡せます。

```php
$form->addSubmit('submit', '送信', function (SubmitButton $button, $data): void {
	// ...
});
```

フォームには送信ボタンを 2 つ以上置けます。

```php
$form->addSubmit('register', '登録');
$form->addSubmit('cancel', 'キャンセル');
```

どれが押されたかを判断するには次のようにします。

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

ボタンを押したときにフォーム全体を検証したくないなら(たとえば *キャンセル* や *プレビュー* のボタン)、[setValidationScope() |validation#検証を切る]を使ってください。


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

送信の働きを持たないボタンを足します(クラス [Button |api:Nette\Forms\Controls\Button])。ですからほかの用途に、たとえばクリックしたときに JavaScript の関数を呼ぶのに使えます。

```php
$form->addButton('raise', '給料を上げる')
	->setHtmlAttribute('onclick', 'raiseSalary()');
```


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

画像の形の送信ボタンを足します(クラス [ImageButton |api:Nette\Forms\Controls\ImageButton])。

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

送信ボタンを複数使うときは、`$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' => /* ... */,
	],
]
```


設定の一覧
=====

すべての要素で次のメソッドを呼べます(完全な一覧は [API のドキュメント|https://api.nette.org/forms/master/Nette/Forms/Controls.html]をご覧ください)。

.[table-form-methods language-php]
| `setDefaultValue($value)` | 既定値を設定します
| `getValue()` 				| 今の値を取り出します
| `setOmitted()` 			| [#外される値]
| `setDisabled()` 			| [#入力を無効にする]

描画:
.[table-form-methods language-php]
| `setCaption($caption)`	| 要素のラベルを変えます
| `setTranslator($translator)` | [翻訳器 |rendering#翻訳]を設定します
| `setHtmlAttribute($name, $value)` | 要素に [HTML の属性 |rendering#HTML の属性]を設定します
| `setHtmlId($id)` 			| HTML の `id` 属性を設定します
| `setOption($key, $value)` | [描画のオプションを設定します |rendering#オプション]

検証:
.[table-form-methods language-php]
| `setRequired()` 			| 要素を[必須 |validation]にします
| `addRule()` 				| [検証の規則 |validation#規則]を足します
| `addCondition()`, `addConditionOn()` | [検証の条件 |validation#条件]を設定します
| `addError($message)`		| [エラーのメッセージを足します |validation#エラーの処理]

`addText()`、`addPassword()`、`addTextArea()`、`addEmail()`、`addInteger()`、`addFloat()` の要素では、次のメソッドを呼べます。

.[table-form-methods language-php]
| `setNullable()` 			| getValue() が空の文字列ではなく `null` を返すかを設定します
| `setEmptyValue($value)`	| 空の文字列と見なす特別な値を設定します
| `setMaxLength($length)`	| 許される文字数の上限を設定します
| `addFilter($filter)`		| [入力を変えます |validation#入力された値を変える]


外される値
=====

利用者が埋めた値に関心がないなら、`setOmitted()` を使って `$form->getValues()` メソッドの結果やハンドラに渡されるデータからそれを外せます。パスワードの確認の項目やスパム対策の要素などに便利です。

```php
$form->addPassword('passwordVerify', 'パスワード(確認):')
	->setRequired('打ち間違いを確かめるために、もう一度パスワードを入力してください')
	->addRule($form::Equal, 'パスワードが一致しません', $form['password'])
	->setOmitted();
```


入力を無効にする
========

要素は `setDisabled()` で無効にできます。無効な要素は利用者が編集できません。

```php
$form->addText('username', 'ユーザー名:')
	->setDisabled();
```

無効な要素はブラウザからサーバーへまったく送られないので、`$form->getValues()` 関数が返すデータの中にも現れません。とはいえ `setOmitted(false)` を設定すれば、Nette はその既定値をそのデータに含めます。

`setDisabled()` を呼ぶと、安全のために**その要素の値は消されます**。既定値を設定するなら、無効にしたあとで行う必要があります。

```php
$form->addText('username', 'ユーザー名:')
	->setDisabled()
	->setDefaultValue($userName);
```

無効な要素の代わりになるのが、HTML の `readonly` 属性の付いた要素です。こちらはブラウザがサーバーへ送ります。読み取り専用の要素ではありますが、**その値は攻撃者に書き換えられたり偽られたりしうる**ことを忘れないでください。


独自の要素
=====

幅広い組み込みのフォームの要素のほかに、フォームには独自の要素を足せます。

```php
$form->addComponent(new DateInput('日付:'), 'date');
// 別の書き方: $form['date'] = new DateInput('日付:');
```

そうした要素を、送信されたデータの読み出しや検証、描画も含めてどう書くかは、[独立した章 |custom-controls]で説明しています。そこでは `$form->addZip()` のような独自の追加のメソッドを作れる拡張のメソッドについても学べます。


低水準の項目
======

テンプレートにだけ書かれ、`$form->addXyz()` のメソッドではフォームに足されていない要素も使えます。たとえばデータベースのレコードを並べるとき、その数も ID もあらかじめ分からず、行ごとにチェックボックスやラジオボタンを表示したい場合、テンプレートにそのまま書けます。

```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[]');
```

第 1 パラメータは要素の種類(`type=file` なら `DataFile`、`text`、`password`、`email` などの 1 行の入力なら `DataLine`、そのほかはすべて `DataText`)で、第 2 パラメータの `sel[]` は HTML の name 属性に対応します。要素の種類は `DataKeys` の値と組み合わせられ、そうすると要素のキーが保たれます。これは `select`、`radioList`、`checkboxList` でとりわけ便利です。

大事なのは、`getHttpData()` が清められた値を返すことです。この場合、攻撃者がサーバーへ何を送ろうとしても、結果はいつも正しい UTF-8 の文字列の配列になります。これは `$_POST` や `$_GET` を直接扱うのに似ていますが、Nette の標準のフォームの要素で慣れているのと同じく、いつもきれいなデータが返るという大きな違いがあります。

フォームの要素

標準のフォームの要素の一覧です。

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

1 行のテキストの入力欄を足します(クラス TextInput)。利用者がその項目を埋めなければ空の文字列 '' を返します。setNullable() を使えば代わりに null を返させられます。

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

UTF-8 を自動的に検証し、前後の空白を取り除き、攻撃者が送るかもしれない改行を取り除きます。

長さの上限は setMaxLength() で決められます。addFilter()メソッドで、利用者が入力した値を変えられます。

setHtmlType() を使うと、テキストの項目の見た目を 仕様で定められた searchtelurl などの種類に変えられます。種類を変えるのは純粋に見た目の話で、検証の働きの代わりにはならないことを覚えておいてください。url の種類には、専用の URL の検証の規則を足すとよいでしょう。

numberrangeemaildatedatetime-localtimecolor といったほかの入力の種類には、サーバー側の検証も備えた addInteger()addFloat()addEmail()addDate()addTime()addDateTime()addColor()といった専用のメソッドを使ってください。monthweek の種類は、まだすべてのブラウザが十分に対応していません。

要素には「空の値」を設定できます。これは既定値のように振る舞いますが、利用者がそれを変えなければ、要素は空の文字列か null を返します。

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

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

複数行のテキストの入力欄を足します(クラス TextArea)。利用者がその項目を埋めなければ空の文字列 '' を返します。setNullable() を使えば代わりに null を返させられます。

$form->addTextArea('note', 'メモ:')
	->addRule($form::MaxLength, 'メモが長すぎます', 10000);

UTF-8 を自動的に検証し、改行を \n にそろえます。1 行の入力欄と違って、空白の切り詰めは起きません。

長さの上限は setMaxLength() で決められます。addFilter()メソッドで、利用者が入力した値を変えられます。空の値は setEmptyValue() で設定できます。

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

整数を入力する欄を足します(クラス TextInput)。整数を返すか、利用者が何も入力しなければ null を返します。

$form->addInteger('year', '年:')
	->addRule($form::Range, '年は %d から %d のあいだでなければなりません。', [1900, 2023]);

この要素は <input type="number"> として描かれます。setHtmlType() メソッドで、種類を range にしてスライダーとして表示させたり、number の種類の特別な振る舞いのないふつうのテキストの項目がよければ text にしたりできます。

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

浮動小数点数を入力する欄を足します(クラス TextInput)。float を返すか、利用者が何も入力しなければ null を返します。

$form->addFloat('level', 'レベル:')
	->setDefaultValue(0)
	->addRule($form::Range, 'レベルは %d から %d のあいだでなければなりません。', [0, 100]);

この要素は <input type="number"> として描かれます。setHtmlType() メソッドで、種類を range にしてスライダーとして表示させたり、number の種類の特別な振る舞いのないふつうのテキストの項目がよければ text にしたりできます。

Nette と Chrome のブラウザは、小数点としてコンマもドットも受け付けます。Firefox でもこれを働かせるには、その要素かページ全体に lang 属性を設定するとよいでしょう。たとえば <html lang="en"> です。

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

メールアドレスを入力する欄を足します(クラス TextInput)。利用者がその項目を埋めなければ空の文字列 '' を返します。setNullable() を使えば代わりに null を返させられます。

$form->addEmail('email', 'メール:');

値が正しいメールアドレスかを検証します。そのドメインが実在するかは調べず、書式だけを確かめます。UTF-8 を自動的に検証し、前後の空白を取り除きます。

長さの上限は setMaxLength() で決められます。addFilter()メソッドで、利用者が入力した値を変えられます。空の値は setEmptyValue() で設定できます。

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

パスワードの入力欄を足します(クラス TextInput)。

$form->addPassword('password', 'パスワード:')
	->setRequired()
	->addRule($form::MinLength, 'パスワードは %d 文字以上でなければなりません', 8)
	->addRule($form::Pattern, 'パスワードには数字を含めてください', '.*[0-9].*');

フォームがもう一度表示されるとき、この項目は空になります。UTF-8 を自動的に検証し、前後の空白を取り除き、攻撃者が送るかもしれない改行を取り除きます。

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

チェックボックスを足します(クラス Checkbox)。入っているかどうかに応じて truefalse を返します。

$form->addCheckbox('agree', '利用条件に同意します')
	->setRequired('利用条件に同意していただく必要があります');

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

複数の項目を選ぶためのチェックボックスの一覧を足します(クラス CheckboxList)。選ばれた項目のキーの配列を返します。getSelectedItems() メソッドは、選ばれた項目をキーと値の組として返します。

$form->addCheckboxList('colors', '色:', [
	'r' => '赤',
	'g' => '緑',
	'b' => '青',
]);

提示する項目の配列は第 3 パラメータで渡すか、setItems() メソッドで渡します。setItems() の第 2 引数に false を渡すと、値がキーとしても使われます。

個々の項目を無効にするには setDisabled(['r', 'g']) を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら getRawValue() メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は checkDefaultValue(false) で切れます。

フォームを GET メソッドで送信しているなら、クエリ文字列の大きさを節約する、もっとこぢんまりしたデータの送り方を選べます。フォームに HTML の属性を設定して有効にします。

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

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

ラジオボタンを足します(クラス RadioList)。選ばれた項目のキーを返し、利用者が何も選ばなければ null を返します。getSelectedItem() メソッドはキーではなく値を返します。

$sex = [
	'm' => '男性',
	'f' => '女性',
	'o' => 'その他',
];
$form->addRadioList('gender', '性別:', $sex);

提示する項目の配列は第 3 パラメータで渡すか、setItems() メソッドで渡します。

個々の項目を無効にするには setDisabled(['m']) を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら getRawValue() メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は checkDefaultValue(false) で切れます。

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

セレクトボックスを足します(クラス SelectBox)。選ばれた項目のキーを返し、利用者が何も選ばなければ null を返します。getSelectedItem() メソッドはキーではなく値を返します。

$countries = [
	'CZ' => 'チェコ共和国',
	'SK' => 'スロバキア',
	'GB' => 'イギリス',
];

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

提示する項目の配列は第 3 パラメータで渡すか、setItems() メソッドで渡します。項目は 2 次元の配列にもできます(optgroup を表します)。

$countries = [
	'ヨーロッパ' => [
		'CZ' => 'チェコ共和国',
		'SK' => 'スロバキア',
		'GB' => 'イギリス',
	],
	'CA' => 'カナダ',
	'US' => 'アメリカ',
	'?'  => 'その他',
];

セレクトボックスでは、最初の項目が特別な意味を持ち、操作を促す役目を果たすことがよくあります。そうした項目を足すには setPrompt() メソッドを使います。

$form->addSelect('country', '国:', $countries)
	->setPrompt('国を選んでください');

個々の項目を無効にするには setDisabled(['CZ', 'SK']) を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら getRawValue() メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は checkDefaultValue(false) で切れます。

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

複数の項目を選ぶためのセレクトボックスを足します(クラス MultiSelectBox)。選ばれた項目のキーの配列を返します。getSelectedItems() メソッドは、選ばれた項目をキーと値の組として返します。

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

提示する項目の配列は第 3 パラメータで渡すか、setItems() メソッドで渡します。項目は 2 次元の配列にもできます。

個々の項目を無効にするには setDisabled(['CZ', 'SK']) を使います。

この要素は、偽造がなかったこと、そして選ばれた項目が本当に提示されたものの中にあって無効にされていないことを自動的に確かめます。この大事な検査なしに送信された項目を取り出したいなら getRawValue() メソッドを使えます。

既定で選ばれる項目を設定するときも、それが提示されたものの中にあるかを確かめ、なければ例外を投げます。この検査は checkDefaultValue(false) で切れます。

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

ファイルのアップロードの項目を足します(クラス UploadControl)。利用者がファイルをアップロードしなかった場合も FileUploadオブジェクトを返します。それは FileUpload::hasFile() メソッドで確かめられます。setNullable() を使うと、ファイルがアップロードされなかったときに FileUpload オブジェクトではなく null を返させられます。

$form->addUpload('avatar', 'アバター:')
	->addRule($form::Image, 'アバターは JPEG、PNG、GIF、WebP、AVIF でなければなりません。')
	->addRule($form::MaxFileSize, '大きさの上限は 1 MB です。', 1024 * 1024);

ファイルが正しくアップロードされなければ、フォームの送信は成功せず、エラーが表示されます。つまり送信が成功したなら、FileUpload::isOk() メソッドを確かめる必要はありません。

FileUpload::getName() メソッドが返すもとのファイル名は決して信じないでください。クライアントは、あなたのアプリケーションを壊したり乗っ取ったりするつもりで、悪意のあるファイル名を送っているかもしれません。

MimeTypeImage の規則は、求める種類をファイルの署名から見分けるもので、その健全さは確かめません。画像が壊れているかどうかは、たとえば読み込んでみることで判断できます。

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

複数のファイルを一度にアップロードする項目を足します(クラス UploadControl)。FileUploadオブジェクトの配列を返します。そのそれぞれで FileUpload::hasFile() メソッドは true を返します。

$form->addMultiUpload('files', 'ファイル:')
	->addRule($form::MaxLength, 'アップロードできるファイルは %d 個までです。', 10);

どれかのファイルが正しくアップロードされなければ、フォームの送信は成功せず、エラーが表示されます。つまり送信が成功したなら、ファイルごとに FileUpload::isOk() メソッドを確かめる必要はありません。

FileUpload::getName() メソッドが返すもとのファイル名は決して信じないでください。クライアントは、あなたのアプリケーションを壊したり乗っ取ったりするつもりで、悪意のあるファイル名を送っているかもしれません。

MimeTypeImage の規則は、求める種類をファイルの署名から見分けるもので、その健全さは確かめません。画像が壊れているかどうかは、たとえば読み込んでみることで判断できます。

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

年、月、日から成る日付を簡単に入力できる項目を足します(クラス DateTimeControl)。

既定値としては、DateTimeInterface を実装するオブジェクト、時刻を含む文字列、UNIX タイムスタンプを表す数を受け取ります。許される最小と最大の日付を定める MinMaxRange の規則の引数も同じです。

$form->addDate('date', '日付:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, '日付は少なくとも 1 か月前でなければなりません。', new DateTime('-1 month'));

既定では DateTimeImmutable オブジェクトを返します。setFormat() メソッドで、テキストの書式やタイムスタンプを指定できます。

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

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

時、分、そして必要なら秒から成る時刻を簡単に入力できる項目を足します(クラス DateTimeControl)。

既定値としては、DateTimeInterface を実装するオブジェクト、時刻を含む文字列、UNIX タイムスタンプを表す数を受け取ります。そこから使われるのは時刻の情報だけで、日付は無視されます。許される最小と最大の時刻を定める MinMaxRange の規則の引数も同じです。設定した最小値が最大値より大きい場合は、真夜中をまたぐ時刻の範囲になります。

$form->addTime('time', '時刻:', withSeconds: true)
	->addRule($form::Range, '時刻は %d から %d のあいだでなければなりません。', ['12:30', '13:30']);

既定では DateTimeImmutable オブジェクトを返します(日付は 1 年 1 月 1 日になります)。setFormat() メソッドでテキストの書式を指定できます。

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

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

年、月、日、時、分、そして必要なら秒から成る日付と時刻の両方を簡単に入力できる項目を足します(クラス DateTimeControl)。

既定値としては、DateTimeInterface を実装するオブジェクト、時刻を含む文字列、UNIX タイムスタンプを表す数を受け取ります。許される最小と最大の日付と時刻を定める MinMaxRange の規則の引数も同じです。

$form->addDateTime('datetime', '日付と時刻:')
	->setDefaultValue(new DateTime)
	->addRule($form::Min, '日付は少なくとも 1 か月前でなければなりません。', new DateTime('-1 month'));

既定では DateTimeImmutable オブジェクトを返します。setFormat() メソッドで、テキストの書式やタイムスタンプを指定できます。

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

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

色を選ぶ項目を足します(クラス ColorPicker)。色は #rrggbb の書式の文字列として返されます。利用者が何も選ばなければ、黒 #000000 を返します。

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

addHidden(string $name, mixed $default=null): HiddenField

隠しの項目を足します(クラス HiddenField)。

$form->addHidden('userid');

setNullable() を使うと、空の文字列ではなく null を返させられます。addFilter()メソッドで、送信された値を変えられます。

この要素は隠れていますが、その値は攻撃者に書き換えられたり偽られたりしうることを忘れないでください。データの改ざんにまつわるセキュリティリスクを防ぐために、受け取ったすべての値をサーバー側でいつも入念に確かめ、検証してください。

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

送信ボタンを足します(クラス SubmitButton)。

$form->addSubmit('submit', '送信');

ハンドラは onClick イベントに結び付ける代わりに、第 3 パラメータ $onSubmit としてボタンに直接渡せます。

$form->addSubmit('submit', '送信', function (SubmitButton $button, $data): void {
	// ...
});

フォームには送信ボタンを 2 つ以上置けます。

$form->addSubmit('register', '登録');
$form->addSubmit('cancel', 'キャンセル');

どれが押されたかを判断するには次のようにします。

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

ボタンを押したときにフォーム全体を検証したくないなら(たとえば キャンセルプレビュー のボタン)、setValidationScope()を使ってください。

addButton(string $name, $caption=null)Button

送信の働きを持たないボタンを足します(クラス Button)。ですからほかの用途に、たとえばクリックしたときに JavaScript の関数を呼ぶのに使えます。

$form->addButton('raise', '給料を上げる')
	->setHtmlAttribute('onclick', 'raiseSalary()');

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

画像の形の送信ボタンを足します(クラス ImageButton)。

$form->addImageButton('submit', '/path/to/image.png', '送信');

送信ボタンを複数使うときは、$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() 外される値
setDisabled() 入力を無効にする

描画:

setCaption($caption) 要素のラベルを変えます
setTranslator($translator) 翻訳器を設定します
setHtmlAttribute($name, $value) 要素に HTML の属性を設定します
setHtmlId($id) HTML の id 属性を設定します
setOption($key, $value) 描画のオプションを設定します

検証:

setRequired() 要素を必須にします
addRule() 検証の規則を足します
addCondition(), addConditionOn() 検証の条件を設定します
addError($message) エラーのメッセージを足します

addText()addPassword()addTextArea()addEmail()addInteger()addFloat() の要素では、次のメソッドを呼べます。

setNullable() getValue() が空の文字列ではなく null を返すかを設定します
setEmptyValue($value) 空の文字列と見なす特別な値を設定します
setMaxLength($length) 許される文字数の上限を設定します
addFilter($filter) 入力を変えます

外される値

利用者が埋めた値に関心がないなら、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('日付:');

そうした要素を、送信されたデータの読み出しや検証、描画も含めてどう書くかは、独立した章で説明しています。そこでは $form->addZip() のような独自の追加のメソッドを作れる拡張のメソッドについても学べます。

低水準の項目

テンプレートにだけ書かれ、$form->addXyz() のメソッドではフォームに足されていない要素も使えます。たとえばデータベースのレコードを並べるとき、その数も ID もあらかじめ分からず、行ごとにチェックボックスやラジオボタンを表示したい場合、テンプレートにそのまま書けます。

{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[]');

第 1 パラメータは要素の種類(type=file なら DataFiletextpasswordemail などの 1 行の入力なら DataLine、そのほかはすべて DataText)で、第 2 パラメータの sel[] は HTML の name 属性に対応します。要素の種類は DataKeys の値と組み合わせられ、そうすると要素のキーが保たれます。これは selectradioListcheckboxList でとりわけ便利です。

大事なのは、getHttpData() が清められた値を返すことです。この場合、攻撃者がサーバーへ何を送ろうとしても、結果はいつも正しい UTF-8 の文字列の配列になります。これは $_POST$_GET を直接扱うのに似ていますが、Nette の標準のフォームの要素で慣れているのと同じく、いつもきれいなデータが返るという大きな違いがあります。