У меня есть модель бронирования с поля shipping_address и billing_address, оба из адрес модели. Теперь я хочу напечатать их в той же форме, которая в основном работает очень хорошо, проблема в том, что поля обеих моделей имеют одинаковые идентификаторы. Например, поле «zip» в shipping_address имеет идентификатор «zip», а «zip» в billing_address также имеет «zip» в качестве своего идентификатора.
Если я сейчас заполню форму, она одновременно проверяет оба поля, а только один из них действительно прав.
Я уже изменил имена полей Shippping_Address ['zip'] и Billing_Address ['zip'], поэтому контроллер может распознавать обе модели.
Вот как печатаются поля:
<?= $form->field($billing_address, 'address_line_1')->textInput(['maxlength' => 45, 'name'=> 'Billing_Address[address_line1]']); ?> <?= $form->field($billing_address, 'address_line_2')->textInput(['maxlength' => 45, 'name'=> 'Billing_Address[address_line2]']) ?> <?= $form->field($billing_address, 'zip')->textInput(['maxlength' => 11, 'name'=> 'Billing_Address[zip]']) ?> <?= $form->field($billing_address, 'city')->textInput(['maxlength' => 45, 'name'=> 'Billing_Address[city]']) ?> <?= $form->field($billing_address, 'country')->textInput(['maxlength' => 45, 'name'=> 'Billing_Address[country]']) ?> <?= $form->field($shipping_address, 'address_line_1')->textInput(['maxlength' => 45, 'name'=> 'Shipping_Address[address_line1]']); ?> <?= $form->field($shipping_address, 'address_line_2')->textInput(['maxlength' => 45, 'name'=> 'Shipping_Address[address_line2]']) ?> <?= $form->field($shipping_address, 'zip')->textInput(['maxlength' => 11, 'name'=> 'Shipping_Address[zip]']) ?> <?= $form->field($shipping_address, 'city')->textInput(['maxlength' => 45, 'name'=> 'Shipping_Address[city]']) ?> <?= $form->field($shipping_address, 'country')->textInput(['maxlength' => 45, 'name'=> 'Shipping_Address[country]']) ?>
Изменить: После выполнения ответа Тони:
<?= $form->field( $shipping_address, 'address_line_1', [ 'selectors' => [ 'input' => '#shipping-address_line_1', 'container' => '.shipping-address_line_1' ], 'options' => ['class' => 'shipping-address_line_1'] ])->textInput([ 'maxlength' => 45, 'name'=> 'Shipping_Address[address_line1]', 'id'=>'shipping-address_line_1', ]); ?>
Я также изменил класс контейнера, потому что он был тем же, что и у другого поля. Теперь второе поле (с кодом, показанным выше) работает отлично. Проблема в том, что первое поле (с неизменным кодом) больше не проверяется.
Как это можно решить?
Поскольку вы используете один класс модели для генерации двух наборов входов на одной странице, yii2 генерирует одинаковые правила ClientValidation для обоих из них. Чтобы отделить проверку, вам нужно установить атрибут id для каждого входа, который требует проверки в каждом из этих наборов вручную. Для вашего поля ввода zip решение будет следующим (отредактировано в соответствии с последними комментариями) :
//Billing $form->field($billing_address, 'zip', [ 'selectors' => [ 'input' => '#billing-zip', 'container' => '#billing-container', ], 'options' => ['id' => 'billing-container'], ])->textInput(['maxlength' => 11, 'name'=> 'Billing_Address[zip]', 'id'=>'billing-zip']); //Shipping $form->field($shipping_address, 'zip', [ 'selectors' => [ 'input' => '#shipping-zip', 'container' => '#shipping-container', ], 'options' => ['id' => 'shipping-container'], ])->textInput(['maxlength' => 11, 'name'=> 'Shipping_Address[zip]', 'id'=>'shipping-zip']);
Как вы видите, мы добавили атрибут пользовательского идентификатора в опции textInput и задаем соответствующий селектор для проверки js в параметрах поля . Читайте о свойствах селекторов