2017-10-11 28 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模型,當我離開現場驗證正確觸發錯誤消息,CSS和它確實是正確的記錄3,但沒有備案2,所以這是好電子郵件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."});}}, 

我認爲,如果 「身份證」 標籤分別設定到claimcontact-EMAIL_0,claimcontact,EMAIL_1和claimcontact,EMAIL_2我敢打賭驗證會起作用。

我曾嘗試設置inputOptions和jquery選擇器選項,但這不起作用。

我已經閱讀並使用了多模型文章(http://www.yiiframew...ple-models.html),它的工作達到了一定程度,但是我從另一個項目中得到了很多問題,因此我決定按照上述方法進行更多的控制,但有在驗證中有點麻煩,我需要幫助。

感謝您花時間閱讀我的問題。

回答

0

我找到了解決方案。需要用$ index設置名稱,然後創建的驗證是唯一的。

例如。

'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."}); 
} 

,然後導致我想要驗證上只有一個字段。