【问题标题】:Yii2: Validation in form with two instances of same modelYii2:使用相同模型的两个实例进行表单验证
【发布时间】:2015-09-17 13:49:12
【问题描述】:

我有一个模型 Booking,其中包含模型地址 shipping_address 和 billing_address 字段。 我现在想将它们打印到基本上工作得很好的相同形式,问题是两个模型的字段具有相同的 ID。例如,shipping_address 中的字段“zip”的 id 为“zip”,而 billing_address 中的“zip”的 id 也为“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',
            ]); ?>

我还更改了容器类,因为它与其他字段的容器类相同。现在第二个字段(使用如上所示的代码)运行良好。问题是,第一个字段(代码未更改)不再验证。

如何解决?

【问题讨论】:

  • 尝试为每个 zip 输入显式设置 id 属性
  • 感谢您的回答托尼。你是指哪个id?我在谈论 html 属性 id。如果我改变那个,验证就不再起作用了。
  • 你能提供一个生成这个输入的代码吗?
  • 在原问题中添加代码
  • 为什么要设置'name'和'id'? Yii 会自动执行此操作(即 = $form->field($model_variable, 'test')->textInput(); ?> 将是 。别管它,问题一定出在你的控制器上。

标签: php validation activerecord yii yii2


【解决方案1】:

因为您使用一个模型类在一个页面上生成两组输入,yii2 为它们生成相同的 clientValidation 规则。要分离验证,您需要为每个需要手动验证的输入设置 id 属性。对于您的 zip 输入字段,下一个解决方案将是 (根据最新的 cmets 进行编辑)

//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 选项中添加了自定义 id 属性,并在 field 选项中设置了相应的 js 验证选择器。 Read about selectors property

【讨论】:

  • 感谢您的回答,我用当前代码更新了问题。现在第二个字段(使用问题中显示的代码)运行良好。问题是,第一个字段(代码未更改)不再验证。我错过了什么吗?
  • @NthDegree 尝试为每个元素、$billing_addess 模型和 $shipping_address 模型指定 idselectors
  • 地狱是的,它有效!我现在也更改了另一个字段的选择器和 id,并且在控制器上出现了一个额外的小错误,设置了错误的场景。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-23
相关资源
最近更新 更多