Получилось сделать свой валидатор, но проблемы с валидацией во время ввода данных. Если пользователь отправляет модель, то я могу проверить данные, но уже в контроллере, а как сделать так, чтобы проверка проходила во время ввода данных в форму и выдавало ошибки до отправи формы?
В моделе прописаны следущие правила
[['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(); ?>