Разные значения валидации на клиенте и на сервере в Yii?
Здравствуйте товарищи!!
Столкнулся с такой проблемой, а именно с разными значения валидации на клиенте и на сервере в YII.
Суть проблемы такова:
1. Есть правило валидации
array('desc', 'length', 'encoding' => 'utf-8', 'max' => 150, 'tooLong' => 'Комментарий не должен превышать 150 символов')
2. В textarea для данного атрибута ввожу по два символа на строку:
!d
!d
!d
и т.д
3. Ввожу больше 150 символом, появляется ошибка форма не отправляется, ввожу нужно количество символов от 150 и меньше, на клиенте валидация проходит, но не проходит на сервере
4. Знаю что проблема в символе переноса строки, а именно 150 символов с переносами строк на клиенте равны 200 символов на сервере, то есть символ переноса строки на клиенте равен 1 символу, на сервере 2
5. unix/ windows нет разницы на какой os сервер, проблема и там и там
5. Как быть?
У вас включена mbstring? Если нет, то проверка длины идет через функцию strlen, а она возвращает количество байт. Т.е. 1-н ASCII символ на клиенте будет равен 2-м байтам на сервере.
Поставил вот такой костыль:
rules:
array('desc', 'filter', 'filter' => array("FrontEndController", "prepareDesc"))
FrontEndController:
public static function prepareDesc($desc) {
return preg_replace('/([\r\n]){2,}/U',"$1",$desc);
}
Евгений Дождиков: mbstring включена, но проблема тоже не решилась, вычитал где то на форуме а простановке mbstring.internal_encoding= 'UTF-8' и mbstring.func_overload ='7', но с этими параметрами часть функционала стала выдавать ошибки,поэтому отключил его не протестировав по основной проблемме
Александр Макаров: Вы имеете ввиду короче 150 символов? Ситуация такая же, независимо от количества символов, клиент перенос строки считывает как один символ, сервер как 2 символа
Вот код который непосредственно отвечает за проверку количества символов на сервере, function_exists('mb_strlen') у меня выдает TRUE, хотя довольно странное условие в if, если $this->encoding!==false, то проверять $this->encoding ? $this->encoding : Yii::app()->charset нет смысла, но тем не менее $this->encoding у меня указано в правиле, значит отрабатывает $length=mb_strlen($value, $this->encoding ? $this->encoding : Yii::app()->charset); что и выдает неверное количество символов
evgenybuckharev: В encoding можно передать пустую строку, и тогда у вас он войдет в условие и отработает charset приложения, так что такое условие имеет право жить (но согласен, что немного бредовая).
У вас проверка на клиенте происходит через js без ajax на сервер? То тогда это просто недостаток именно этой валидации. Как раз из-за этого несчастного переноса строк. Тут только методом, который вы уже реализовали: сделать так, чтобы сервер считал перевод каретки как один символ, а не 2.
На сколько могу судить, валидатор CStringValidator подразумевался разработчиками для валидация именно строк, а не текста с переносами строк.
Евгений Дождиков: Да Вы верно сказали, что используется валидация на клиенте посредством js, без ajax, и поставив дополнительный фильтр проблема решилась, но наверняка кто либо столкнётся с аналогичной проблемой, и данный топик поможет ему