2017-10-11 4 views
0

私は一日中作業しています。これは私がここに投稿した最初の時間ですので、誰かが私を助けてくれることを願っています。Yii2検証は、繰り返しモデルレコードのフォームで間違ってトリガーされます

私はあるフォームの複数のレコードが同じモデルであるフォームを持っています。その結果、私は手動で名前タグとidタグを設定しました。 foreachループに次のコードを置き、ビュー内にタグを生成します。

// updatemember.php view has these declarations 

use kartik\widgets\ActiveForm; 

... 

     $form = ActiveForm::begin([ 
       'id' => 'tab-horizontal', 
       'type' => ActiveForm::TYPE_HORIZONTAL, 
       'formConfig' => ['labelSpan' => 4 ], 
       'options' => ['enctype' => 'multipart/form-data'], 
      ] 
      ); 

... 

// updatemember calls this subform _claimcontact.php 
use kartik\builder\Form; 

... 

echo Form::widget([ 
    'model'=>$claimcontact, 
    'form'=>$form, 
    'columns'=>2, 
    'attributes'=>[ 
      'phone_container'=>[ 
        'label'=>'Phone', 
        'attributes'=>[ 
          'phone'=>[ 
             'type'=>Form::INPUT_TEXT, 
             'options'=>['name'=>"ClaimContact[$index][phone]", 'id'=>"claimcontact-phone_$index", ], 
             'container' => ['class'=>$col_width], 
             ], 
         ], 
       ], 

      'email_container'=>[ 
        'label'=>'Email', 
        'attributes'=>[ 
          'email'=>[ 
             'type'=>Form::INPUT_TEXT, 
             'options'=>['name'=>"ClaimContact[$index][email]", 'id'=>"claimcontact-email_$index", ], 
             'container' => ['class'=>$col_width], 
             ], 
         ], 
       ], 
     ], 
]); 

?> 
     </div> 
    </div> 
    </div> 
</div> 

私はClaimContactモデルでルールを設定し、私がフィールドを離れて、それは、レコード3のためではなく、レコード2のために適切にそれをしないとき、検証が正しくエラーメッセージとCSSをトリガするので、それは良いことです電子メール3は空白で電子メール2は空白ではありません。

[['first_name', 'last_name', 'position', 'phone', 'email' ] , 'required', 

残念ながら、[送信]ボタンをクリックすると、入力されたファイル名フィールドを含むすべてのレコードがファイル名の検証によってトリガーされます。私はサンプル画像を添付しました。 Invalid validation ソースhtmlページの下に生成されたYii検証スクリプトは、問題を引き起こしている可能性のあるタグIDと名前が重複しているようです。

{"id":"claimcontact-email","name":"email","container":".field-claimcontact-email_0","input":"#claimcontact-email_0","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, 
    {"message":"Email cannot be blank."});}}, 

...

{"id":"claimcontact-email","name":"email","container":".field-claimcontact-email_1","input":"#claimcontact-email_1","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, 
    {"message":"Email cannot be blank."});}}, 

...

{"id":"claimcontact-email","name":"email","container":".field-claimcontact-email_2","input":"#claimcontact-email_2","validate":function (attribute, value, messages, deferred, $form) {yii.validation.required(value, messages, 
    {"message":"Email cannot be blank."});}}, 

私は、それぞれ "ID" タグがclaimcontact-EMAIL_0をするように設定した場合、claimcontact-EMAIL_1とclaimcontact-EMAIL_2考えます私は検証がうまくいくと思う。

inputOptionsとjqueryセレクタオプションを設定しようとしましたが、これは動作しません。

複数のモデル記事(http://www.yiiframew...ple-models.html)を読んで使用しましたが、それまでのところまで練習しましたが、私は別のプロジェクトから多くの問題を抱えていましたので、上記のアプローチをよりコントロールすることに決めましたが、妥当性確認のヒッチのビット私は助けを必要としてください。

私の問題を読む時間をとってくれてありがとう。

答えて

0

解決策が見つかりました。 1つは$インデックスで名前を設定する必要があり、作成された検証は一意でした。

例えば、

'email_container'=>[ 
      'label'=>'Email', 
      'attributes'=>[ 
       "[$index]email"=>[ 
        'type'=>Form::INPUT_TEXT, 
        'options'=>['name'=>"ClaimContact[$index][email]", 'id'=>"claimcontact-email_$index", ], 
        'container' => ['class'=>$col_width], 
        ], 
      ], 
     ], 

注: "[$インデックス]メール"

はその後、私は一つだけ、フィールド上の検証を望むものになり、この

{ 
    "id":"claimcontact-0-email", 
    "name":"[0]email", 
    "container":".field-claimcontact-email_0", 
    "input":"#claimcontact-email_0","validate":function (attribute, value, messages, deferred, $form) { 
     ... 
     (attribute, value)) { yii.validation.required(value, messages, {"message":"Email cannot be blank."}); 
} 
{ 
    "id":"claimcontact-1-email", 
    "name":"[1]email","container": 
    ".field-claimcontact-email_1", 
    "input":"#claimcontact-email_1","validate":function (attribute, value, messages, deferred, $form) { 
     ... 
     (attribute, value)) { yii.validation.required(value, messages, {"message":"Email cannot be blank."}); 
} 

生成します。

関連する問題