Textfield Mandatory 基于单选按钮选择- Yii2

Textfield Mandatory On basis of radio button selection- Yii2

我有两个值的单选按钮,即个人和公司。 我正在寻找一种情况,如果选择了具有 Firm 值的单选按钮,则 CompanyName textinput 应充当强制(必填)字段。 And, when radio button having value Individual is selected, Then CompanyName textinput should act as Optional field.

我不知道该怎么做。我试图在 CompanyName textinput 中添加 addAttribute 作为强制性的。但它没有起作用,因为 RegisterForm.php(模型)指定的规则很少。

所以,想知道如何去做。我不明白。有帮助吗?

register.php(查看)

<?php $form = ActiveForm::begin(['id' => 'register-form']); ?>
    .
    .
    .
    <?= $form->field($model, 'AdminType')
            ->radioList(array('Individual'=>'An Individual', 'Firm'=>'Firm/Company/Group of Employees'))
            ->label('Are You')?>
    <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name') ?>
    <div class="form-group">
        <?= Html::submitButton('Register', ['class' => 'btn btn-success', 'name' => 'register-button' ]) ?>
    </div>
<?php ActiveForm::end(); ?>

<script>
    $('input[type="radio"]').click(function()
    {
        if($(this).attr("value")=="Firm")
        {
            $('#registerform-companyname').addAttribute("required");
        }
    });
</script>

RegisterForm.php(型号)

<?php

namespace app\models;

use Yii;
use yii\base\Model;
use kartik\password\StrengthValidator;

class RegisterForm extends Model
{
    public $fname;
    public $lname;
    public $email;
    public $password;
    public $confirmPassword;
    public $AdminType;
    public $CompanyName;
    public $verifyCode;

    public function rules()
    {
        return [
                [['fname','lname', 'email', 'password','confirmPassword','verifyCode','AdminType'], 'required'],
                ['email', 'email'],
            ['confirmPassword', 'compare', 'compareAttribute' => 'password'], 
                ['verifyCode', 'captcha'],
        ];
    }

首先,任何类型的前端验证都是不好的,因为我可以通过编程生成 post 来规避它,它会毫无问题地保存记录,从而可能导致记录不一致一个现实。

您要做的是在模型中创建自定义验证规则函数,并将规则添加到验证数组:

<?php
namespace app\models;

use Yii;
use yii\base\Model;
use kartik\password\StrengthValidator;

class RegisterForm extends Model
{
    public $fname;
    public $lname;
    public $email;
    public $password;
    public $confirmPassword;
    public $AdminType;
    public $CompanyName;
    public $verifyCode;

    public function rules()
    {
        return [
                [['fname','lname', 'email', 'password','confirmPassword','verifyCode','AdminType'], 'required'],
                ['email', 'email'],
                ['confirmPassword', 'compare', 'compareAttribute' => 'password'], 
                ['verifyCode', 'captcha'],

                //add rule that uses the validator function
                ['AdminType','radioValidator'],
        ];
    }

    //implement the validator
    public function radioValidator($attribute, $params)
    {
        if($this->$attribute === 'Firm' && empty($this->$attribute))
            $this->addError('CompanyName', 'CompanyName cannot be blank');
    }
}
?>

现在您的字段生成代码应该如下所示

 <?= $form->field($model, 'CompanyName')->textInput()->label('Company Name')->error() ?>

希望对你有帮助

编辑:因为我习惯于使用 AR 类(通常,当使用 gii 生成时,会自动进行验证),我没有想到您只使用了一个表单模型(在基本应用程序中作为示例给出的一个)

忘记字段中的 ->error(),还要确保您有行

if ($model->load(Yii::$app->request->post()) && $model->validate()) {...}

在你的行动中

我终于明白了,

 ['company_name', 'required', 'when' => function($model){
    return ($model->user_type == 'Firm' ? true : false);
  }, 'whenClient' => "function (attribute, value) {
      return $('input[type=\"radio\"][name=\"Users[user_type]\"]:checked').val() == 'Firm';
  }"],