Проверка правильности Yii2 на форме с повторяющимися записями модели

Я работаю над этим весь день, и это первый раз, когда я опубликовал здесь, поэтому я надеюсь, что кто-то может мне помочь, пожалуйста.

У меня есть форма, где несколько записей для одной формы - это одна и та же модель. В результате я вручную установил теги name и 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', 

К сожалению, когда я нажимаю кнопку "Отправить", проверка имени файла запускается для ВСЕХ записей, включая заполненное поле имени файла. Я приложил образец изображения.

Недопустимая проверка. Кажется, что сценарий проверки Yii, сгенерированный внизу исходной html-страницы, содержит дубликаты тегов id и name, которые могут вызывать проблему.

  {"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" было установлено значение applycontact-email_0, demandcontact-email_1 и demandcontact-email_2 соответственно, я уверен, что проверка будет работать.

Я попытался установить inputOptions и опцию селектора jquery, но это не работает.

Я прочитал и использовал статью о нескольких моделях ( http: //www.yiiframew…ple-models.html), и она работала до определенного момента, но у меня было много проблем с ней из другого проекта, поэтому я решил следуйте вышеописанному подходу для большего контроля, но есть некоторая проблема в проверке, с которой мне нужна помощь, пожалуйста.

Спасибо, что нашли время, чтобы прочитать мою проблему.

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],
                    ],
            ],
        ],

ПРИМЕЧАНИЕ: "[$index] электронная почта"

генерирует это

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

что затем приводит к тому, что я хочу - проверка только на одном поле.

Другие вопросы по тегам