Yii2: автономная проверка не запускает проверку клиента - PullRequest
0 голосов
/ 16 февраля 2019

Функции проверки не работают.Таможенные правила проверки не применяются к полю usernmane

module dektrium/user
PHP 7.1
Yii 2.0.16

Уже попробуйте все здесь: https://www.yiiframework.com/doc/guide/2.0/en/input-validation (встроенные валидаторы и автономные валидаторы)

Модельный агент:

class Agent extends Profile
{
    public $username;
    public $password;
    public $password2;

    public function rules()
    {
        $rules = [
            ['username', AgentValidator::className()],// it's not work
            [['email'], 'email'], // it's work
            ['password2', 'compare', 'compareAttribute' => 'password', 'message' => 'Пароли должны совпадать'],//// it's work
        ];
        return array_merge(parent::rules(), $rules);
    }

}

AgentValidator.php

<?php
namespace app\components;
use yii\validators\Validator;

class AgentValidator extends  Validator
{
    public function validateAttribute($model, $attribute)
    {
      if (User::findOne(['username' => $this->$attribute]]) {
            $this->addError($attribute, 'Такой логин уже занят');

        }
    }
}

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Вы используете автономный валидатор и хотите, чтобы валидация внешнего интерфейса работала вместе с бэкэндом, поэтому вам нужно переопределить 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;
    }
}
0 голосов
/ 17 февраля 2019

Итак, спасибо Мухаммеду Омеру Асламу за правильный ответ.Yii2 не генерирует js-код для проверки по пользовательским правилам.Поэтому необходимо добавить чек к контроллеру и форму Для меня это: Контроллер

  if (\Yii::$app->request->isAjax) {
            \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;

            $model->load(\Yii::$app->request->post());
            return \yii\widgets\ActiveForm::validate($model);
        }

Форма

$form = ActiveForm::begin([ 'enableAjaxValidation' => true]); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...