docs/guide-ja revised [skip ci] (#16015)

This commit is contained in:
Nobuo Kihara
2018-03-31 19:13:56 +09:00
committed by Alexander Makarov
parent 35c3ff2fbd
commit bd837bc9b1
97 changed files with 2971 additions and 2858 deletions

View File

@ -1,11 +1,11 @@
入力を検証する
==============
経験則として言えることは、エンドユーザから受信したデータは決して信用せず、利用する前に検証しなければならない、ということです。
経験則として言えることは、エンドユーザから受信したデータは決して信用せず、利用する前に検証しなければならない、ということです。
[モデル](structure-models.md) にユーザの入力が投入されたら、モデルの [[yii\base\Model::validate()]] メソッドを呼んで入力を検証することが出来ます。
このメソッドは検証が成功したか否かを示す真偽値を返します。
検証が失敗した場合は、[[yii\base\Model::errors]] プロパティからエラーメッセージを取得することが出来ます。
検証が失敗した場合は、[[yii\base\Model::errors]] プロパティからエラーメッセージを取得することが出来ます。
例えば、
```php
@ -19,7 +19,7 @@ $model->load(\Yii::$app->request->post());
if ($model->validate()) {
// 全ての入力が有効
} else {
// 検証が失敗。$errors はエラーメッセージを含む配列
// 検証が失敗。$errors はエラーメッセージを含む配列
$errors = $model->errors;
}
```
@ -34,10 +34,10 @@ if ($model->validate()) {
public function rules()
{
return [
// 名前、メールアドレス、主題、本文が必須項目
// 名前、メールアドレス、主題、本文が必須項目
[['name', 'email', 'subject', 'body'], 'required'],
// email 属性は有効なメールアドレスでなければならない
// email 属性は有効なメールアドレスでなければならない
['email', 'email'],
];
}
@ -52,7 +52,7 @@ public function rules()
['属性1', '属性2', ...],
// 必須。この規則のタイプを指定する。
// クラス名、バリデータのエイリアス、または、バリデーションメソッドの名前。
// クラス名、バリデータのエイリアス、または、バリデーションメソッドの名前。
'バリデータ',
// オプション。この規則が適用されるべき一つまたは複数のシナリオを指定する。
@ -61,7 +61,7 @@ public function rules()
// この規則が適用されるべきことを指定してもよい。
'on' => ['シナリオ1', 'シナリオ2', ...],
// オプション。バリデータオブジェクトに対する追加の構成情報を指定する。
// オプション。バリデータオブジェクトに対する追加の構成情報を指定する。
'プロパティ1' => '値1', 'プロパティ2' => '値2', ...
]
```
@ -69,10 +69,10 @@ public function rules()
各規則について、最低限、規則がどの属性に適用されるか、そして、規則がどのタイプであるかを指定しなければなりません。
規則のタイプは、次に挙げる形式のどれか一つを選ぶことが出来ます。
* コアバリデータのエイリアス。例えば、`required``in``date`、等々。
コアバリデータの完全なリストは [コアバリデータ](tutorial-core-validators.md) を参照してください。
* モデルクラス内のバリデーションメソッドの名前、または無名関数。詳細は、[インラインバリデータ](#inline-validators) の項を参照してください。
* 完全修飾のバリデータクラス名。詳細は [スタンドアロンバリデータ](#standalone-validators) の項を参照してください。
* コアバリデータのエイリアス。例えば、`required``in``date`、等々。
コアバリデータの完全なリストは [コアバリデータ](tutorial-core-validators.md) を参照してください。
* モデルクラス内のバリデーションメソッドの名前、または無名関数。詳細は、[インラインバリデータ](#inline-validators) の項を参照してください。
* 完全修飾のバリデータクラス名。詳細は [スタンドアロンバリデータ](#standalone-validators) の項を参照してください。
一つの規則は、一つまたは複数の属性を検証するために使用することが出来ます。
そして、一つの属性は、一つまたは複数の規則によって検証され得ます。
@ -113,12 +113,12 @@ public function rules()
> }
### エラーメッセージをカスタマイズする <span id="customizing-error-messages"></span>
### エラーメッセージをカスタマイズする <span id="customizing-error-messages"></span>
たいていのバリデータはデフォルトのエラーメッセージを持っていて、属性の検証が失敗した場合にそれを検証の対象であるモデルに追加します。
例えば、[[yii\validators\RequiredValidator|required]] バリデータは、このバリデータを使って `username` 属性を検証したとき、規則に合致しない場合は「ユーザ名は空ではいけません。」というエラーメッセージをモデルに追加します。
たいていのバリデータはデフォルトのエラーメッセージを持っていて、属性の検証が失敗した場合にそれを検証の対象であるモデルに追加します。
例えば、[[yii\validators\RequiredValidator|required]] バリデータは、このバリデータを使って `username` 属性を検証したとき、規則に合致しない場合は「ユーザ名は空ではいけません。」というエラーメッセージをモデルに追加します。
規則のエラーメッセージは、次に示すように、規則を宣言するときに `message` プロパティを指定することによってカスタマイズすることが出来ます。
規則のエラーメッセージは、次に示すように、規則を宣言するときに `message` プロパティを指定することによってカスタマイズすることが出来ます。
```php
public function rules()
@ -129,9 +129,9 @@ public function rules()
}
```
バリデータの中には、検証を失敗させたさまざまな原因をより詳しく説明するための追加のエラーメッセージをサポートしているものがあります。
バリデータの中には、検証を失敗させたさまざまな原因をより詳しく説明するための追加のエラーメッセージをサポートしているものがあります。
例えば、[[yii\validators\NumberValidator|number]] バリデータは、検証される値が大きすぎたり小さすぎたりしたときに、検証の失敗を説明するために、それぞれ、[[yii\validators\NumberValidator::tooBig|tooBig]] および [[yii\validators\NumberValidator::tooSmall|tooSmall]] のメッセージをサポートしています。
これらのエラーメッセージも、バリデータの他のプロパティと同様、検証規則の中で構成することが出来ます。
これらのエラーメッセージも、バリデータの他のプロパティと同様、検証規則の中で構成することが出来ます。
### 検証のイベント <span id="validation-events"></span>
@ -167,7 +167,7 @@ public function rules()
function ($model, $attribute)
```
クライアントでも条件付きの検証をサポートする必要がある場合は、[[yii\validators\Validator::whenClient|whenClient]] プロパティを構成しなければなりません。
クライアント・サイドでも条件付きの検証をサポートする必要がある場合は、[[yii\validators\Validator::whenClient|whenClient]] プロパティを構成しなければなりません。
このプロパティは、規則を適用すべきか否かを返す JavaScript 関数を表す文字列を値として取ります。
例えば、
@ -186,7 +186,7 @@ function ($model, $attribute)
例えば、`username` の入力値の前後にある空白を除去したいというような場合です。
この目的を達するために検証規則を使うことが出来ます。
次の例では、入力値の前後にある空白を除去して、空の入力値を null に変換することを、[trim](tutorial-core-validators.md#trim) および [default](tutorial-core-validators.md#default) のコアバリデータで行っています。
次の例では、入力値の前後にある空白を除去して、空の入力値を null に変換することを、[trim](tutorial-core-validators.md#trim) および [default](tutorial-core-validators.md#default) のコアバリデータで行っています。
```php
return [
@ -195,11 +195,11 @@ return [
];
```
もっと汎用的な [filter](tutorial-core-validators.md#filter) バリデータを使って、もっと複雑なデータフィルタリングをすることも出来ます。
もっと汎用的な [filter](tutorial-core-validators.md#filter) バリデータを使って、もっと複雑なデータフィルタリングをすることも出来ます。
お分かりのように、これらの検証規則は実際には入力を検証しません。そうではなくて、検証される属性の値を処理して書き戻すのです。
ユーザ入力の完全な処理を次のサンプルコードで示します。
ユーザ入力の完全な処理を次のサンプルコードで示します。
これは、ある属性に整数の値だけが保存されるように保証しようとするものです。
```php
@ -211,7 +211,7 @@ return [
上記のコードは入力に対して以下の操作を実行します。
1. 入力値から先頭と末尾のホワイトスペースをトリムします。
1. 入力値から先頭と末尾のホワイトスペースをトリムします。
2. 空の入力値がデータベースで `null` として保存されることを保証します。
"not set(未設定)" という値と、実際の値である `0` は区別します。
`null` が許されない時は、ここで別のデフォルト値を設定することが出来ます。
@ -251,28 +251,28 @@ return [
> Note: たいていのバリデータは、[[yii\validators\Validator::skipOnEmpty]] プロパティがデフォルト値 `true` を取っている場合は、空の入力値を処理しません。
そのようなバリデータは、関連付けられた属性が空の入力値を受け取ったときは、検証の過程ではスキップされるだけになります。
[コアバリデータ](tutorial-core-validators.md) の中では、`captcha``default``filter``required`、そして `trim` だけが空の入力値を処理します。
[コアバリデータ](tutorial-core-validators.md) の中では、`captcha``default``filter``required`、そして `trim` だけが空の入力値を処理します。
## その場限りの検証 <span id="ad-hoc-validation"></span>
時として、何らかのモデルに結び付けられていない値に対する *その場限りの検証* を実行しなければならない場合があります。
実行する必要がある検証が一種類 (例えば、メールアドレスの検証) だけである場合は、使いたいバリデータの [[yii\validators\Validator::validate()|validate()]] メソッドを次のように呼び出すことが出来ます。
実行する必要がある検証が一種類 (例えば、メールアドレスの検証) だけである場合は、使いたいバリデータの [[yii\validators\Validator::validate()|validate()]] メソッドを次のように呼び出すことが出来ます。
```php
$email = 'test@example.com';
$validator = new yii\validators\EmailValidator();
if ($validator->validate($email, $error)) {
echo 'メールアドレスは有効。';
echo 'メールアドレスは有効。';
} else {
echo $error;
}
```
> Note: 全てのバリデータがこの種の検証をサポートしている訳ではありません。
その一例が [unique](tutorial-core-validators.md#unique) コアバリデータであり、これはモデルとともに使用されることだけを前提にして設計されています。
その一例が [unique](tutorial-core-validators.md#unique) コアバリデータであり、これはモデルとともに使用されることだけを前提にして設計されています。
いくつかの値に対して複数の検証を実行する必要がある場合は、属性と規則の両方をその場で宣言することが出来る [[yii\base\DynamicModel]] を使うことが出来ます。
これは、次のような使い方をします。
@ -319,13 +319,13 @@ public function actionSearch($name, $email)
## バリデータを作成する <span id="creating-validators"></span>
Yii のリリースに含まれている [コアバリデータ](tutorial-core-validators.md) を使う以外に、あなた自身のバリデータを作成することも出来ます。
インラインバリデータとスタンドアロンバリデータを作ることが出来ます。
Yii のリリースに含まれている [コアバリデータ](tutorial-core-validators.md) を使う以外に、あなた自身のバリデータを作成することも出来ます。
インラインバリデータとスタンドアロンバリデータを作ることが出来ます。
### インラインバリデータ <span id="inline-validators"></span>
### インラインバリデータ <span id="inline-validators"></span>
インラインバリデータは、モデルのメソッドまたは無名関数として定義されるバリデータです。
インラインバリデータは、モデルのメソッドまたは無名関数として定義されるバリデータです。
メソッド/関数 のシグニチャは、
```php
@ -338,7 +338,7 @@ Yii のリリースに含まれている [コアバリデータ](tutorial-core-v
function ($attribute, $params, $validator)
```
属性が検証に失敗した場合は、メソッド/関数 は [[yii\base\Model::addError()]] を呼んでエラーメッセージをモデルに保存し、後で読み出してエンドユーザに表示することが出来るようにしなければなりません。
属性が検証に失敗した場合は、メソッド/関数 は [[yii\base\Model::addError()]] を呼んでエラーメッセージをモデルに保存し、後で読み出してエンドユーザに表示することが出来るようにしなければなりません。
下記にいくつかの例を示します。
@ -353,10 +353,10 @@ class MyForm extends Model
public function rules()
{
return [
// モデルメソッド validateCountry() として定義されるインラインバリデータ
// モデルメソッド validateCountry() として定義されるインラインバリデータ
['country', 'validateCountry'],
// 無名関数として定義されるインラインバリデータ
// 無名関数として定義されるインラインバリデータ
['token', function ($attribute, $params, $validator) {
if (!ctype_alnum($this->$attribute)) {
$this->addError($attribute, 'トークンは英数字で構成しなければなりません。');
@ -374,15 +374,15 @@ class MyForm extends Model
}
```
> Note: バージョン 2.0.11 以降では、代わりに、[[yii\validators\InlineValidator::addError()]] を使ってエラーメッセージを追加することが出来ます。
> そうすれば、エラーメッセージはそのまま [[yii\i18n\I18N::format()]] を使ってフォーマットされます。
> Note: バージョン 2.0.11 以降では、代わりに、[[yii\validators\InlineValidator::addError()]] を使ってエラーメッセージを追加することが出来ます。
> そうすれば、エラーメッセージはそのまま [[yii\i18n\I18N::format()]] を使ってフォーマットされます。
> 属性のラベルと値を参照するためには、それぞれ、`{attribute}` と `{value}` を使ってください(手作業で取得する必要はありません)。
>
> ```php
> $validator->addError($this, $attribute, 'The value "{value}" is not acceptable for {attribute}.');
> ```
> Note: デフォルトでは、インラインバリデータは、関連付けられている属性が空の入力値を受け取ったり、既に何らかの検証規則に失敗したりしている場合には、適用されません。
> Note: デフォルトでは、インラインバリデータは、関連付けられている属性が空の入力値を受け取ったり、既に何らかの検証規則に失敗したりしている場合には、適用されません。
> 規則が常に適用されることを保証したい場合は、規則の宣言において [[yii\validators\Validator::skipOnEmpty|skipOnEmpty]] および/または [[yii\validators\Validator::skipOnError|skipOnError]] のプロパティを false に設定することが出来ます。
> 例えば、
>
@ -393,13 +393,13 @@ class MyForm extends Model
> ```
### スタンドアロンバリデータ <span id="standalone-validators"></span>
### スタンドアロンバリデータ <span id="standalone-validators"></span>
スタンドアロンバリデータは、[[yii\validators\Validator]] またはその子クラスを拡張するクラスです。
スタンドアロンバリデータは、[[yii\validators\Validator]] またはその子クラスを拡張するクラスです。
[[yii\validators\Validator::validateAttribute()]] メソッドをオーバーライドすることによって、その検証ロジックを実装することが出来ます。
[インラインバリデータ](#inline-validators) でするのと同じように、属性が検証に失敗した場合は、[[yii\base\Model::addError()]] を呼んでエラーメッセージをモデルに保存します。
[インラインバリデータ](#inline-validators) でするのと同じように、属性が検証に失敗した場合は、[[yii\base\Model::addError()]] を呼んでエラーメッセージをモデルに保存します。
例えば、上記のインラインバリデータは、新しい [[components/validators/CountryValidator]] クラスに作りかえることが出来ます。
例えば、上記のインラインバリデータは、新しい [[components/validators/CountryValidator]] クラスに作りかえることが出来ます。
この場合、[[yii\validators\Validator::addError()]] を使って特製のメッセージをモデルに設定することが出来ます。
```php
@ -424,7 +424,7 @@ class CountryValidator extends Validator
と言うのは、前の二つは、デフォルトでは、`validateValue()` を呼び出すことによって実装されているからです。
次の例は、上記のバリデータクラスをあなたのモデルの中でどのように使用することが出来るかを示すものです。
次の例は、上記のバリデータクラスをあなたのモデルの中でどのように使用することが出来るかを示すものです。
```php
namespace app\models;
@ -487,7 +487,7 @@ class MigrationForm extends \yii\base\Model
### バリデータを作成する <span id="multiple-attributes-validator"></span>
家族の収入が子ども達のために十分であるかどうかをチェックする必要があるとしましょう。
そのためには、`childrenCount` が 1 以上である場合にのみ実行される `validateChildrenFunds` というインラインバリデータを作れば良いわけです。
そのためには、`childrenCount` が 1 以上である場合にのみ実行される `validateChildrenFunds` というインラインバリデータを作れば良いわけです。
検証されるすべての属性 (`['personalSalary', 'spouseSalary', 'childrenCount']`) にこのバリデータをアタッチすることは出来ない、ということに注意してください。
そのようにすると、同じバリデータが属性ごとに (合計で三回) 走ることになりますが、
@ -519,17 +519,17 @@ public function validateChildrenFunds($attribute, $params)
この検証は属性一つだけに関係するものではないので、`$attribute` のパラメータは無視することが出来ます。
### エラーメッセージを追加する <span id="multiple-attributes-errors"></span>
### エラーメッセージを追加する <span id="multiple-attributes-errors"></span>
複数の属性の場合のエラーメッセージの追加は、フォームをどのように設計するかによって異なってきます。
複数の属性の場合のエラーメッセージの追加は、フォームをどのように設計するかによって異なってきます。
- もっとも関係が深いとあなたが思うフィールドを選んで、その属性にエラーメッセージを追加する。
- もっとも関係が深いとあなたが思うフィールドを選んで、その属性にエラーメッセージを追加する。
```php
$this->addError('childrenCount', '子どもの数に対して給与が不足しています。');
```
- 重要な複数の属性、または、すべての属性を選んで、同じエラーメッセージを追加する。
- 重要な複数の属性、または、すべての属性を選んで、同じエラーメッセージを追加する。
メッセージを独立した変数に格納してから `addError` に渡せば、コードを DRY に保つことが出来ます。
```php
@ -548,15 +548,15 @@ foreach ($attributes as $attribute) {
}
```
- (特定の属性に結び付かない) 共通のエラーメッセージを追加する。
その時点では属性の存在はチェックされませんので、存在しない属性の名前、例えば `*` を使ってエラーメッセージを追加することが出来ます。
- (特定の属性に結び付かない) 共通のエラーメッセージを追加する。
その時点では属性の存在はチェックされませんので、存在しない属性の名前、例えば `*` を使ってエラーメッセージを追加することが出来ます。
```php
$this->addError('*', '子どもの数に対して給与が不足しています。');
```
結果として、フォームのフィールドの近くにはこのエラーメッセージは表示されません。
これを表示するためには、ビューにエラーサマリを含めます。
結果として、フォームのフィールドの近くにはこのエラーメッセージは表示されません。
これを表示するためには、ビューにエラーサマリを含めます。
```php
<?= $form->errorSummary($model) ?>
@ -565,25 +565,25 @@ $this->addError('*', '子どもの数に対して給与が不足しています
> Note: 複数の属性を一度に検証するバリデータを作成する方法が [community cookbook](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-validator-multiple-attributes.md) で分り易く解説されています。.
## クライアントでの検証 <span id="client-side-validation"></span>
## クライアント・サイドでの検証 <span id="client-side-validation"></span>
エンドユーザが HTML フォームで値を入力する際には、JavaScript に基づくクライアントでの検証を提供することが望まれます。
というのは、クライアントでの検証は、ユーザが入力のエラーを早く見つけることが出来るようにすることによって、より良いユーザ体験を提供するものだからです。
あなたも、サーバでの検証 *に加えて* クライアントでの検証をサポートするバリデータを使用したり実装したりすることが出来ます。
エンドユーザが HTML フォームで値を入力する際には、JavaScript に基づくクライアント・サイドでの検証を提供することが望まれます。
というのは、クライアント・サイドでの検証は、ユーザが入力のエラーを早く見つけることが出来るようにすることによって、より良いユーザ体験を提供するものだからです。
あなたも、サーバ・サイドでの検証 *に加えて* クライアント・サイドでの検証をサポートするバリデータを使用したり実装したりすることが出来ます。
> Info: クライアントでの検証は望ましいものですが、不可欠なものではありません。
> Info: クライアント・サイドでの検証は望ましいものですが、不可欠なものではありません。
その主たる目的は、ユーザにより良い体験を提供することにあります。
エンドユーザから来る入力値と同じように、クライアントでの検証を決して信用してはいけません。
この理由により、これまでの項で説明したように、常に [[yii\base\Model::validate()]] を呼び出してサーバでの検証を実行しなければなりません。
エンドユーザから来る入力値と同じように、クライアント・サイドでの検証を決して信用してはいけません。
この理由により、これまでの項で説明したように、常に [[yii\base\Model::validate()]] を呼び出してサーバ・サイドでの検証を実行しなければなりません。
### クライアントでの検証を使う <span id="using-client-side-validation"></span>
### クライアント・サイドでの検証を使う <span id="using-client-side-validation"></span>
多くの [コアバリデータ](tutorial-core-validators.md) は、そのままで、クライアントでの検証をサポートしています。
多くの [コアバリデータ](tutorial-core-validators.md) は、そのままで、クライアント・サイドでの検証をサポートしています。
あなたがする必要があるのは、[[yii\widgets\ActiveForm]] を使って HTML フォームを作るということだけです。
例えば、下の `LoginForm` は二つの規則を宣言しています。
一つは、[required](tutorial-core-validators.md#required) コアバリデータを使っていますが、これはクライアント側とサーバ側の両方でサポートされています。
もう一つは `validatePassword` インラインバリデータを使っていますが、こちらはサーバでのみサポートされています。
一つは、[required](tutorial-core-validators.md#required) コアバリデータを使っていますが、これはクライアント・サイドとサーバ・サイドの両方でサポートされています。
もう一つは `validatePassword` インラインバリデータを使っていますが、こちらはサーバ・サイドでのみサポートされています。
```php
namespace app\models;
@ -619,7 +619,7 @@ class LoginForm extends Model
```
次のコードによって構築される HTML フォームは、`username``password` の二つの入力フィールドを含みます。
何も入力せずにこのフォームを送信すると、何かを入力するように要求するエラーメッセージが、サーバと少しも交信することなく、ただちに表示されることに気付くでしょう。
何も入力せずにこのフォームを送信すると、何かを入力するように要求するエラーメッセージが、サーバと少しも交信することなく、ただちに表示されることに気付くでしょう。
```php
<?php $form = yii\widgets\ActiveForm::begin(); ?>
@ -629,18 +629,18 @@ class LoginForm extends Model
<?php yii\widgets\ActiveForm::end(); ?>
```
舞台裏では、[[yii\widgets\ActiveForm]] がモデルで宣言されている検証規則を読んで、クライアントの検証をサポートするバリデータのために、適切な JavaScript コードを生成します。
ユーザが入力フィールドの値を変更したりフォームを送信したりすると、クライアントの検証の JavaScript が起動されます。
舞台裏では、[[yii\widgets\ActiveForm]] がモデルで宣言されている検証規則を読んで、クライアント・サイドの検証をサポートするバリデータのために、適切な JavaScript コードを生成します。
ユーザが入力フィールドの値を変更したりフォームを送信したりすると、クライアント・サイドの検証の JavaScript が起動されます。
クライアントの検証を完全に無効にしたい場合は、[[yii\widgets\ActiveForm::enableClientValidation]] プロパティを `false` に設定することが出来ます。
また、個々の入力フィールドごとにクライアントの検証を無効にしたい場合には、入力フィールドの [[yii\widgets\ActiveField::enableClientValidation]] プロパティを false に設定することが出来ます。
クライアント・サイドの検証を完全に無効にしたい場合は、[[yii\widgets\ActiveForm::enableClientValidation]] プロパティを `false` に設定することが出来ます。
また、個々の入力フィールドごとにクライアント・サイドの検証を無効にしたい場合には、入力フィールドの [[yii\widgets\ActiveField::enableClientValidation]] プロパティを false に設定することが出来ます。
`eanbleClientValidation` が入力フィールドのレベルとフォームのレベルの両方で構成されている場合は前者が優先されます。
> Info: バージョン 2.0.11 以降、[[yii\validators\Validator]] を拡張する全てのバリデータは、
> クライアントのオプションを独立したメソッド - [[yii\validators\Validator::getClientOptions()]] から受け取るようになりました。
> クライアント・サイドのオプションを独立したメソッド - [[yii\validators\Validator::getClientOptions()]] から受け取るようになりました。
> これを使うと、次のことが可能になります。
>
> - 独自のクライアント検証を実装しながら、サーバ検証のオプションとの同期はそのまま残す
> - 独自のクライアント・サイド検証を実装しながら、サーバ・サイド検証のオプションとの同期はそのまま残す
> - 特殊な要求に合うように拡張またはカスタマイズする
>
> ```php
@ -653,18 +653,18 @@ class LoginForm extends Model
> }
> ```
### クライアントの検証を実装する <span id="implementing-client-side-validation"></span>
### クライアント・サイドの検証を実装する <span id="implementing-client-side-validation"></span>
クライアントの検証をサポートするバリデータを作成するためには、クライアントでの検証を実行する JavaScript コードを返す [[yii\validators\Validator::clientValidateAttribute()]] メソッドを実装しなければなりません。
クライアント・サイドの検証をサポートするバリデータを作成するためには、クライアント・サイドでの検証を実行する JavaScript コードを返す [[yii\validators\Validator::clientValidateAttribute()]] メソッドを実装しなければなりません。
その JavaScript の中では、次の事前定義された変数を使用することが出来ます。
- `attribute`: 検証される属性の名前。
- `value`: 検証される値。
- `messages`: 属性に対する検証のエラーメッセージを保持するために使用される配列。
- `messages`: 属性に対する検証のエラーメッセージを保持するために使用される配列。
- `deferred`: Deferred オブジェクトをプッシュして入れることが出来る配列 (次の項で説明します)。
次の例では、入力された値が既存のステータスのデータに含まれる有効なステータス値であるかどうかを検証する `StatusValidator` を作成します。
このバリデータは、サーバとクライアントの両方の検証をサポートします。
このバリデータは、サーバ・サイドとクライアント・サイドの両方の検証をサポートします。
```php
namespace app\components;
@ -701,8 +701,8 @@ JS;
}
```
> Tip: 上記のコード例の主たる目的は、クライアントの検証をサポートする方法を説明することにあります。
> 実際の仕事では、[in](tutorial-core-validators.md#in) コアバリデータを使って、同じ目的を達することが出来ます。
> Tip: 上記のコード例の主たる目的は、クライアント・サイドの検証をサポートする方法を説明することにあります。
> 実際の仕事では、[in](tutorial-core-validators.md#in) コアバリデータを使って、同じ目的を達することが出来ます。
> 次のように検証規則を書けばよいのです。
>
> ```php
@ -711,12 +711,12 @@ JS;
> ]
> ```
> Tip: クライアントの検証を手動で操作する必要がある場合、すなわち、動的にフィールドを追加したり、何か特殊な UI ロジックを実装する場合は、
> Tip: クライアント・サイドの検証を手動で操作する必要がある場合、すなわち、動的にフィールドを追加したり、何か特殊な UI ロジックを実装する場合は、
> Yii 2.0 Cookbook の [Working with ActiveForm via JavaScript](https://github.com/samdark/yii2-cookbook/blob/master/book/forms-activeform-js.md) を参照してください。
### Deferred 検証 <span id="deferred-validation"></span>
非同期のクライアントの検証をサポートする必要がある場合は、[Defered オブジェクト](http://api.jquery.com/category/deferred-object/) を作成することが出来ます。
非同期のクライアント・サイドの検証をサポートする必要がある場合は、[Defered オブジェクト](http://api.jquery.com/category/deferred-object/) を作成することが出来ます。
例えば、AJAX によるカスタム検証を実行するために、次のコードを使うことが出来ます。
```php
@ -736,7 +736,7 @@ JS;
jQuery の `$.get()` メソッドによって作成された Deferred オブジェクトが `deferred` 配列にプッシュされています。
Deferred オブジェクトを明示的に作成して、非同期のコールバックが呼ばれたときに、Deferred オブジェクトの `resolve()` メソッドを呼ぶことも出来ます。
次の例は、アップロードされる画像ファイルの大きさをクライアントで検証する方法を示すものです。
次の例は、アップロードされる画像ファイルの大きさをクライアント・サイドで検証する方法を示すものです。
```php
public function clientValidateAttribute($model, $attribute, $view)
@ -764,7 +764,7 @@ JS;
> Note: 属性が検証された後に、`resolve()` メソッドを呼び出さなければなりません。
そうしないと、主たるフォームの検証が完了しません。
簡潔に記述できるように、`deferred` 配列はショートカットメソッド `add()` を装備しており、このメソッドを使うと、自動的に Deferred オブジェクトを作成して `deferred` 配列に追加することが出来ます。
簡潔に記述できるように、`deferred` 配列はショートカットメソッド `add()` を装備しており、このメソッドを使うと、自動的に Deferred オブジェクトを作成して `deferred` 配列に追加することが出来ます。
このメソッドを使えば、上記の例は次のように簡潔に記すことが出来ます。
```php
@ -792,12 +792,12 @@ JS;
## AJAX 検証 <span id="ajax-validation"></span>
場合によっては、サーバだけが必要な情報を持っているために、サーバでしか検証が実行できないことがあります。
例えば、ユーザ名がユニークであるか否かを検証するためには、サーバで user テーブルを調べることが必要になります。
場合によっては、サーバだけが必要な情報を持っているために、サーバ・サイドでしか検証が実行できないことがあります。
例えば、ユーザ名がユニークであるか否かを検証するためには、サーバ・サイドで user テーブルを調べることが必要になります。
このような場合には、AJAX ベースの検証を使うことが出来ます。
AJAX 検証は、通常のクライアントでの検証と同じユーザ体験を保ちながら、入力値を検証するためにバックグラウンドで AJAX リクエストを発行します。
AJAX 検証は、通常のクライアント・サイドでの検証と同じユーザ体験を保ちながら、入力値を検証するためにバックグラウンドで AJAX リクエストを発行します。
単一のインプットフィールドに対して AJAX 検証を有効にするためには、そのフィールドの [[yii\widgets\ActiveField::enableAjaxValidation|enableAjaxValidation]] プロパティを true に設定し、フォームに一意の `id` を指定します。
単一のインプットフィールドに対して AJAX 検証を有効にするためには、そのフィールドの [[yii\widgets\ActiveField::enableAjaxValidation|enableAjaxValidation]] プロパティを true に設定し、フォームに一意の `id` を指定します。
```php
use yii\widgets\ActiveForm;
@ -822,9 +822,9 @@ $form = ActiveForm::begin([
]);
```
> Note: `enableAjaxValidation` プロパティがインプットフィールドのレベルとフォームのレベルの両方で構成された場合は、前者が優先されます。
> Note: `enableAjaxValidation` プロパティがインプットフィールドのレベルとフォームのレベルの両方で構成された場合は、前者が優先されます。
また、サーバでは、AJAX 検証のリクエストを処理できるように準備しておく必要があります。
また、サーバ・サイドでは、AJAX 検証のリクエストを処理できるように準備しておく必要があります。
これは、コントローラのアクションにおいて、次のようなコード断片を使用することで達成できます。
```php
@ -842,4 +842,4 @@ if (Yii::$app->request->isAjax && $model->load(Yii::$app->request->post())) {
`enableClientValidation``enableAjaxValidation` が両方とも `true` に設定されているときは、クライアント検証が成功した後でだけ AJAX 検証のリクエストが起動されます。
`validateOnChange`, `validateOnBlur` または `validateOnType``true` に設定されている単一のフィールドを検証する場合、
当該フィールドが単独でクライアント・バリデーションを通ったら AJAX リクエストが送信されることに注意して下さい。
当該フィールドが単独でクライアント検証を通ったら AJAX リクエストが送信されることに注意して下さい。