CRangeValidator баг или фича

Уже исправленные репорты или принятые предложения
Закрыто
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

CRangeValidator баг или фича

Сообщение 6pblcb »

Есть првило валидации:

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

array('attribute', 'in', 'allowEmpty'=>false, 'range' => array(0,1,7,13), 'enableClientValidation' => false),
 
Если из формы получаем: то правило валидации отрабатывает без ошибок.

Отсюда и вопрос: верно ли поведение валидатора?
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: CRangeValidator баг или фича

Сообщение anton44eg »

подозреваю, что приведением типов из '' получается 0
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: CRangeValidator баг или фича

Сообщение Nafania »

Верно, потому что используется in_array, а у него не строгая проверка по умолчанию, соотв. '' == 0.
Используйте strict
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: CRangeValidator баг или фича

Сообщение 6pblcb »

strict не совсем работает)
Пустое значение теперь невалидно (отрабатывает верно), зато "ноль" в контексте формы мы получаем значение и это опять невалидно.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: CRangeValidator баг или фича

Сообщение Nafania »

Верно, делайте приведение к типу жесткое. геттер и сеттер на этот атрибут. Тут или или.
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: CRangeValidator баг или фича

Сообщение 6pblcb »

Спасибо. Как работает этот валидатор я разобрался ещё до того как писать на форум.
Для некоторых случаев более простым решением будет, обернуть 0 в кавычки:

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

array('attribute', 'in', 'allowEmpty'=>false, 'range' => array('0',1,7,13), 'enableClientValidation' => false),
 
Но вот если требуется большой диапазон, 'range' => range(-100, 500).....
Мне недает покоя 'alllowEmpty'=>false. Ведь этот пораметр по идее и должен исключать ситуацию пустого значения. Эдакий такой микс range и required. В коде валидатора как раз на первом месте стоит проверка на empty, но вот она имеен обратный смысл т.е. проверка больше "на валидность без ошибки".

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

$value=$object->$attribute;
if($this->allowEmpty && $this->isEmpty($value))
    return;
... дальше проверка на range...
По моему логично если 'allowEmpty'=>false, проверить сначала на empty и если невалидно, то выдать ошибку.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
AlexSimp
Сообщения: 568
Зарегистрирован: 2013.04.09, 11:30
Откуда: Киев

Re: CRangeValidator баг или фича

Сообщение AlexSimp »

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

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

'range' => array('','a','b','c')
 
Это ведь вполне реальная ситуация, например при использовании группы чекбоксов.

allowEmpty по логике предназначен для проверки отсутствия аттрибута как такового, а проверка пустоты переданного значения -- это уже дополнительная плюшка, именно поэтому в коде все так и происходит (ИМХО)
Жду, когда на форуме появятся вопросы "как сделать сайт на Yii?" и "как сложить два числа с помощью Yii?"...
alekso
Сообщения: 190
Зарегистрирован: 2012.09.15, 23:49

Re: CRangeValidator баг или фича

Сообщение alekso »

может быстрей и легче свой валидатор написать?
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: CRangeValidator баг или фича

Сообщение 6pblcb »

allowEmpty по логике предназначен для проверки отсутствия аттрибута как такового...
Не совсем понял, что Вы имеете в виду =\
может быстрей и легче свой валидатор написать?
В этом вопрос вообще не стоит ;) Мне просто интересно услышать "чужое" мнение по логике работы этого валидатора.

Ещё чуть-чуть мыслей:)
Исходя из описания параметра из allowEmpty

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

whether the attribute value can be null or empty. Defaults to true, meaning that if the attribute is empty, it is considered valid. 
и логики работы функции isEmpty и её описания

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

/**
     * Checks if the given value is empty.
     * A value is considered empty if it is null, an empty array, or the trimmed result is an empty string.
     * Note that this method is different from PHP empty(). It will return false when the value is 0.
     * @param mixed $value the value to be checked
     * @param boolean $trim whether to perform trimming before checking if the string is empty. Defaults to false.
     * @return boolean whether the value is empty
     */
    protected function isEmpty($value,$trim=false)
    {
        return $value===null || $value===array() || $value==='' || $trim && is_scalar($value) && trim($value)==='';
    }
думаю такой код для validateAttribute имеет место быть:

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

protected function validateAttribute($object,$attribute)
{
$value=$object->$attribute;
if($this->isEmpty($value))
{
    if(!$this->allowEmpty)
    {
        $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} cannot be blank.');
        $this->addError($object,$attribute,$message);
    }
    return;
}
...etc...
update:
Кстати clientValidateAttribute на сколько я понимаю работает корректно т.е. value = '' невалидно.
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CRangeValidator баг или фича

Сообщение samdark »

Очень похоже на баг.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CRangeValidator баг или фича

Сообщение samdark »

https://github.com/yiisoft/yii/pull/2554 пока только тесты. На тему фикса не уверен.
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CRangeValidator баг или фича

Сообщение samdark »

Фикснуто, код пока можно посмотреть в diff реквеста. Замечания приветствуются.
6pblcb
Сообщения: 71
Зарегистрирован: 2012.03.02, 11:24
Откуда: Omsk

Re: CRangeValidator баг или фича

Сообщение 6pblcb »

Неожиданно) Очень оперативно, спасибо)
YII2?, начинаю продолжать заканчивать делать. I'm gonna go build my own php-framework, with blackjack and hookers. In fact, forget the php-framework!
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CRangeValidator баг или фича

Сообщение samdark »

Намёржили. Будет в 1.1.14.
Закрыто