Текстовое поле Обязательно На основе выбора переключателя - Yii2

У меня есть переключатель с двумя значениями, т. Е. Индивидуальным и Фирмам. Я ищу один сценарий, в котором, если выбран переключатель со значением Firm, то CompanyName textinput должен действовать как обязательное (обязательное) поле. И, когда выбран переключатель со значением «Индивидуальный», тогда CompanyName textinput должен действовать как необязательное поле.

Я не понимал, как это сделать. Я попытался добавить addAttribute в текстовый ввод CompanyName как обязательный. но это не сработало, поскольку для 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'],
        ];
    }

person Nana Partykar    schedule 05.10.2015    source источник


Ответы (2)


Во-первых, иметь какую-либо проверку переднего плана ПЛОХО, так как я могу обойти ее, сгенерировав сообщение программно, и это сохранит запись без каких-либо проблем, что делает возможность несогласованных записей реальностью.

Вместо этого вы хотите создать пользовательскую функцию правила проверки в своей модели, а также добавить правило в массив проверки:

<?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()) {...}

в вашем действии

person SmartCoder    schedule 05.10.2015
comment
Я тоже задал свой вопрос здесь @SmartCoder. Пожалуйста, посмотрите stackoverflow.com/questions/32969883/ по этому поводу. - person Nana Partykar; 06.10.2015
comment
Извините, что @SmartCoder. До сих пор не работает. Очень жаль. Но не работает. Целый день ушел на то, чтобы попробовать это. Но, к сожалению, все еще там, где я был вчера. - person Nana Partykar; 06.10.2015

Наконец я получил,

 ['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';
  }"],
person Nana Partykar    schedule 15.10.2015