@Ann2016

Как реализовать работу своего валидатора в форме?

Получилось сделать свой валидатор, но проблемы с валидацией во время ввода данных. Если пользователь отправляет модель, то я могу проверить данные, но уже в контроллере, а как сделать так, чтобы проверка проходила во время ввода данных в форму и выдавало ошибки до отправи формы?

В моделе прописаны следущие правила
[['phone'], PhoneValidator::className()],
            [['phone', 'mail', 'name', 'country'], 'required'],

Компонент отвечающий за валидацию
namespace frontend\components;

use yii\validators\Validator;
use \libphonenumber\PhoneNumberUtil;

class PhoneValidator extends Validator
{
    public function validateAttribute($model, $attribute)
    {
        $phoneUtil = PhoneNumberUtil::getInstance();
        try {
            $swissNumberProto = $phoneUtil->parse($model->$attribute, $model->country);
            $numberExample = $phoneUtil->getExampleNumberForType($model->country, \libphonenumber\PhoneNumberType::MOBILE);

            if (!$phoneUtil->isValidNumber($swissNumberProto)) {
                $model->addError($attribute, ('Input phone is wrong. Example of inputting is {numberExample}' ));
            } else {
                $model->$attribute = $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::INTERNATIONAL);
            }
        } catch (\libphonenumber\NumberParseException $e) {
            $model->addError($attribute,  'Input phone is wrong');
        }
    }
}

И собственно форма

<?php $form = ActiveForm::begin(['action' => ['main/create']]); ?>
            <?= $form->field($model, 'country')->dropDownList($contries) ?>
            <?= $form->field($model, 'phone')->textInput() ?>
<?php ActiveForm::end(); ?>
  • Вопрос задан
  • 297 просмотров
Решения вопроса 1
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы