web-dev-qa-db-ja.com

yii2の一部のフィールドのフロントエンドフォーム検証をオン/オフに切り替える方法は?

一部のフィールドが表示または非表示になるyii2ビューで難しいフォームを取得しました。ユーザーフィールドの選択肢から決定し、フォームのオプションを選択します。このフロントエンドロジックをカスタムjqueryファイルで記述します。大丈夫。しかし、フォームを送信すると、非表示のフィールドは検証されずに残り、何も起こりません。フィールドが非表示になっているときにofrontend検証を終了して、フィールドが表示されているときにオンに切り替えるにはどうすればよいですか?

クライアント側の検証を無効にします。このようなアクティブなフォームを開始します。

ActiveForm::begin(['enableClientValidation'=>false]);
20
Rasikh Mashhadi
$form->field($model, 'youAttribute', ['enableClientValidation' => false])->textInput();

ActiveFieldクラスにはプロパティenableClientValidationがあり、一部のフィールドからclientValidationを無効にする場合は、このプロパティをfalseに設定するだけです。

28
Max Wen

次のコードを使用してアクティブフィールドを設定できます:(active recordではなく、activefield正確に)

$activeField = $form->field($model, 'someField');
$activeField->enableClientValidation=false;
$activeField ->enableAjaxValidation=false;
10
Nurbek Nurjanov

設定されていない属性のデフォルト値を設定してみることができます:

[
  // 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';
    }"],
]
8
Felipe Almeida

検証からフィールドを削除するには:

$('#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"});
        }
    }); 

また、モデルの条件付き検証を忘れないでください。 詳細

4
hesselek

フォームには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');
    },

サーバーサイドを検証するために「いつ」を追加する必要もあります。ここに特定のロジックを追加するか、シナリオを使用して検証されないように属性を除外することができます...

0
gvanto