4

2 つのフォームに 1 つのモデル ファイルを使用しています。1 つはSIGNUP用、もう 1 つはメンバーの追加用です。

SIGNUPフォームのシナリオは設定しませんでした。ただし、メンバー追加フォームのシナリオは設定されています。

モデル

public function rules() {
  return [

    //Add Members
    ['first_name', 'required','message'=>'Please enter first name.','on'=>'addteammembersidebar'],
    ['email', 'required','message'=>'Please enter email address.','on'=>'addteammembersidebar'],
    ['mobile','required','message'=>'Please enter mobile number.','on'=>'addteammembersidebar'],

    //Common
    ['first_name', 'required','message'=>'Please enter your first name.'],
    ['email', 'required','message'=>'Please enter your email address.'],
    ['mobile','required','message'=>'Please enter your mobile number.'],

  ];
}

意見

ここでは、 のようなシナリオを設定します$modelTeamMembers->scenario = 'addteammembersidebar';

<?php foreach ($modelsTeamMembers as $indexMember => $modelTeamMembers): 
  $modelTeamMembers->scenario = 'addteammembersidebar';
  ?>
  <tr class="house-item">
    <td class="vcenter">
      <?php
      // necessary for update action.
      if (! $modelTeamMembers->isNewRecord) {
        echo Html::activeHiddenInput($modelTeamMembers, "[{$indexMember}]id");
      }
      ?>

      <?php 
      $modelTeamMembers->first_name = $first_name;
      echo $form->field($modelTeamMembers, "[{$indexMember}]first_name")->label(false); 
      ?>
    </td>
    <td>
      <?php
      $modelTeamMembers->last_name = $last_name;
      echo $form->field($modelTeamMembers, "[{$indexMember}]last_name")->label(false); 
      ?>
    </td>
    <td>
      <?php
      $modelTeamMembers->email = $email;
      echo $form->field($modelTeamMembers, "[{$indexMember}]email",['enableAjaxValidation' => true])->label(false); 
      ?>
    </td>
    <td>
      <?php
      $modelTeamMembers->mobile = $mobile_number;
      echo $form->field($modelTeamMembers, "[{$indexMember}]mobile",
          ['inputOptions' => ['class' => 'form-control', 'maxlength'=>"10"]])->label(false);
      ?>
    </td>
  </tr>

<?php endforeach; ?>

フィールドを除くすべての検証エラー メッセージが機能しemailます。'enableAjaxValidation' => trueフィールドから削除すると、機能します。しかし、私にとって'enableAjaxValidation' => trueは必須です。

画像

ここに画像の説明を入力

画像のように、「メール アドレスを入力してください。」というエラー メッセージが表示されることがはっきりとわかります。フィールド検証エラー メッセージのみが正しく表示されません。すべてが大丈夫であることを除いて。email

emailシナリオのフィールドに検証メッセージを設定するには? ヘルプ/ヒント/提案はかなりのものです。

4

1 に答える 1

12

AjaxValidationここでメール検証を使用する必要がある正確な理由を教えてください。AjaxValidationモデル自体ではなく、データベースや他のモデルからデータを検索して取得する場合に適しているため、このタイプの場合は記述しなくても十分です。

ただし、必要に応じAjaxValidationて、現在のコードでは機能しないため、いくつかの異なる設定を行う必要があります。


ビューAjaxValidationでの設定:

// Set to: index.php?r=profile/email-validation
$form = ActiveForm::begin(['validationUrl' => ['profile/email-validation']]);

// This is set correctly (no changes are needed comparing to your attempt)
echo $form->field($modelTeamMembers, "[{$indexMember}]email", ['enableAjaxValidation' => true])->label(false);

なぜこれが必要なのですか?アクティブに設定AjaxValidationしましたが、この Ajax が動作する URL を設定していません。ActiveForm::begin()ほとんどの場合に設定されています。


コントローラーAjaxValidationでのセットアップ(必須):

// Method that renders your view file
public function actionSomethingThatRendersView()
{
    // Code here
    $user->scenario = 'addteammembersidebar';                 // Custom scenario name
    return $this->render(/* the remaining code goes here */);
}

// This is the method that Ajax will send request to ($_POST[])
public function actionEmailValidation()
{
    $post = Yii::$app->request->post();
    if (!empty($post))
    {
        Yii::$app->response->format = Response::FORMAT_JSON;  // Must be in JSON format
        $profile = new User();                                // Edit your class name in here
        // Custom scenario (must be the same as above otherwise you might get unexpected response)
        $profile->scenario = 'addteammembersidebar';
        $profile->load($post);

        return ActiveForm::validate($profile);
    }
}

なぜこれが必要なのですか?Ajax はリクエストを送信しますが、アクションのないリクエストは何もしません。これにより、同じルールと属性を持つ「新しい」オブジェクトが作成され、新しいデータ セットで検証が試行されます。レンダリング方法について$obj->scenarioも、設定する必要があります。そうしないと、デフォルトのシナリオが使用されるためです。


Modelに変更はありません。すべてがあなたの例と同じままでなければなりません。

一意のメールにしたい場合は、モデルにも変更を加える必要があります。

public function rules()
{
    // ...
    ['email', 'unique', 'message' => 'Email must be unique'],
    // If your attribute is not in the same table as defined in class, then:
    ['email', 'unique', 'message' => 'Email must be unique', 'targetClass' => User2::className()],
}
于 2016-07-30T19:40:10.373 に答える