Intereting Posts
Как получить функциональность http_parse_headers без PECL? CodeIgniter вставляет дважды одну и ту же запись. В некоторых случаях Является ли это безопасным способом фильтрации данных и предотвращения SQL-инъекций и других атак? Проверьте тип файла загрузки из массива в PHP. php / ajax REMOTE_ADDR установлен на IP-адрес фиктивного сетевого адаптера Выбранный вариант по умолчанию выбран с помощью jQuery Предупреждение: mysql_num_rows () ожидает, что параметр 1 будет ресурсом, массив указан в API Google Analytics, как получить следующую страницу данных Как настроить трансформатор данных в Symfony для повторного использования существующих объектов? PHP, если условие с булевым Вернуть первый ключ ассоциативного массива в PHP phpmailer: Ответить, используя только адрес «Ответить» Вывод исходного потока изображения, а не jpeg, изменение размера изображения Пределы использования API API Карт Google для каждого посетителя веб-сайта или на веб-сервере? Что такое пространство имен и как оно реализовано в PHP?

Yii2: проверка в форме с двумя экземплярами одной модели

У меня есть модель бронирования с поля 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 в параметрах поля . Читайте о свойствах селекторов