У меня есть переключатель с двумя значениями, т.е. «Индивидуальный» и «Фирма». Я ищу один сценарий, в котором, если выбран переключатель, имеющий значение «Фирма», то « CompanyName
textinput» должно действовать как обязательное (обязательное) поле. И, когда выбран переключатель, имеющий значение Individual, тогда TextNumber CompanyName
должен действовать как необязательное поле.
Я не понимал, как это сделать. Я попытался добавить addAttribute в messageNumber CompanyName как обязательный. но это не сработало, поскольку у RegisterForm.php
(model) указано несколько правил.
Итак, любая идея, как это сделать. Я не понимаю. Любая помощь ?
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'], ]; }
Прежде всего, наличие какой-либо проверки переднего конца – это BAD, так как я могу обойти его, создавая сообщение программно, и он сохранит запись без каких-либо проблем, делая реальную возможность появления несогласованных записей.
Вместо этого вы должны создать пользовательскую функцию правила проверки в своей модели, а также добавить правило в массив проверки:
<?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() ?>
Надеюсь, это поможет вам
Edit: поскольку я привык работать с 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'; }"],