yii\widgets\ActiveForm ウィジェットには、クライアント側の検証に使用される JavaScript メソッドのセットが付属しています。その実装は非常に柔軟で、さまざまな方法で拡張できます。以下にそれらについて説明します。
ActiveForm は、一連の専用イベントをトリガーします。次のようなコードを使用すると、これらのイベントをサブスクライブして処理できます。
$('#contact-form').on('beforeSubmit', function (e) {
if (!confirm("Everything is correct. Submit?")) {
return false;
}
return true;
});
以下に、利用可能なイベントを確認します。
beforeValidate
¶beforeValidate
は、フォーム全体の検証前にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event, messages, deferreds)
ここで、
event
:Event オブジェクト。messages
:キーが属性 ID、値が対応する属性のエラーメッセージ配列である連想配列。deferreds
:Deferred オブジェクトの配列。deferreds.add(callback)
を使用して、新しい遅延検証を追加できます。ハンドラがブール値 false
を返した場合、このイベント後のフォーム検証は停止します。その結果、afterValidate
イベントはトリガーされません。
afterValidate
¶afterValidate
イベントは、フォーム全体の検証後にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event, messages, errorAttributes)
ここで、
event
:Event オブジェクト。messages
:キーが属性 ID、値が対応する属性のエラーメッセージ配列である連想配列。errorAttributes
:検証エラーが発生した属性の配列。このパラメータの構造については、attributeDefaults
を参照してください。beforeValidateAttribute
¶beforeValidateAttribute
イベントは、属性の検証前にトリガーされます。イベントハンドラのシグネチャは次のようになります。
function (event, attribute, messages, deferreds)
ここで、
event
:Event オブジェクト。attribute
:検証対象の属性。このパラメータの構造については、attributeDefaults
を参照してください。messages
:指定された属性の検証エラーメッセージを追加できる配列。deferreds
:Deferred オブジェクトの配列。deferreds.add(callback)
を使用して、新しい遅延検証を追加できます。ハンドラがブール値 false
を返した場合、指定された属性のそれ以降の検証は停止します。その結果、afterValidateAttribute
イベントはトリガーされません。
afterValidateAttribute
¶afterValidateAttribute
イベントは、フォーム全体および各属性の検証後にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event, attribute, messages)
ここで、
event
:Event オブジェクト。attribute
:検証されている属性。このパラメータの構造については、attributeDefaults
を参照してください。messages
:指定された属性の追加の検証エラーメッセージを追加できる配列。beforeSubmit
¶beforeSubmit
イベントは、すべての検証が完了した後、フォームを送信する前にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event)
ここで、event は Event オブジェクトです。
ハンドラがブール値 false
を返した場合、フォームの送信は停止します。
ajaxBeforeSend
¶ajaxBeforeSend
イベントは、AJAXベースのバリデーションのためにAJAXリクエストを送信する前にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event, jqXHR, settings)
ここで、
event
:Event オブジェクト。jqXHR
: jqXHRオブジェクトsettings
: AJAXリクエストの設定ajaxComplete
¶ajaxComplete
イベントは、AJAXベースのバリデーションのためのAJAXリクエストが完了した後にトリガーされます。
イベントハンドラのシグネチャは次のようになります。
function (event, jqXHR, textStatus)
ここで、
event
:Event オブジェクト。jqXHR
: jqXHRオブジェクトtextStatus
: リクエストのステータス("success"、"notmodified"、"error"、"timeout"、"abort"、または"parsererror")。バリデーションはクライアントサイドまたはAJAXリクエスト経由で行うことができますが、フォーム送信自体はデフォルトで通常の(非AJAX)リクエストとして行われます。フォームをAJAX経由で送信したい場合は、フォームのbeforeSubmit
イベントを以下のように処理することで実現できます。
var $form = $('#formId');
$form.on('beforeSubmit', function() {
var data = $form.serialize();
$.ajax({
url: $form.attr('action'),
type: 'POST',
data: data,
success: function (data) {
// Implement successful
},
error: function(jqXHR, errMsg) {
alert(errMsg);
}
});
return false; // prevent default submit
});
jQueryのajax()
関数について詳しくは、jQueryドキュメントを参照してください。
現代のWebアプリケーションでは、ユーザーに表示された後にフォームを変更する必要がしばしばあります。例えば、「プラス」アイコンをクリックした後に新しいフィールドを追加する場合などです。これらのフィールドに対してクライアントバリデーションを有効にするには、ActiveForm JavaScriptプラグインに登録する必要があります。
フィールド自体を追加してから、バリデーションリストに追加する必要があります。
$('#contact-form').yiiActiveForm('add', {
id: 'address',
name: 'address',
container: '.field-address',
input: '#address',
error: '.help-block',
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: "Validation Message Here"});
}
});
フィールドをバリデーションリストから削除して、バリデーションされないようにするには、次のようにします。
$('#contact-form').yiiActiveForm('remove', 'address');
タイプミスを発見したり、このページを改善する必要があると思われたら?
GitHubで編集する !
サインアップ または ログイン してコメントしてください。