Почему не выполняются некоторые пользовотельские валидаторы?

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Почему не выполняются некоторые пользовотельские валидаторы?

Сообщение webgrig »

У меня в модели есть несколько пользовательских валидаторов:

Код: Выделить всё

public function rules()
{
    return [
        [['access', 'active', 'published'], 'integer'],
        [['about'], 'string'],
        ...
        ...
        ...
        ...
        ...
        ...
        ...
        [['about'], 'checkEmpty'],
        [['published'], 'checkConditionsPublished'],
        [['access'], 'checkConditionsAccess'],
        [['active'], 'checkConditionsActive'],
    ];
}
public function checkConditionsAccess($attribute){ //echo 'access'; exit;
    if (Yii::$app->user->identity->access != 1){
        if ($this->$attribute != $this->getOldAttribute($attribute)){
            $this->addError($attribute, 'Permission denied! You can\'t change your access!');
        }
    }
    elseif ($this->access == 1){
        if ($this->published == ''){
            $this->addError($attribute, 'To set user  as "Admin" or "Writer" first you must set field "Published"!');
        }
    }
}
public function checkConditionsActive($attribute){ //echo 'active'; exit;
    if (Yii::$app->user->identity->access != 1){
        if ($this->$attribute != $this->getOldAttribute($attribute)){
            $this->addError($attribute, 'Permission denied! You can\'t change your activities!');
        }
    }
    elseif ($this->active == 1){
        if ($this->access == 1 || $this->access == 2) {
            if (!$this->photo){
                $this->addError($attribute, 'To activate user first you must upload avatar!');
            }
        }
        if (!$this->access) {
            $this->addError($attribute, 'To activate user first you must set access!');
        }
    }
}

public function checkConditionsPublished($attribute){//echo 'published'; exit;
    if (Yii::$app->user->identity->access != 1){
        if ($this->$attribute != $this->getOldAttribute($attribute)){
            $this->addError($attribute, 'Permission denied! You can\'t set this field!');
        }
    }
    if ($this->$attribute == 1) {
        if (!$this->photo) {
            $this->addError($attribute, 'To set user as published author first you must upload avatar!');
        }
        if ($this->access == 3) {
            $this->addError($attribute, 'To set user as published author first you must set access as "Admin" or "Writer"');
        }
    }
}
public function checkEmpty($attribute){// echo 'checkEmpty'; exit;
    if (!$this->isNewRecord) {
        if (!$this->$attribute)
        $this->addError($attribute, 'About cen not be blank!');
    }
}
Я заметил, что некоторый валидаоры не срабатывают (например последний валидатор checkEmpty), а некоторые срабатывают как то странно, под оним пользователем (не админом), вообще не скабатываю ни какие валидаторы, а под админом срабатывают но опять же не все?

Как это решить, что я делаю не так?
Последний раз редактировалось webgrig 2018.06.22, 22:30, всего редактировалось 2 раза.
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение webgrig »

I'm sorry но или я не понимаю ваш ответ, или вы просто не поняли мой вопрос. Я не просил рассказать мне как делается валидациия на стороне клиента, мне нужно понять почему мои валидаторы не срабатывают, тем более, что я их реализовал в точности так как описано в материале на который вы дали ссылку.
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение webgrig »

Еще я заметил, что валидатор не срабатывает, именно тогда когда в форме приходит пустая строка для этого поля.
Подскажите пожалуйста в чем может быть проблема.
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение andku83 »

Ну для начала, вы никоим образом не указываете клиентскую валидацию.
По поводу прохождения пустых данных читайте примечания до и после ссылки
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение webgrig »

Спасибо сем, вопрос решился добавдением некотрых парамертов, в правилах валидации.
например:

Код: Выделить всё

['about', 'checkEmpty', 'skipOnEmpty' => false, 'skipOnError' => false],
['published', 'checkConditionsPublished', 'skipOnEmpty' => false, 'skipOnError' => false],
['access', 'checkConditionsAccess', 'skipOnEmpty' => false, 'skipOnError' => false],
['active', 'checkConditionsActive', 'skipOnEmpty' => false, 'skipOnError' => false],
параметры 'skipOnEmpty' и 'skipOnError' очень красноречивы и их название говорит само за себя.
Последний раз редактировалось webgrig 2018.06.23, 11:35, всего редактировалось 1 раз.
urichalex
Сообщения: 994
Зарегистрирован: 2015.08.07, 11:03

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение urichalex »

Это не решение.
Свои валидаторы, которые вы написали на стороне сервера, никак не будут работать на стороне клиента
skipOnError - означает, что пропустить валидацию при ошибке
webgrig
Сообщения: 163
Зарегистрирован: 2015.10.29, 21:34

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение webgrig »

urichalex писал(а): 2018.06.22, 21:00 Это не решение.
Свои валидаторы, которые вы написали на стороне сервера, никак не будут работать на стороне клиента
skipOnError - означает, что пропустить валидацию при ошибке
Ну не нужна мне клиентская валидация!!!
а по поводу skipOnError, то этому параметру нужно задаль значение false и тогда не будут пропускаться валидация!
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Почему не выполняются некоторые пользовотельские вадидаторы?

Сообщение andku83 »

webgrig писал(а): 2018.06.22, 21:03 а по поводу skipOnError, то этому параметру нужно задаль значение false и тогда не будут пропускаться валидация!
не совсем так, в вашем случае (при наличии только одного валидатора для атрибута) этот парамерт не имеет значения
Ответить