一部のフィールドが表示または非表示になるyii2ビューで難しいフォームを取得しました。ユーザーフィールドの選択肢から決定し、フォームのオプションを選択します。このフロントエンドロジックをカスタムjqueryファイルで記述します。大丈夫。しかし、フォームを送信すると、非表示のフィールドは検証されずに残り、何も起こりません。フィールドが非表示になっているときにofrontend検証を終了して、フィールドが表示されているときにオンに切り替えるにはどうすればよいですか?
クライアント側の検証を無効にします。このようなアクティブなフォームを開始します。
ActiveForm::begin(['enableClientValidation'=>false]);
$form->field($model, 'youAttribute', ['enableClientValidation' => false])->textInput();
ActiveField
クラスにはプロパティenableClientValidation
があり、一部のフィールドからclientValidationを無効にする場合は、このプロパティをfalse
に設定するだけです。
次のコードを使用してアクティブフィールドを設定できます:(active record
ではなく、activefield
正確に)
$activeField = $form->field($model, 'someField');
$activeField->enableClientValidation=false;
$activeField ->enableAjaxValidation=false;
設定されていない属性のデフォルト値を設定してみることができます:
[
// set "username" and "email" as null if they are empty
[['username', 'email'], 'default'],
// set "level" to be 1 if it is empty
['level', 'default', 'value' => 1],
]
バリデーターを定義するときに、"whenClient"
オプションを指定して条件付きクライアント側検証を使用することもできます。
マニュアルから:
クライアント側の条件付き検証もサポートする必要がある場合は、戻り値がルールを適用するかどうかを決定するJavaScript関数を表す文字列を受け取るwhenClientプロパティを構成する必要があります。例えば、
[ ['state', 'required', 'when' => function ($model) { return $model->country == 'USA'; }, 'whenClient' => "function (attribute, value) { return $('#country').val() == 'USA'; }"], ]
検証からフィールドを削除するには:
$('#yourFormID').yiiActiveForm('remove', 'yourinputID');
検証リストにフィールドを追加するには:
$('#yourFormID').yiiActiveForm('add', {
id: 'country',
name: 'yourinputID',
container: '.field-inputID', //or your cllass container
input: '#yourinputID',
error: '.help-block', //or your class error
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: "Validation Message Here"});
}
});
また、モデルの条件付き検証を忘れないでください。 詳細
フォームにはwhenClientを使用します。
['name', 'required', 'when' => {serverSide Condition),
'whenClient' => "ut_utils.isAttributeVisible",
],
['name', 'string', 'min' => 2, 'max' => 28],
['name', 'trim'],
そして、ut_utils(JS):
/**
* Useful for FE validation (whenClient) to validate only if visible (ie valid input)
*
* @param attribute Obj containing all sorts of info about attr including container name :-)
* @param value
*/
isAttributeVisible: function (attribute, value) {
return $(attribute.container).is(':visible');
},
サーバーサイドを検証するために「いつ」を追加する必要もあります。ここに特定のロジックを追加するか、シナリオを使用して検証されないように属性を除外することができます...