Проверка правильности 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."});
}
что затем приводит к тому, что я хочу - проверка только на одном поле.