CStringValidator

Выкладываем свои наработки
Ответить
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

CStringValidator

Сообщение Ekstazi »

Заметил ошибку в CStringValidator. Неверно подсчитывается длина строки.(не учитывается кодировка utf-8). К сожалению, английским не владею на уровне общения, вот и выкладываю здесь. Решается очень просто. Заменой:

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

    protected function validateAttribute($object,$attribute)
    {
        $value=$object->$attribute;
        if($this->allowEmpty && ($value===null || $value===''))
            return;
        $length=strlen($value);
        if($this->min!==null && $length<$this->min)
        {
            $message=$this->tooShort!==null?$this->tooShort:Yii::t('yii','{attribute} is too short (minimum is {min} characters).');
            $this->addError($object,$attribute,$message,array('{min}'=>$this->min));
        }
        if($this->max!==null && $length>$this->max)
        {
            $message=$this->tooLong!==null?$this->tooLong:Yii::t('yii','{attribute} is too long (maximum is {max} characters).');
            $this->addError($object,$attribute,$message,array('{max}'=>$this->max));
        }
        if($this->is!==null && $length!==$this->is)
        {
            $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} is of the wrong length (should be {length} characters).');
            $this->addError($object,$attribute,$message,array('{length}'=>$this->is));
        }
    }
 
в CStringValidate на:

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

    protected function validateAttribute($object,$attribute)
    {
        $value=$object->$attribute;
        if($this->allowEmpty && ($value===null || $value===''))
            return;
//Как вариант, использовать $length=strlen(utf8_decode($value));
        $length=mb_strlen($value);
        if($this->min!==null && $length<$this->min)
        {
            $message=$this->tooShort!==null?$this->tooShort:Yii::t('yii','{attribute} is too short (minimum is {min} characters).');
            $this->addError($object,$attribute,$message,array('{min}'=>$this->min));
        }
        if($this->max!==null && $length>$this->max)
        {
            $message=$this->tooLong!==null?$this->tooLong:Yii::t('yii','{attribute} is too long (maximum is {max} characters).');
            $this->addError($object,$attribute,$message,array('{max}'=>$this->max));
        }
        if($this->is!==null && $length!==$this->is)
        {
            $message=$this->message!==null?$this->message:Yii::t('yii','{attribute} is of the wrong length (should be {length} characters).');
            $this->addError($object,$attribute,$message,array('{length}'=>$this->is));
        }
    }
 
Аватара пользователя
samdark
Администратор
Сообщения: 9489
Зарегистрирован: 2009.04.02, 13:46
Откуда: Воронеж
Контактная информация:

Re: CStringValidator

Сообщение samdark »

Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CStringValidator

Сообщение Ekstazi »

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

Re: CStringValidator

Сообщение samdark »

Тут вообще есть нормальное решение — сделать свой MultibyteStringValidator и использовать его вместо стандартного.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CStringValidator

Сообщение Ekstazi »

Понял уже :)
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: CStringValidator

Сообщение Ekstazi »

Кстати уже давно как найдено решение ) параметр encoding у CStringValidator
Ответить