Вы используете автономный валидатор и хотите, чтобы валидация внешнего интерфейса работала вместе с бэкэндом, поэтому вам нужно переопределить yii\validators\Validator::clientValidateAttribute()
в вашем автономном валидаторе AgentValidator
, который возвращает фрагмент JavaScriptкод, который выполняет проверку на стороне клиента.
В коде JavaScript вы можете использовать следующие предопределенные переменные:
attribute
: имя проверяемого атрибута. value
:проверяемое значение. messages
: массив, используемый для хранения сообщений об ошибках валидации для атрибута. deferred
: массив, в который можно помещать отложенные объекты.
Вы можете просмотреть раздел Реализация проверки клиента , чтобы прочитать подробно.
Помимо всего перечисленного выше, в коде вашего валидатора есть ошибка User::findOne(['username' => $this->$attribute]]
, вам нужно использовать $model->$attribute
вместо $this->$attribute
, который никогда не получит точное значение, введенное в форму.Возможно, вы ошибочно добавили его из модели.
Ваш текущий валидатор должен выглядеть примерно так:
<?php
namespace app\components;
use yii\validators\Validator;
class AgentValidator extends Validator
{
public $message='Такой логин уже занят';
public function validateAttribute($model, $attribute)
{
if (User::findOne(['username' => $model->$attribute])!==null)
{
$model->addError($attribute, $this->message);
}
}
public function clientValidateAttribute($model, $attribute, $view) {
//check if user exists
$userExists = User::findOne(['username' => $model->$attribute])!==null;
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
return <<<JS
if($userExists){
messages.push($message);
return;
}
JS;
}
}